Что такое код shell_exec

Содержание

Может ли shell_exec запустить мой код машинного обучения? Он отлично работает на терминале, но возвращает значение NULL в shell_exec

У меня есть сценарий Python, который работает нейронных сетей на основе керас, он работает нормально, но когда я использую для запуска этого сценария через shell_exec в моем php и использовать var_dump, я получаю «NULL».

Я уже видел много решений. Я увеличил max_execution_time и max_input в php.ini до 5000. Я также даю полный путь к файлам и требуемую среду в команде. Также я дал все разрешения для папок (lampp, htdocs, (моя папка php файла)). Это команда, которая наконец-то вызывается в shell_exec.

fyp_final.py, train.csv, test.csv все существует в той же папке, что и файл php. Я выполнил ту же самую команду через терминал в режиме root, и она прошла без ошибок. Но в приведенном ниже php-коде он возвращает NULL.

Пожалуйста, помогите мне. Если я делаю что-то не так или возможно запустить код машинного обучения из php, так как я пробовал запускать небольшие коды, они отлично работают.

Я понял. Я решил это, поместив свой код в сценарий оболочки, а затем выполнив этот сценарий через shell_exec . Теперь работает нормально.

shell exec — многострочный ввод PHP из shell_exec не работает должным образом

У меня есть следующий пост PHP из HTML

Выход из mvsce -d 1234-56-78 -l 1 -s 1 команда отображается из bash следующим образом

Код ниже только когда-либо выводит 2-ю строку PCXLA-TAACC

Как я могу получить код для отображения обеих строк в окнах браузера?

HTML-код, который я использую для публикации на PHP

Решение

Как я могу получить код для отображения обеих строк в окне браузера?

Краткий ответ: Вы должны отобразить минимальную HTML-страницу и отформатировать вывод в соответствии с HTML.

Пусть твой сценарий makevsce.php начать отправку клиента минимальная HTML-страница с теломоткрыть«:

Пусть PHP правильно экранирует аргументы вводится в строку, передаваемую в оболочку.

использование exec вместо shell_exec

$mvse (передается по ссылке) получит массив, содержащий все строки, отправленные в качестве вывода из вызванной команды.

В то время как (необязательный) параметр $return_value содержит возвращаемое значение команды оболочки.

Чтобы отобразить вывод:

Обратите внимание, что до печати каждой строки выходного текста правильно экранируется HTML, поскольку вы говорите об отображении вывода в браузере.

В конце каждой строки
будет интерпретироваться браузером как разрыв строки.

Наконец, чтобы закрыть страницу HTML:

Уведомление о безопасности:

Имейте в виду, что вы выполняете через оболочку команду, созданную с помощью ввода из клиент.

Правильно подделанный запрос может вызвать выполнение произвольной команды с теми же привилегиями, что и во время выполнения PHP.

Другие решения

Это не проблема с кодом PHP.

Если я записываю вывод команды на что-либо, кроме консоли, она записывает только вторую строку.

shell_exec

(PHP 4, PHP 5, PHP 7)

shell_exec — Выполняет команду через шелл и возвращает полный вывод в виде строки

Описание

Эта функция идентична оператору обратный апостроф.

Список параметров

Команда, которая будет выполнена.

Возвращаемые значения

Вывод исполняемой команды или NULL , если произошла ошибка или команда ничего не вывела.

Эта функция может вернуть NULL и в случае ошибки и в случае, если программа ничего не вывела. Нельзя определить неудачный запуск с помощью этой функции. Если требуется получить код завершения программы используйте exec() .

Примеры

Пример #1 Пример использования shell_exec()

Что такое код shell_exec

Профиль
Группа: Участник
Сообщений: 31
Регистрация: 10.1.2007

Репутация: нет
Всего: нет

Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18

скорее всего вам отключение этой функции не помешает

возможно не сможете, например, работать с архивами для которых нет встроенной поддержки в php

Это сообщение отредактировал(а) Glip — 27.4.2007, 21:19

Glip
Дата 27.4.2007, 21:18 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 678
Регистрация: 18.6.2004

Репутация: нет
Всего: 5

Goganchic
Дата 28.4.2007, 09:14 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4

CyClon
Дата 28.4.2007, 12:46 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 31
Регистрация: 10.1.2007

Репутация: нет
Всего: нет

popo
Дата 28.4.2007, 12:55 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 7
Всего: 18

Glip
Дата 28.4.2007, 15:14 (ссылка) | (нет голосов) Загрузка .
Цитата(popo @ 28.4.2007, 12:55 )
Т.е. если shell_exec будет отключен то я не смогу использовать ls,id и т.д. ?

Профиль
Группа: Участник
Сообщений: 31
Регистрация: 10.1.2007

Репутация: нет
Всего: нет

popo
Дата 29.4.2007, 23:00 (ссылка) | (нет голосов) Загрузка .
Цитата(Glip @ 28.4.2007, 15:14)
Цитата(popo @ 28.4.2007, 12:55 )
Т.е. если shell_exec будет отключен то я не смогу использовать ls,id и т.д. ?

не сможете. а зачем? очень много всего реализовано средствами php
http://ru.php.net/manual/en/ref.posix.php
http://ru.php.net/manual/en/ref.dir.php

Профиль
Группа: Участник
Сообщений: 31
Регистрация: 10.1.2007

Репутация: нет
Всего: нет

popo
Дата 3.5.2007, 23:06 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 3
Всего: 4

CyClon
Дата 4.5.2007, 14:37 (ссылка) | (нет голосов) Загрузка .
Цитата
Вывод, отключение данной функции может отпугнуть негодяев?

Не только этой. Еще есть exec, system, popen и др.

Чтобы отпугнуть негодяет лучше всего включать Safe Mode, все эти функции будут недоступны + не будет работать set_time_limit (чтобы негодяи демонов не запускали).

Google
Дата 13.11.2020, 15:02 (ссылка)
  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET
  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь
  • Темы «ищу скрипт», «подскажите скрипт» и т.п. будут переноситься в форум «Web-технологии»
  • Темы с именами: «Срочно», «помогите», «не знаю как делать» будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

Unix shell: абсолютно первые шаги

Зачем и для кого статья?

Изначально это была памятка для студентов, которые начинают работать с unix-подобными системами. Иными словами, статья рассчитана на тех, кто не имеет предыдущего опыта работы в unix-овой командной строке, но по тем или иным причинам хочет или должен научиться эффективно с нею взаимодействовать.

Здесь не будет пересказа манов (документации), и статья никак не отменяет и не заменяет их чтение. Вместо этого я расскажу о главных вещах (командах, приемах и принципах), которые надо осознать с самого начала работы в unix shell-е, чтобы работа происходила эффективно и приятно.

Статья касается полноценных unix-подобных окружений, с полнофункциональным шеллом (предпочтительно zsh или bash)и достаточно широким набором стандартных программ.

Что такое шелл

Shell (шелл, он же «командная строка», он же CLI, он же «консоль», он же «терминал», он же «черное окошко с белыми буковками») — это текстовый интерфейс общения с операционной системой (ну, строго говря, это программа, которая таковой интерфейс обеспечивает, но сейчас это различие несущественно).

В целом работа через шелл выглядит так: пользователь (т.е. вы) с клавиатуры вводит команду, нажимает Enter, система выполняет команду, пишет на экран результат выполнения, и снова ожидает ввода следующей команды.

Типичный вид шелла:

Шелл — это основной способ для взаимодействия со всеми Unix-подобными серверными системами.

Где встречаются системы с командной строкой?

Где вас может поджидать unix-овый шелл, популярные варианты:

  • MacOS (bash);
  • удаленный доступ на сервер по работе или для личного веб-проекта;
  • домашний файл-сервер с удаленным доступом;
  • Ubuntu, PC-BSD на ноутбуке/десктопе — unix-подобные системы сегодня просты в установке и использовании.

Какие задачи разумно решать шеллом?

Естественные задачи, для которых шелл пригоден, полезен и незаменим:

  • интерактивная работа в терминале:
    • выполнение компиляции, запуск заданий через make;
    • сравнение текстовых файлов;
    • быстрый ad-hoc анализ данных (количество уникальных ip в логе, распределение записей по часам/минутам и т.п.);
    • разовые массовые действия (прибить много процессов; если работаете с системой контроля версий — ревертнуть или зарезолвить кучу файлов);
    • диагностика происходящего в системе (семафоры, локи, процессы, дескрипторы, место на диске и т.п.);
  • скриптование:
    • установочные скрипты, для выполнения которых нельзя рассчитывать на наличие других интерпретаторов — это не для новичков;
    • функции для кастомизации интерактивного шелла (влияющие на приглашение, меняющие каталог, устанавливающие переменные окружения) — тоже не совсем для новичков;
    • одноразовые скрипты типа массового перекодирования файлов;
    • makefile-ы.

Абсолютно первые шаги

Начинаем работу: войти и выйти

Убедитесь, что точно знаете, как запустить шелл и как из него выйти.

Если вы работаете за машиной, на которой установлена Ubuntu, вам надо запустить программу Terminal. По окончании работы можно просто закрыть окно.

На MacOS — тоже запустить Terminal.

Для доступа к удаленному серверу — воспользоваться ssh (если локально у вас MacOS, Ubuntu или другая unix-like система) или putty (если у вас Windows).

Кто я, где я?

Выполните следующие команды:

  • hostname — выводит имя машины (сервера), на которой вы сейчас находитесь;
  • whoami — выводит ваш логин (ваше имя в системе);
  • tree -d / |less — псевдографическое изображение дерева каталогов на машине; выход из пролистывания — q ;
  • pwd — выводит каталог, в котором вы сейчас находитесь; в командной строке вы не можете быть «просто так», вы обязательно находитесь в каком-то каталоге (=текущий каталог, рабочий каталог). Вероятно, текущий рабочий каталог выводится у вас в приглашении (prompt).
  • ls — список файлов в текущем каталоге; ls /home — список файлов в указанном каталоге;

История команд (history)

Важное свойство полноценной командной строки — история команд.

Выполните несколько команд: hostname , ls , pwd , whoami . Теперь нажмите клавишу «вверх». В строке ввода появилась предыдущая команда. Клавишами «вверх» и «вниз» можно перемещаться вперед и назад по истории. Когда долистаете до hostname , нажмите Enter — команда выполнится еще раз.

Команды из истории можно не просто выполнять повторно, а еще и редактировать. Долистайте историю до команды ls , добавьте к ней ключ -l (получилось ls -l , перед минусом пробел есть, а после — нет). Нажмите Enter — выполнится модифицированная команда.

Пролистывание истории, редактирование и повторное выполнение команд — самые типичные действия при работе в командной строке, привыкайте.

Copy-paste

Командная строка очень текстоцентрична: команды — это текст, входные данные для большинства стандартных программ — текст, результат работы — чаще всего тоже текст.

Прекрасной особенностью текста является то, что его можно копировать и вставлять, это верно и для командной строки.

Попробуйте выполнить команду date +»%y-%m-%d, %A»
Вводили ли вы ее целиком руками или скопировали из статьи? Убедитесь, что вы можете ее скопировать, вставить в терминал и выполнить.

После того, как научитесь пользоваться man ‘ом, убедитесь, что можете скопировать и выполнить примеры команд из справки. Для проверки найдите в справке по программе date раздел EXAMPLES , скопируйте и выполните первый приведенный пример (на всякий случай: знак доллара не является частью команды, это условное изображение приглашения к вводу).

Как именно копировать текст из терминала и вставлять его в терминал — зависит от вашей системы и от ее настроек, поэтому дать универсальную инструкцию, к сожалению, не получится. На Ubuntu попробуйте так: копирование — просто выделение мышью, вставка — средняя кнопка мыши. Если не работает, или если у вас другая система — поищите в Интернете или спросите более опытных знакомых.

Ключи и опции

При исследовании истории команд вы уже столкнулись с тем, что у команды ls есть по крайней мере два варианта. Если вызвать ее просто так, она выводит простой список:

Если же добавить ключ -l , к каждому файлу выводится подробная информация:

Это очень типичная ситуация: если к вызову команды добавлять специальные модификаторы (ключи, опции, параметры), поведение команды меняется. Сравните: tree / и tree -d / , hostname и hostname -f .

Кроме того, команды могут принимать в качестве параметров имена файлов, каталогов или просто текстовые строки. Попробуйте:

man — справка по командам и программам, доступным на вашей машине, а также по системным вызовам и стандартной библиотеке C.

Попробуйте: man grep , man atoi , man chdir , man man .

Пролистывание вперед и назад делается кнопками «вверх», «вниз», «PageUp», «PageDown», выход из просмотра справки — кнопкой q . Поиск определенного текста в справочной статье: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям — клавиша n .

Все справочные статьи делятся на категории. Самые важные:

  • 1 — исполняемые программы и шелльные команды ( wc , ls , pwd и т.п.);
  • 2 — системные вызовы ( fork , dup2 и т.п.)
  • 3 — библиотечные функции ( printf , scanf , cos , exec ).

Указывать, из какой именно категории надо показать справку, нужно в случаях совпадений имен. Например, man 3 printf описывает функцию из стандартной библиотеки C, а man 1 printf — консольную программу с таким же именем.

Посмотреть список всех доступных на машине справочных статей можно с помощью команды man -k . (точка — тоже часть комады).

Когда в небольшом окне терминала надо просмотреть очень длинный текст (содержимое какого-то файла, длинный man и т.п.), используют специальные программы-«пейджеры» (от слова page/страница, то есть постраничные листатели). Самый популярный листатель — less , и именно он обеспечивает вам пролистывание, когда вы читаете man-ы.

Попробуйте и сравните поведение:

Можно передать файл в пролистыватель сразу в параметрах:

Пролистывание вверхи и вниз — кнопки «вверх», «вниз», «PageUp», «PageDown», выход — кнопка q . Поиск определенного текста: нажимите / (прямой слеш), введите текст для поиска, нажимите Enter. Перемещение к следующим вхождениям — клавиша n . (Узнаете инструкцию про man ? Ничего удивительного, для вывода справки тоже используется less .)

Права

С любым файлом или каталогом связан набор «прав»: право на чтение файла, право на запись в файл, право исполнять файл. Все пользователи делятся на три категории: владелец файла, группа владельца файла, все прочие пользователи.

Посмотреть права на файл можно с помощью ls -l . Например:

Этот вывод означает, что владельцу (akira) можно читать и писать файл, группе (students) — только читать, всем прочим пользователя — тоже только читать.

Если при работе вы получаете сообщение permission denied , это значит, что у вас недостаточно правна объект, с которым вы хотели работать.

Подробнее читайте в man chmod .

STDIN, STDOUT, конвейеры (пайпы)

С каждой исполняющейся программой связаны 3 стандартных потока данных: поток входных данных STDIN , поток выходных данных STDOUT , поток для вывода ошибок STDERR .

Запустите программу wc , введите текст Good day today , нажмите Enter, введтие текст good day , нажмите Enter, нажмите Ctrl+d. Программа wc покажет статистику по количеству букв, слов и строк в вашем тексте и завершится:

В данном случае вы подали в STDIN программы двухстрочный текст, а в STDOUT получили три числа.

Теперь запустите команду head -n3 /etc/passwd , должно получиться примерно так:

В этом случае программа head ничего не читала из STDIN , а в STDOUT написала три строки.

Можно представить себе так: программа — это труба, в которую втекает STDIN , а вытекает STDOUT .

Важнейшее свойство юниксовой командной строки состоит в том, что программы-«трубы» можно соединять между собой: выход ( STDOUT ) одной программы передавать в качестве входных данных ( STDIN ) другой программе.

Такая конструкция из соединенных программ называется по-английски pipe (труба), по-русски — конвейер или пайп.

Объединение программ в конвейер делается символом | (вертикальная черта)

Выполните команду head -n3 /etc/passwd |wc , получится примерно следующее:

Произошло вот что: программа head выдала в STDOUT три строки текста, которые сразу же попали на вход программе wc , которая в свою очередь подсчитала количество символов, слов и строк в полученном тексте.

В конвейер можно объединять сколько угодно программ. Например, можно добавить к предыдущему конвейеру еще одну программу wc , которая подсчитает, сколько слов и букв было в выводе первой wc :

Составление конвейеров (пайпов) — очень частое дело при работе в командной строке. Пример того, как это делается на практике, читайте в разделе «Составление конвейера-однострочника».

Перенаправление ввода-вывода

Вывод ( STDOUT ) програмы можно не только передать другой программе по конвейеру, но и просто записать в файл. Такое перенаправление делается с помощью > (знак «больше»):

В результате выполнения этой команды на диске появится файл /tmp/today.txt . Посмотрите его содержимое с помощью cat /tmp/today.txt

Если файл с таким именем уже существовал, его старое содержимое будет уничтожено. Если файл не существовал, он будет создан. Каталог, в котором создается файл, должен существовать до выполнения команды.

Если надо не перезаписать файл, а добавить вывод в его конец, используйте >> :

Проверьте, что теперь записано в файле.

Кроме того, программе можно вместо STDIN передать любой файл. Попробуйте:

Что делать, когда что-то непонятно

Если вы сталкиваетесь с поведением системы, которое не понимаете, или хотите добиться определенного результата, но не знаете, как именно, советую действовать в следующем порядке (кстати, это относится не только к шеллам):

  • насколько возможно четко сформулируйте вопрос или задачу — нет ничего сложнее, чем решать «то, не знаю что»;
  • вспомните, сталкивались ли вы уже с такой же или подобной проблемой — в этом случае стоит попробовать решение, которое сработало в прошлый раз;
  • почитайте подходящие man-ы (если понимаете, какие man-ы подходят в вашем случае) — возможно, вы найдете подходящие примеры использования команд, нужные опции или ссылки на другие команды;
  • подумайте: нельзя ли немного поменять задачу? — возможно, чуть-чуть изменив условия, вы получите задачу, которую уже умеете решать;
  • задайте свой четко сформулированный вопрос в поисковой системе — возможно, ответ найдется на Stack Overflow или других сайтах;

Если ничего из перечисленного не помогло — обратитесь за советом к преподавателю, опытному коллеге или товарищу. И не бойтесь задавать «глупые» вопросы — не стыдно не знать, стыдно не спрашивать.

Если вы разобрались со сложной проблемой (самостоятельно, с помощью Интернета или других людей) — запишите свое решение на случай, если такая же проблема снова возникнет у вас или ваших товарищей. Записывать можно в простой текстовый файл, в Evernote, публиковать в соц.сетях.

Методы работы

Скопировать-и-вставить — из man-ов, из статей на StackOverflow и т.п.Командная строка состоит из текста, пользуйтесь этим: копируйте и используйте примеры команд,записывайте удачные находки на память, публикуйте их в твиттерах и блогах.

Читать man. Nuff said.

Вытащить из истории предыдущую команду, добавить в конвейер еще одну команду, запустить, повторить.См. также раздел «Составление конвейера-однострочника».

Базовые команды

  • переход в другой каталог: cd ;
  • просмотр содержимого файлов: саt , less , head , tail ;
  • манипуляции с файлами: cp , mv , rm ;
  • просмотр содержимого каталогов: ls , ls -l , ls -lS ;
  • структура каталогов: tree , tree -d (можно передать в качестве параметра каталог);
  • поиск файлов: find . -name . ;

Аналитика

  • wc , wc -l ;
  • sort -k — сортировка по указанному полю;
  • sort -n — числовая соритровка;
  • diff — сравнение файлов;
  • grep , grep -v , grep -w , grep ‘\ ‘ , grep -E — поиск текста;
  • uniq , uniq -c — уникализация строк;
  • awk — в варианте awk ‘‘ , чтобы оставить только первое поле из каждой строки, $1 можно менять на $2 , $3 и т.д.;

Диагностика системы

  • ps axuww — информация о процессах (запущенных программах), работающих на машине;
  • top — интерактивный просмотр самых ресурсоемких процессов;
  • df — занятое и свободное место на диске;
  • du — суммарный размер файлов в каталоге (рекурсивно с подкаталогами);
  • strace , ktrace — какие системные вызовы выполняет процесс;
  • lsof — какие файлы использует процесс;
  • netstat -na , netstat -nap — какие порты и сокеты открыты в системе.

Некоторых программ у вас может не быть, их надо установить дополнительно. Кроме того, некоторые опции этих программ доступны только привилегированным пользователям ( root ‘у).

Массовое и полуавтоматическое выполнение

На первых порах пропускайте этот раздел, эти команды и конструкции понадобятся вам тогда, когда доберетесь до несложного шелльного скриптинга.

  • test — проврека условий;
  • while read — цикл по строчкам STDIN ;
  • xargs — подстановка строк из STDIN в параметры указанной программе;
  • seq — генерация последовательностей натуральных чисел;
  • () — объединить вывод нескольких команд;
  • ; — выполнить одно за другим;
  • && — выполнить при условии успешного завершения первой команды;
  • || — выполнить при условии неудачного завершения первой команды;
  • tee — продублировать вывод программы в STDOUT и в файл на диске.

Разное

  • date — текущая дата;
  • curl — скачивает документ по указаному url и пишет результат на STDOUT ;
  • touch — обновить дату модификации файла;
  • kill — послать процессу сигнал;
  • true — ничего не делает, возвращает истину, полезна для организации вечных циклов;
  • sudo — выполнить команду от имени root ‘а.

Составление конвейера-однострочника

Давайте рассмотрим пример реальной задачи: требуется прибить все процессы task-6-server , запущенные от имени текущего пользователя.

Шаг 1.
Понять, какая программа выдает примерно нужные данные, хотя бы и не в чистом виде. Для нашей задачи стоит получить список всех процессов в системе: ps axuww . Запустить.

Шаг 2.
Посмотреть на полученные данные глазами, придумать фильтр, который выкинет часть ненужных данных. Часто это grep или grep -v . Клавишей «Вверх» вытащить из истории предыдущую команду, приписать к ней придуманный фильтр, запустить.

— только процессы текущего пользователя.

Шаг 3.
Повторять пункт 2, пока не получатся чистые нужные данные.

— все процессы с нужным именем (плюс, может быть, лишние вроде vim task-6-server.c и т.п.),

— только процессы с нужным именем

— pid-ы нужных процессов, п. 3 выполнен

Шаг 4.
Применить подходящий финальный обработчик. Клавишей «Вверх» вытаскиваем из истории предыдущую команду и добавляем обработку, которая завершит решение задачи:

  • |wc -l чтобы посчитать количество процессов;
  • >pids чтобы записать pid-ы в файл;
  • |xargs kill -9 убить процессы.

Задания для тренировки

Хотите попрактиковаться в новых умениях? Попробуйте выполнить следующие задания:

  • получите список всех файлов и каталогов в вашем домашнем каталоге;
  • получите список всех man -статей из категории 2 (системные вызовы);
  • посчитайте, сколько раз в man-е по программе grep встречается слово grep;
  • посчитайте, сколько процессов запущено в данный момент от имени пользователя root ;
  • найдите, какая команда встречается в максимальном количестве категорий справки (man);
  • подсчитайте, сколько раз встречается слово var на странице ya.ru.

Подсказка: вам понадобится find , grep -o , awk ‘‘ , регулярные выражения в grep , curl -s .

Что изучать дальше?

Если командная строка начинает вам нравиться, не останавливайтесь, продолжайте совершенствовать свои навыки.

Вот некоторые программы, которые определенно вам пригодятся, если вы будете жить в командной строке:

  • awk
  • sed
  • find со сложными опциями
  • apropos
  • locate
  • telnet
  • netcat
  • tcpdump
  • rsync
  • screen
  • ssh
  • tar
  • zgrep , zless
  • visudo
  • crontab -e
  • sendmail

Кроме того, со временем стоит освоить какой-нибудь скриптовый язык,например, perl или python , или даже их оба.

Кому это надо?

А стоит ли вообще изучать сегодня командную строку и шелльный скриптинг? Определенно стоит. Приведу только несколько примеров из требований Facebook к кандидатам, которые хотят поступить на работу в FB.

Data Scientist, Economic Research: Comfort with the command line and with Unix core tools; preferred: adeptness with a scripting language such as Python, or previous software engineering experience.

MySQL Database Engineer: High degree of proficiency in Shell scripting (Bash, Awk, etc); high degree of proficiency in Linux administration.

Manufacturing Quality Engineer, Server: Scripting skills in Bash, Perl, or Python is desirable.

Data Platform Engineer: 2 years experience with Unix/Linux systems.

DevOps Engineer, Data: 2 years experience with Unix/Linux system administration and programming.

Вопросы?

Если у вас есть вопросы по этой статье или вообще по работе в юниксовой командной строке, задавайте их в комментариях или по емейлу liruoko (at) yandex (dot) ru .

Самый маленький шелл-код. Создаем 44-байтовый Linux x86 bind shellcode

Содержание статьи

Shell-код представляет собой набор машинных команд, позволяющий получить доступ к командному интерпретатору (cmd.exe в Windows и shell в Linux, от чего, собственно, и происходит его название). В более широком смысле shell-код — это любой код, который используется как payload (полезная нагрузка для эксплоита) и представляет собой последовательность машинных команд, которую выполняет уязвимое приложение (этим кодом может быть также простая системная команда, вроде chmod 777 /etc/shadow) :

Немного теории

Уверен, что многие наши читатели и так знают те истины, которые я хочу описать в теоретическом разделе, но не будем забывать про недавно присоединившихся к нам хакеров и постараемся облегчить их вхождение в наше непростое дело.

Системные вызовы

Системные вызовы обеспечивают связь между пространством пользователя (user mode) и пространством ядра (kernel mode) и используются для множества задач, таких, например, как запуск файлов, операции ввода-вывода, чтения и записи файлов.

Для описания системного вызова через ассемблер используется соответствующий номер, который вместе с аргументами необходимо вносить в соответствующие регистры.

Регистры

Регистры — специальные ячейки памяти в процессоре, доступ к которым осуществляется по именам (в отличие от основной памяти). Используются для хранения данных и адресов. Нас будут интересовать регистры общего назначения: EAX, EBX, ECX, EDX, ESI, EDI, EBP и ESP.

Стеком называется область памяти программы для временного хранения произвольных данных. Важно помнить, что данные из стека извлекаются в обратном порядке (что сохранено последним — извлекается первым). Переполнение стека — достаточно распространенная уязвимость, при которой у атакующего появляется возможность перезаписать адрес возврата функции на адрес, содержащий shell-код.

Проблема нулевого байта

Многие функции для работы со строками используют нулевой байт для завершения строки.

Таким образом, если нулевой байт встретится в shell-коде, то все последующие за ним байты проигнорируются и код не сработает, что нужно учитывать.

Необходимые нам инструменты

  • Linux Debian x86/x86_64 (хотя мы и будем писать код под x86, сборка на машине x86_64 проблем вызвать не должна);
  • NASM — свободный (LGPL и лицензия BSD) ассемблер для архитектуры Intel x86;
  • LD — компоновщик;
  • objdump — утилита для работы с файлами, которая понадобится нам для извлечения байт-кода из бинарного файла;
  • GCC — компилятор;
  • strace — утилита для трассировки системных вызовов.

Если бы мы создавали bind shell классическим способом, то для этого нам пришлось бы несколько раз дергать сетевой системный вызов socketcall() :

  • net.h/SYS_SOCKET — чтобы создать структуру сокета;
  • net.h/SYS_BIND — привязать дескриптор сокета к IP и порту;
  • net.h/SYS_LISTEN — начать слушать сеть;
  • net.h/SYS_ACCEPT — начать принимать соединения.

И в конечном итоге наш shell-код получился бы достаточно большим. В зависимости от реализации в среднем выходит 70 байт, что относительно немного. Но не будем забывать нашу цель — написать максимально компактный shell-код, что мы и сделаем, прибегнув к помощи netcat!

Почему размер так важен для shell-кода?

Ты, наверное, слышал, что при эксплуатации уязвимостей на переполнение буфера используется принцип перехвата управления, когда атакующий перезаписывает адрес возврата функции на адрес, где лежит shell-код. Размер shell-кода при этом ограничен и не может превышать определенного значения.

Shell-код мы будем писать на чистом ассемблере, тестировать — в программе на С. Наша заготовка bind_shell_1.nasm , разбитая для удобства на блоки, выглядит следующим образом:

Сохраним ее как super_small_bind_shell_1.nasm и далее скомпилируем:

а затем слинкуем наш код:

и запустим получившуюся программу через трассировщик (strace), чтобы посмотреть, что она делает:

Запуск bind shell через трассировщик

Xakep #246. Учиться, учиться, учиться!

Как видишь, никакой магии. Через системный вызов execve() запускается netcat , который начинает слушать на порте 12345, открывая удаленный шелл на машине. В нашем случае мы использовали системный вызов execve() для запуска бинарного файла /bin/nc с нужными параметрами ( -le/bin/sh -vp12345 ).

execve() имеет следующий прототип:

  • filename обычно указывает путь к исполняемому бинарному файлу — /bin/nc ;
  • argv[] служит указателем на массив с аргументами, включая имя исполняемого файла, — [«/bin//nc», «-le//bin//sh», «-vp12345»] ;
  • envp[] указывает на массив, описывающий окружение. В нашем случае это NULL, так как мы не используем его.

Синтаксис нашего системного вызова (функции) выглядит следующим образом:

Описываем системные вызовы через ассемблер

Как было сказано в начале статьи, для указания системного вызова используется соответствующий номер (номера системных вызовов для x86 можно посмотреть здесь: /usr/include/x86_64-linux-gnu/asm/unistd_32.h ), который необходимо поместить в регистр EAX (в нашем случае в регистр EAX, а точнее в его младшую часть AL было занесено значение 11, что соответствует системному вызову execve() ).

Аргументы функции должны быть помещены в регистры EBX, ECX, EDX:

  • EBX — должен содержать адрес строки с filename — /bin//nc ;
  • ECX — должен содержать адрес строки с argv[] — «/bin//nc» «-le//bin//sh» «-vp12345» ;
  • EDX — должен содержать null-байт для envp[] .

Регистры ESI и EDI мы использовали как временное хранилище для сохранения аргументов execve() в нужной последовательности в стек, чтобы в блоке 5 (см. код выше) перенести в регистр ECX указатель (указатель указателя, если быть более точным) на массив argv[] .

Ныряем в код

Разберем код по блокам.

Блок 1 говорит сам за себя и предназначен для определения секции, содержащей исполняемый код и указание линкеру точки входа в программу.

Блок 2

Обнуляем регистр EDX, значение которого (NULL) будет использоваться для envp[] , а также как символ конца строки для вносимых в стек строк. Обнуляем регистр через XOR, так как инструкция mov edx, 0 привела бы к появлению null-байтов в shell-коде, что недопустимо.

Важно!

Аргументы для execve() мы отправляем в стек, предварительно перевернув их справа налево, так как стек растет от старших адресов к младшим, а данные из него извлекаются наоборот — от младших адресов к старшим.

Для того чтобы перевернуть строку и перевести ее в hex, можно воспользоваться следующей Linux-командой:

Блок 3

Ты, наверное, заметил странноватый путь к бинарнику с двойными слешами. Это делается специально, чтобы число вносимых байтов было кратным четырем, что позволит не использовать нулевой байт (Linux игнорирует слеши, так что /bin/nc и /bin//nc — это одно и то же).

Блок 4

Блок 5

Почему в AL, а не в EAX? Регистр EAX имеет разрядность 32 бита. К его младшим 16 битам можно обратиться через регистр AX. AX, в свою очередь, можно разделить на две части: младший байт (AL) и старший байт (AH). Отправляя значение в AL, мы избегаем появления нулевых байтов, которые бы автоматически появились при добавлении 11 в EAX.

Извлекаем shell-код

Чтобы наконец получить заветный shell-код из файла, воспользуемся следующей командой Linux:

и получаем на выходе вот такой вот симпатичный shell-код:

Тестируем

Для теста будем использовать следующую программу на С:

Компилируем. NB! Если у тебя x86_64 система, то может понадобиться установка g++-multilib :

Проверяем bind shell

Хех, видим, что наш shell-код работает: его размер — 58 байт, netcat открывает шелл на порте 12345.

Оптимизируем размер

58 байт — это довольно неплохо, но если посмотреть в shellcode-раздел exploit-db.com, то можно найти и поменьше, например вот этот размером в 56 байт.

Можно ли сделать наш код существенно компактнее?

Можно. Убрав блок, описывающий номер порта. При таком раскладе netcat все равно будет исправно слушать сеть и даст нам шелл. Правда, номер порта нам теперь придется найти с помощью nmap . Наш новый код будет выглядеть следующим образом:

А теперь попробуем подключиться и получить удаленный шелл-доступ. С помощью Nmap узнаем, на каком порте висит наш шелл, после чего успешно подключаемся к нему все тем же netcat :

И снова проверяем bind shell

Bingo! Цель достигнута: мы написали один из самых компактных Linux x86 bind shellcode. Как видишь, ничего сложного ;).

Нещадим Алексей Сергеевич

Цифровая тетрадь, коллекции заметок, статей и интересного материала

Команды Linux: справочник команд unix shell

Большинство UNIX-like систем обладают встроенной справкой, которая подробно описывает все доступные команды. Однако чтобы воспользоваться этой справкой, вы должны знать, по крайней мере, название команды, о которой вы хотите получить информацию. Поскольку большинство пользователей только в общих чертах понимают, что они хотят сделать, то, как правило, встроенная справка мало полезна новичкам.

Этот справочник поможет пользователям, знающим, что они хотят сделать, найти соответствующую команду Linux по краткому описанию.

Системная информация: arch или uname -m — отобразить архитектуру компьютера uname -r — отобразить используемую версию ядра dmidecode -q — показать аппаратные системные компоненты — (SMBIOS / DMI) hdparm -i /dev/hda — вывести характеристики жесткого диска hdparm -tT /dev/sda — протестировать производительность чтения данных с жесткого диска cat /proc/cpuinfo — отобразить информацию о процессоре cat /proc/interrupts — показать прерывания cat /proc/meminfo — проверить использование памяти cat /proc/swaps — показать файл(ы) подкачки cat /proc/version — вывести версию ядра cat /proc/net/dev — показать сетевые интерфейсы и статистику по ним cat /proc/mounts — отобразить смонтированные файловые системы lspci -tv — показать в виде дерева PCI устройства lsusb -tv — показать в виде дерева USB устройства date — вывести системную дату cal 2007 — вывести таблицу-календарь 2007-го года date 041217002007.00* — установить системные дату и время ММДДЧЧммГГГГ.СС (МесяцДеньЧасМинутыГод.Секунды) clock -w — сохранить системное время в BIOS Остановка системы: shutdown -h now или init 0 или telinit 0 — остановить систему shutdown -h hours:minutes & — запланировать остановку системы на указанное время shutdown -c — отменить запланированную по расписанию остановку системы shutdown -r now или reboot — перегрузить систему logout — выйти из системы Файлы и директории: cd /home — перейти в директорию ‘/home’ cd .. — перейти в директорию уровнем выше cd ../.. — перейти в директорию двумя уровнями выше cd — перейти в домашнюю директорию cd

user — перейти в домашнюю директорию пользователя user cd — — перейти в директорию, в которой находились до перехода в текущую директорию pwd — показать текущюю директорию ls — отобразить содержимое текущей директории ls -F — отобразить содержимое текущей директории с добавлением к именам символов, храктеризующих тип ls -l — показать детализированое представление файлов и директорий в текущей директории ls -a — показать скрытые файлы и директории в текущей директории ls *[0-9]* — показать файлы и директории содержащие в имени цифры tree или lstree — показать дерево файлов и директорий, начиная от корня (/) mkdir dir1 — создать директорию с именем ‘dir1’ mkdir dir1 dir2 — создать две директории одновременно mkdir -p /tmp/dir1/dir2 — создать дерево директорий rm -f file1 — удалить файл с именем ‘file1’ rmdir dir1 — удалить директорию с именем ‘dir1’ rm -rf dir1 — удалить директорию с именем ‘dir1’ и рекурсивно всё её содержимое rm -rf dir1 dir2 — удалить две директории и рекурсивно их содержимое mv dir1 new_dir — переименовать или переместить файл или директорию cp file1 file2 — сопировать файл file1 в файл file2 cp dir/* . — копировать все файлы директории dir в текущую директорию cp -a /tmp/dir1 . — копировать директорию dir1 со всем содержимым в текущую директорию cp -a dir1 dir2 — копировать директорию dir1 в директорию dir2 ln -s file1 lnk1* — создать символическую ссылку на файл или директорию ln file1 lnk1 — создать «жёсткую» (физическую) ссылку на файл или директорию touch -t 0712250000 fileditest — модифицировать дату и время создания файла, при его отсутствии, создать файл с указанными датой и временем (YYMMDDhhmm) Поиск файлов: find / -name file1 — найти файлы и директории с именем file1. Поиск начать с корня (/) find / -user user1 — найти файл и директорию принадлежащие пользователю user1. Поиск начать с корня (/) find /home/user1 -name «*.bin» — найти все файлы и директории, имена которых оканчиваются на ‘. bin’. Поиск начать с ‘/ home/user1’* find /usr/bin -type f -atime +100 — найти все файлы в ‘/usr/bin’, время последнего обращения к которым более 100 дней find /usr/bin -type f -mtime -10 — найти все файлы в ‘/usr/bin’, созданные или изменённые в течении последних 10 дней find / -name *.rpm -exec chmod 755 ‘<>‘ ; — найти все фалы и директории, имена которых оканчиваются на ‘.rpm’, и изменить права доступа к ним find / -xdev -name «*.rpm» — найти все фалы и директории, имена которых оканчиваются на ‘.rpm’, игнорируя съёмные носители, такие как cdrom, floppy и т.п. locate «*.ps» — найти все файлы, сожержащие в имени ‘.ps’. Предварительно рекомендуется выполнить команду ‘updatedb’ whereis halt — показывает размещение бинарных файлов, исходных кодов и руководств, относящихся к файлу ‘halt’ which halt — отображает полный путь к файлу ‘halt’ Монтирование файловых систем: mount /dev/hda2 /mnt/hda2 — монтирует раздел ‘hda2’ в точку монтирования ‘/mnt/hda2’. Убедитесь в наличии директории-точки монтирования ‘/mnt/hda2’ umount /dev/hda2 — размонтирует раздел ‘hda2’. Перед выполнением, покиньте ‘/mnt/hda2’ fuser -km /mnt/hda2 — принудительное размонтирование раздела. Применяется в случае, когда раздел занят каким-либо пользователем umount -n /mnt/hda2 — выполнить размонитрование без занесения информации в /etc/mtab. Полезно когда файл имеет атрибуты «только чтение» или недостаточно места на диске mount /dev/fd0 /mnt/floppy — монтировать флоппи-диск mount /dev/cdrom /mnt/cdrom — монтировать CD или DVD mount /dev/hdc /mnt/cdrecorder — монтировать CD-R/CD-RW или DVD-R/DVD-RW(+-) mount -o loop file.iso /mnt/cdrom — смонтировать ISO-образ mount -t vfat /dev/hda5 /mnt/hda5 — монтировать файловую систему Windows FAT32 mount -t smbfs -o username=user,password=pass //winclient/share /mnt/share — монтировать сетевую файловую систему Windows (SMB/CIFS) mount -o bind /home/user/prg /var/ftp/user — «монтирует» директорию в директорию (binding). Доступна с версии ядра 2.4.0. Полезна, например, для предоставления содержимого пользовательской директории через ftp при работе ftp-сервера в «песочнице» (chroot), когда симлинки сделать невозможно. Выполнение данной команды сделает копию содержимого /home/user/prg в /var/ftp/user Дисковое пространство: df -h — отображает информацию о смонтированных разделах с отображением общего, доступного и используемого пространства (Прим.переводчика. ключ -h работает не во всех *nix системах) ls -lSr |more — выдаёт список файлов и директорий рекурсивно с сортировкой по возрастанию размера и позволяет осуществлять постраничный просмотр du -sh dir1 — подсчитывает и выводит размер, занимаемый директорией ‘dir1’ (Прим.переводчика. ключ -h работает не во всех *nix системах) du -sk * | sort -rn — отображает размер и имена файлов и директорий, с соритровкой по размеру rpm -q -a —qf ‘%10t%n’ | sort -k1,1n — показывает размер используемого дискового пространства, занимаемое файлами rpm-пакета, с сортировкой по размеру (fedora, redhat и т.п.) dpkg-query -W -f=’$t$n’ | sort -k1,1n — показывает размер используемого дискового пространства, занимаемое файлами deb-пакета, с сортировкой по размеру (ubuntu, debian т.п.) Пользователи и группы: groupadd group_name — создать новую группу с именем group_name groupdel group_name — удалить группу group_name groupmod -n new_group_name old_group_name — переименовать группу old_group_name в new_group_name useradd -c «Nome Cognome» -g admin -d /home/user1 -s /bin/bash user1 — создать пользователя user1, назначить ему в качестве домашнего каталога /home/user1, в качестве shell’а /bin/bash, включить его в группу admin и добавить комментарий Nome Cognome useradd user1 — создать пользователя user1 userdel -r user1 — удалить пользователя user1 и его домашний каталог usermod -c «User FTP» -g system -d /ftp/user1 -s /bin/nologin user1 — изменить атрибуты пользователя passwd — сменить пароль passwd user1 — сменить пароль пользователя user1 (только root) chage -E 2005-12-31 user1 — установить дату окончания действия учётной записи пользователя user1 pwck — проверить корректность системных файлов учётных записей. Проверяются файлы /etc/passwd и /etc/shadow grpck — проверяет корректность системных файлов учётных записей. Проверяется файл/etc/group newgrp [-] group_name — изменяет первичную группу текущего пользователя. Если указать «-», ситуация будет идентичной той, в которой пользователь вышил из системы и снова вошёл. Если не указывать группу, первичная группа будет назначена из /etc/passwd Выставление/изменение полномочий на файлы: ls -lh — просмотр полномочий на файлы и директории в текущей директории ls /tmp | pr -T5 -W$COLUMNS — вывести содержимое директории /tmp и разделить вывод на пять колонок chmod ugo+rwx directory1 — добавить полномочия на директорию directory1 ugo(User Group Other)+rwx(Read Write eXecute) — всем полные права. Аналогичное можно сделать таким образом chmod 777 directory1 chmod go-rwx directory1 — отобрать у группы и всех остальных все полномочия на директорию directory1. chown user1 file1 — назначить владельцем файла file1 пользователя user1 chown -R user1 directory1 — назначить рекурсивно владельцем директории directory1 пользователя user1 chgrp group1 file1 — сменить группу-владельца файла file1 на group1 chown user1:group1 file1 — сменить владельца и группу владельца файла file1 find / -perm -u+s — найти, начиная от корня, все файлы с выставленным SUID chmod u+s /bin/binary_file — назначить SUID-бит файлу /bin/binary_file. Это даёт возможность любому пользователю запускать на выполнение файл с полномочиями владельца файла. chmod u-s /bin/binary_file — снять SUID-бит с файла /bin/binary_file. chmod g+s /home/public — назначить SGID-бит директории /home/public. chmod g-s /home/public — снять SGID-бит с директории /home/public. chmod o+t /home/public — назначить STIKY-бит директории /home/public. Позволяет удалять файлы только владельцам chmod o-t /home/public — снять STIKY-бит с директории /home/public Специальные атрибуты файлов: chattr +a file1 — позволить открывать файл на запись только в режиме добавления chattr +c file1 — позволяет ядру автоматически сжимать/разжимать содержимое файла. chattr +d file1 — указавет утилите dump игнорировать данный файл во время выполнения backup’а chattr +i file1 — делает файл недоступным для любых изменений: редактирование, удаление, перемещение, создание линков на него. chattr +s file1 — позволяет сделать удаление файла безопасным, т.е. выставленный атрибут s говорит о том, что при удалении файла, место, занимаемое файлом на диске заполняется нулями, что предотвращяет возможность восстановления данных. chattr +S file1 — указывает, что, при сохранении изменений, будет произведена синхронизация, как при выполнении команды sync chattr +u file1 — данный атрибут указывает, что при удалении файла содержимое его будет сохранено и при необходимости пользователь сможет его восстановить lsattr — показать атрибуты файлов Архивирование и сжатие файлов: bunzip2 file1.bz2 — разжимает файл ‘file1.gz’ gunzip file1.gzgzip file1 или bzip2 file1 — сжимает файл ‘file1’ gzip -9 file1 — сжать файл file1 с максимальным сжатием rar a file1.rar test_file — создать rar-архив ‘file1.rar’ и включить в него файл test_file rar a file1.rar file1 file2 dir1 — создать rar-архив ‘file1.rar’ и включить в него file1, file2 и dir1 rar x file1.rar — распаковать rar-архив unrar x file1.rartar -cvf archive.tar file1 — создать tar-архив archive.tar, содержащий файл file1 tar -cvf archive.tar file1 file2 dir1 — создать tar-архив archive.tar, содержащий файл file1, file2 и dir1 tar -tf archive.tar — показать содержимое архива tar -xvf archive.tar — распаковать архив tar -xvf archive.tar -C /tmp — распаковать архив в /tmp tar -cvfj archive.tar.bz2 dir1 — создать архив и сжать его с помощью bzip2(Прим.переводчика. ключ -j работает не во всех *nix системах) tar -xvfj archive.tar.bz2 — разжать архив и распаковать его(Прим.переводчика. ключ -j работает не во всех *nix системах) tar -cvfz archive.tar.gz dir1 — создать архив и сжать его с помощью gzip tar -xvfz archive.tar.gz — разжать архив и распаковать его zip file1.zip file1 — создать сжатый zip-архив zip -r file1.zip file1 file2 dir1 — создать сжатый zip-архив и со включением в него нескольких файлов и/или директорий unzip file1.zip — разжать и распаковать zip-архив RPM пакеты (Fedora, Red Hat и тому подобное): rpm -ivh package.rpm — установить пакет с выводом сообщений и прогресс-бара rpm -ivh —nodeps package.rpm — установить пакет с выводом сообщений и прогресс-бара без контроля зависимостей rpm -U package.rpm — обновить пакет без изменений конфигурационных файлов, в случае отсутствия пакета, он будет установлен rpm -F package.rpm — обновить пакет только если он установлен rpm -e package_name.rpm — удалить пакет rpm -qa — отобразить список всех пакетов, установленных в системе rpm -qa | grep httpd — среди всех пакетов, установленных в системе, найти пакет содержащий в своём имени «httpd» rpm -qi package_name — вывести информацию о конкрентном пакете rpm -qg «System Environment/Daemons» — отобразить пакеты входящие в группу пакетов rpm -ql package_name — вывести список файлов, входящих в пакет rpm -qc package_name — вывести список конфигурационных файлов, входящих в пакет rpm -q package_name —whatrequires — вывести список пакетов, необходимых для установки конкретного пакета по зависимостям rpm -q package_name —whatprovides — show capability provided by a rpm package rpm -q package_name —scripts — отобразит скрипты, запускаемые при установке/удалении пакета rpm -q package_name —changelog — вывести историю ревизий пакета rpm -qf /etc/httpd/conf/httpd.conf — проверить какому пакету принадлежит указанный файл. Указывать следует полный путь и имя файла. rpm -qp package.rpm -l — отображает список файлов, входящих в пакет, но ещё не установленных в систему rpm —import /media/cdrom/RPM-GPG-KEY — ипортировать публичный ключ цифровой подписи rpm —checksig package.rpm — проверит подпись пакета rpm -qa gpg-pubkey — проверить целостность установленного содержимого пакета rpm -V package_name — проверить размер, полномочия, тип, владельца, группу, MD5-сумму и дату последнего изменеия пакета rpm -Va — проверить содержимое всех пакеты установленные в систему. Выполняйте с осторожностью! rpm -Vp package.rpm — проверить пакет, который ещё не установлен в систему rpm2cpio package.rpm | cpio —extract —make-directories *bin* — извлечь из пакета файлы содержащие в своём имени bin rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm — установить пакет, собранный из исходных кодов rpmbuild —rebuild package_name.src.rpm — собрать пакет из исходных кодов YUM — средство обновления пакетов(Fedora, RedHat и тому подобное): yum install package_name — закачать и установать пакет yum update — обновить все пакеты, установленные в систему yum update package_name — обновить пакет yum remove package_name — удалить пакет yum list — вывести список всех пакетов, установленных в систему yum search package_name — найти пакет в репозитории yum clean packages — очисть rpm-кэш, удалив закачанные пакеты yum clean headers — удалить все заголовки файлов, которые система использует для разрешения зависимостей yum clean all — очисть rpm-кэш, удалив закачанные пакеты и заголовки DEB пакеты (Debian, Ubuntu и тому подобное): dpkg -i package.deb — установить / обновить пакет dpkg -r package_name — удалить пакет из системы dpkg -l — показать все пакеты, установленные в систему dpkg -l | grep httpd — среди всех пакетов, установленных в системе, найти пакет содержащий в своём имени «httpd» dpkg -s package_name — отобразить инфрмацию о конкретном пакете dpkg -L package_name — вывести список файлов, входящих в пакет, установленный в систему dpkg —contents package.deb — отобразить список файлов, входящих в пакет, который ешё не установлен в систему dpkg -S /bin/ping — найти пакет, в который входит указанный файл. APT — средство управление пакетами (Debian, Ubuntu и тому подобное): apt-get install package_name — установить / обновить пакет apt-cdrom install package_name — установить / обновить пакет с cdrom’а apt-get update — получить обновлённые списки пакетов apt-get upgrade — обновить пакеты, установленные в систему apt-get remove package_name — удалить пакет, установленный в систему с сохранением файлов конфигурации apt-get purge package_name — удалить пакет, установленный в систему с удалением файлов конфигурации apt-get check — проверить целостность зависимостей apt-get clean — удалить загруженные архивные файлы пакетов apt-get autoclean — удалить старые загруженные архивные файлы пакетов Pacman — средство управление пакетами (Arch, Frugalware и alike) pacman -S name — install package «name» with dependencies pacman -R name — delete package «name» and all files of it Просмотр содержимого файлов: cat file1 — вывести содержимое файла file1 на стандартное устройсво вывода tac file1 — вывести содержимое файла file1 на стандартное устройсво вывода в обратном порядке (последняя строка становиться первой и т.д.) more file1 — постраничный вывод содержимого файла file1 на стандартное устройство вывода less file1 — постраничный вывод содержимого файла file1 на стандартное устройство вывода, но с возможностью пролистывания в обе стороны (вверх-вниз), поиска по содержимому и т.п. head -2 file1 — вывести первые две строки файла file1 на стандартное устройство вывода. По-умолчанию выводится десять строк tail -2 file1 — вывести последние две строки файла file1 на стандартное устройство вывода. По-умолчанию выводится десять строк tail -f /var/log/messages — выводить содержимое файла /var/log/messages на стандартное устройство вывода по мере появления в нём текста. Манипуляции с текстом: cat file_originale | [operation: sed, grep, awk, grep и т.п.] > result.txt — общий синтаксис выполнения действий по обработке содержимого файла и вывода результата в новый cat file_originale | [operazione: sed, grep, awk, grepи т.п.] >> result.txt — общий синтаксис выполнения действий по обработке содержимого файла и вывода результата в существующий файл. Если файл не существует, он будет создан grep Aug /var/log/messages — из файла ‘/var/log/messages’ отобрать и вывести на стандартное устройство вывода строки, содержащие «Aug» grep ^Aug /var/log/messages — из файла ‘/var/log/messages’ отобрать и вывести на стандартное устройство вывода строки, начинающиеся на «Aug» grep [0-9] /var/log/messages — из файла ‘/var/log/messages’ отобрать и вывести на стандартное устройство вывода строки, содержащие цифры grep Aug -R /var/log/* — отобрать и вывести на стандартное устройство вывода строки, содержащие «Augr», во всех файлах, находящихся в директории /var/log и ниже sed ‘s/stringa1/stringa2/g’ example.txt — в файле example.txt заменить «string1» на «string2», результат вывести на стандартное устройство вывода. sed ‘/^$/d’ example.txt — удалить пустые строки из файла example.txt sed ‘/ *#/d; /^$/d’ example.txt — удалить пустые строки и комментарии из файла example.txt echo ‘esempio’ | tr ‘[:lower:]’ ‘[:upper:]’ — преобразовать символы из нижнего регистра в верхний sed -e ‘1d’ result.txt — удалить первую строку из файла example.txt sed -n ‘/string1/p’ — отобразить только строки содержашие «string1» sed -e ‘s/ *$//’ example.txt — удалить пустые символы в в конце каждой строки sed -e ‘s/string1//g’ example.txt — удалить строку «string1» из текста не изменяя всего остального sed -n ‘1,8p;5q’ example.txt — взять из файла с первой по восьмую строки и из них вывести первые пять sed -n ‘5p;5q’ example.txt — вывести пятую строку sed -e ‘s/0*/0/g’ example.txt — заменить последовательность из любого количества нулей одним нулём cat -n file1 — пронумеровать строки при выводе содержимого файла cat example.txt | awk ‘NR%2==1’ — при выводе содержимого файла, не выводить чётные строки файла echo a b c | awk ‘ — вывести первую колонку. Разделение, по-умолчанию, по проблелу/пробелам или символу/символам табуляции echo a b c | awk ‘ — вывести первую и треью колонки. Разделение, по-умолчанию, по проблелу/пробелам или символу/символам табуляции paste file1 file2 — объединить содержимое file1 и file2 в виде таблицы: строка 1 из file1 = строка 1 колонка 1-n, строка 1 из file2 = строка 1 колонка n+1-m paste -d ‘+’ file1 file2 — объединить содержимое file1 и file2 в виде таблицы с разделителем «+» sort file1 file2 — отсортировать содержимое двух файлов sort file1 file2 | uniq — отсортировать содержимое двух файлов, не отображая повторов sort file1 file2 | uniq -u — отсортировать содержимое двух файлов, отображая только уникальные строки (строки, встречающиеся в обоих файлах, не выводятся на стандартное устройство вывода) sort file1 file2 | uniq -d — отсортировать содержимое двух файлов, отображая только повторяющиеся строки comm -1 file1 file2 — сравнить содержимое двух файлов, не отображая строки принадлежащие файлу ‘file1’ comm -2 file1 file2 — сравнить содержимое двух файлов, не отображая строки принадлежащие файлу ‘file2’ comm -3 file1 file2 — сравнить содержимое двух файлов, удаляя строки встречающиеся в обоих файлах Преобразование наборов символов и файловых форматов: dos2unix filedos.txt fileunix.txt — конвертировать файл текстового формата из MSDOS в UNIX (разница в символах возврата коретки) unix2dos fileunix.txt filedos.txt — конвертировать файл текстового формата из UNIX в MSDOS (разница в символах возврата коретки) recode ..HTML page.html — конвертировать содержимое тестового файла page.txt в html-файл page.html recode -l | more — вывести список доступных форматов Анализ файловых систем: badblocks -v /dev/hda1 — проверить раздел hda1 на наличие bad-блоков fsck /dev/hda1 — проверить/восстановить целостность linux-файловой системы раздела hda1 fsck.ext2 /dev/hda1 или e2fsck /dev/hda1 — проверить/восстановить целостность файловой системы ext2 раздела hda1 e2fsck -j /dev/hda1 — проверить/восстановить целостность файловой системы ext3 раздела hda1 с указанием, что журнал расположен там же fsck.ext3 /dev/hda1 — проверить/восстановить целостность файловой системы ext3 раздела hda1 fsck.vfat /dev/hda1 или fsck.msdos /dev/hda1 или dosfsck /dev/hda1 — проверить/восстановить целостность файловой системы fat раздела hda11 Форматирование файловых систем: mkfs /dev/hda1 — создать linux-файловую систему на разделе hda1 mke2fs /dev/hda1 — создать файловую систему ext2 на разделе hda1 mke2fs -j /dev/hda1 — создать журналирующую файловую систему ext3 на разделе hda1 mkfs -t vfat 32 -F /dev/hda1 — создать файловую систему FAT32 на разделе hda1 fdformat -n /dev/fd0 — форматирование флоппи-диска без проверки mkswap /dev/hda3 — создание swap-пространства на разделе hda3 swap-пространство: mkswap /dev/hda3 — создание swap-пространства на разделе hda3 swapon /dev/hda3 — активировать swap-пространство, расположенное на разделе hda3 swapon /dev/hda2 /dev/hdb3 — активировать swap-пространства, расположенные на разделах hda2 и hdb3 Создание резервных копий (backup): dump -0aj -f /tmp/home0.bak /home — создать полную резервную копию директории /home в файл /tmp/home0.bak dump -1aj -f /tmp/home0.bak /home — создать инкрементальную резервную копию директории /home в файл /tmp/home0.bak restore -if /tmp/home0.bak — восстановить из резервной копии /tmp/home0.bak rsync -rogpav —delete /home /tmp — синхронизировать /tmp с /home rsync -rogpav -e ssh —delete /home ip_address:/tmp — синхронизировать через SSH-туннель rsync -az -e ssh —delete ip_addr:/home/public /home/local — синхронизировать локальную директорию с удалённой директорией через ssh-туннель со сжатием rsync -az -e ssh —delete /home/local ip_addr:/home/public — синхронизировать удалённую директорию с локальной директорией через ssh-туннель со сжатием dd bs=1M if=/dev/hda | gzip | ssh user@ip_addr ‘dd of=hda.gz’ — сделать «слепок» локального диска в файл на удалённом компьютере через ssh-туннель tar -Puf backup.tar /home/user — создать инкрементальную резервную копию директории ‘/home/user’ в файл backup.tar с сохранением полномочий ( cd /tmp/local/ && tar c . ) | ssh -C user@ip_addr ‘cd /home/share/ && tar x -p’ — копирование содержимого /tmp/local на удалённый компьютер через ssh-туннель в /home/share/ ( tar c /home ) | ssh -C user@ip_addr ‘cd /home/backup-home && tar x -p’ — копирование содержимого /home на удалённый компьютер через ssh-туннель в /home/backup-home tar cf — . | (cd /tmp/backup ; tar xf — ) — копирование одной директории в другую с сохранением полномочий и линков find /home/user1 -name ‘*.txt’ | xargs cp -av —target-directory=/home/backup/ —parents — поиск в /home/user1 всех файлов, имена которых оканчиваются на ‘.txt’, и копирование их в другую директорию find /var/log -name ‘*.log’ | tar cv —files-from=- | bzip2 > log.tar.bz2 — поиск в /var/log всех файлов, имена которых оканчиваются на ‘.log’, и создание bzip-архива из них dd if=/dev/hda of=/dev/fd0 bs=512 count=1 — создать копию MBR (Master Boot Record) с /dev/hda на флоппи-диск dd if=/dev/fd0 of=/dev/hda bs=512 count=1 — восстановить MBR с флоппи-диска на /dev/hda CDROM: cdrecord -v gracetime=2 dev=/dev/cdrom -eject blank=fast -force — clean a rewritable cdrom mkisofs /dev/cdrom > cd.iso — create an iso image of cdrom on disk mkisofs /dev/cdrom | gzip > cd_iso.gz — create a compressed iso image of cdrom on disk mkisofs -J -allow-leading-dots -R -V «Label CD» -iso-level 4 -o ./cd.iso data_cd — create an iso image of a directory cdrecord -v dev=/dev/cdrom cd.iso — burn an ISO image gzip -dc cd_iso.gz | cdrecord dev=/dev/cdrom — burn a compressed ISO image mount -o loop cd.iso /mnt/iso — mount an ISO image cd-paranoia -B — rip audio tracks from a CD to wav files cd-paranoia — «-3» — rip first three audio tracks from a CD to wav files cdrecord —scanbus — scan bus to identify the channel scsi Сеть (LAN и WiFi): ifconfig eth0 — показать конфигурацию сетевого интерфейса eth0 ifup eth0 — активировать (поднять) интерфейс eth0 ifdown eth0 — деактивировать (опустить) интерфейс eth0 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 — выставить интерфейсу eth0 ip-адрес и маску подсети ifconfig eth0 promisc — перевести интерфейс eth0 в promiscuous-режим для «отлова» пакетов (sniffing) ifconfig eth0 -promisc — отключить promiscuous-режим на интерфейсе eth0 dhclient eth0 — активировать интерфейс eth0 в dhcp-режиме. route -n netstat -rn — вывести локальную таблицу маршрутизации route add -net 0/0 gw IP_Gateway — задать ip-адрес шлюза по умолчанию (default gateway) route add -net 192.168.0.0 netmask 255.255.0.0 gw 192.168.1.1 — добавить статический маршрут в сеть 192.168.0.0/16 через шлюз с ip-адресом 192.168.1.1 route del 0/0 gw IP_gateway — удалить ip-адрес шлюза по умолчанию (default gateway) echo «1» > /proc/sys/net/ipv4/ip_forward — разрешить пересылку пакетов (forwarding) hostname — отобразить имя компьютера host http://www.linuxguide.it или host 62.149.140.85 — разрешить имя http://www.linuxguide.it хоста в ip-адрес и наоборот ip link show — отобразить состояние всех интерфейсов mii-tool eth0 — отобразить статус и тип соединения для интерфейса eth0 ethtool eth0 — отображает статистику интерфеса eth0 с выводом такой информации, как поддерживаемые и текущие режимы соединения netstat -tupn — отображает все установленные сетевые соединения по протоколам TCP и UDP без разрешения имён в ip-адреса и PID’ы и имена процессов, обеспечивающих эти соединения netstat -tupln — отображает все сетевые соединения по протоколам TCP и UDP без разрешения имён в ip-адреса и PID’ы и имена процессов, слушающих порты tcpdump tcp port 80 — отобразить весь трафик на TCP-порт 80 (обычно — HTTP) iwlist scan — просканировать эфир на предмет, доступности беспроводных точек доступа iwconfig eth1 — показать конфигурацию беспроводного сетевого интерфейса eth1 Microsoft Windows networks(SAMBA): nbtscan ip_addr nmblookup -A ip_addr — разрешить netbios-имя nbtscan не во всех системах ставится по-умолчанию, возможно, придётся доустанавливать вручную. nmblookup включен в пакет samba. smbclient -L ip_addr/hostname — отобразить ресурсы, предоставленные в общий доступ на windows-машине smbget -Rr smb://ip_addr/share — подобно wget может получить файлы с windows-машин через smb-протокол mount -t smbfs -o username=user,password=pass //winclient/share /mnt/share — смонтировать smb-ресурс, предоставленный на windows-машине, в локальную файловую систему IPTABLES (firewall): iptables -t filter -nL iptables -nL — отобразить все цепочки правил iptables -t nat -L — отобразить все цепочки правил в NAT-таблице iptables -t filter -F или iptables -F — очистить все цепочки правил в filter-таблице iptables -t nat -F — очистить все цепочки правил в NAT-таблице iptables -t filter -X — удалить все пользовательские цепочки правил в filter-таблице iptables -t filter -A INPUT -p tcp —dport telnet -j ACCEPT — позволить входящее подключение telnet’ом iptables -t filter -A OUTPUT -p tcp —dport http -j DROP — блокировать исходящие HTTP-соединения iptables -t filter -A FORWARD -p tcp —dport pop3 -j ACCEPT — позволить «прокидывать» (forward) POP3-соединения iptables -t filter -A INPUT -j LOG —log-prefix «DROP INPUT» — включить журналирование ядром пакетов, проходящих через цепочку INPUT, и добавлением к сообщению префикса «DROP INPUT» iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE — включить NAT (Network Address Translate) исходящих пакетов на интерфейс eth0. Допустимо при использовании с динамически выделяемыми ip-адресами. iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp -m tcp —dport 22 -j DNAT —to-destination 10.0.0.2:22 — перенаправление пакетов, адресованных одному хосту, на другой хост Мониторинг и отладка: top — отобразить запущенные процессы, используемые ими ресурсы и другую полезную информацию (с автоматическим обновлением данных) ps -eafw — отобразить запущенные процессы, используемые ими ресурсы и другую полезную информацию (единожды) ps -e -o pid,args —forest — вывести PID’ы и процессы в виде дерева pstree — отобразить дерево процессов kill -9 98989 или kill -KILL 98989 — «убить» процесс с PID 98989 «на смерть» (без соблюдения целостности данных) kill -TERM 98989 — корректно завершить процесс с PID 98989 kill -1 98989 или kill -HUP 98989 — заставить процесс с PID 98989 перепрочитать файл конфигурации lsof -p 98989 — отобразить список файлов, открытых процессом с PID 98989 lsof /home/user1 — отобразить список открытых файлов из директории /home/user1 strace -c ls >/dev/null — вывести список системных вызовов, созданных и полученных процессом ls strace -f -e open ls >/dev/null — вывести вызовы бибилотек watch -n1 ‘cat /proc/interrupts’ — отображать прерывания в режиме реального времени last reboot — отобразить историю перезагрузок системы last user1 — отобразить историю регистрации пользователя user1 в системе и время его нахождения в ней lsmod — вывести загруженные модули ядра free -m — показать состояние оперативной памяти в мегабайтах smartctl -A /dev/hda — контроль состояния жёсткого диска /dev/hda через SMART smartctl -i /dev/hda — проверить доступность SMART на жёстком диске /dev/hda tail /var/log/dmesg — вывести десять последних записей из журнала загрузки ядра tail /var/log/messages — вывести десять последних записей из системного журнала Другие полезные команды: apropos …keyword — выводит список комманд, которые так или иначе относятся к ключевым словам. Полезно, когда вы знаете что делает программа, но не помните команду man ping — вызов руководства по работе с программой, в данном случае, — ping whatis …keyword — отображает описание действий указанной программы mkbootdisk —device /dev/fd0 `uname -r` — создаёт загрузочный флоппи-диск gpg -c file1 — шифрует файл file1 с помощью GNU Privacy Guard gpg file1.gpg — дешифрует файл file1 с помощью GNU Privacy Guard wget -r http://www.example.com — загружает рекурсивно содержимое сайта http://www.example.com wget -c http://www.example.com/file.iso — загрузить файл http://www.example.com/file.iso с возможностью останова и продолжения в последствии echo ‘wget -c http://www.example.com/files.iso’ | at 09:00 — начать закачку в указанное время ldd /usr/bin/ssh — вывести список библиотек, необходимых для работы ssh alias hh=’history’ — назначить алиас hh команде history

Дополнение за 18 апреля 2011 года:

Список не является окончательным, описание команд естественно не полное, полное описание команд Вы можете получить в linux shell# man command.

ls : показывает файлы и каталоги в текущей директории, аналог команды dir в Windows.
ls -al : показывает файлы и каталоги в текущей директории, включая подкаталоги, более «сложный» листинг.
cd : сменить директорию, например, если введем команду cd /usr/local/directadmin то перейдем в указанную директорию.
cd

: перейти в домашнюю директорию.
cd — : перейти в директорию в которой находились до перехода в другую директорию.
cd .. : перейти в директорию на 1 уровень вверх.
cat /filename.conf : покажет содержимое файла.
chmod : изменят атрибуты, после команды chmod устанавливается циферное значение, доступ для ПОЛЬЗОВАТЕЛЯ-ГРУППЫ-ВСЕХ:
0 = — Нет доступа
1 = —X Только выполнение
2 = -W- Только запись
3 = -WX Запись и выполнение
4 = R— Только чтение
5 = R-X Чтение и выполнение
6 = RW- Чтение и запись
7 = RWX Чтение, запись и выполнение

Использование:
chmod набор правил filename

chmod 000 : Ни у кого не будет доступа
chmod 644: Обычно используется для HTML страниц
chmod 755: Обычно применяется для CGI скриптов

chown : Изменяет владельца файла или каталога
После команды указывается значение:
ПОЛЬЗОВАТЕЛЬ — ГРУППА

chown root myfile.txt : Установить пользователя root владельцем данного файла.
chown root:root myfile.txt : Изменить пользователя и группу для данного файла и установить root.

tail : аналог команды cat, только читает файлы с конца.
tail /var/log/messages : покажет последние 20 (по умолчанию) строк файла /var/log/messages
tail -f /var/log/messages : выводит листинг файла непрерывно, по мере его обновления.
tail -200 /var/log/messages : выведет на экран последние 200 строк с указанного файла.

more : как cat, только показывает файл поэкранно, а не весь сразу
more /etc/userdomains : Покажет листинг файла на весь экран. Для прокрутки используйте пробел, q для выхода из режима просмотра.

pico : простой в работе редактор с дружественным интерфейсом.

Редактор файлов VI
vi : редактор файлов, много опций, для ноыичка тяжелый в работе.
В редакторе vi Вы можете использовать следующие полезные коменды, только Вы будете должны нажать клавишу SHIFT + :

:q! : Выйти из файла и редактора без сохранения.
:w : Сохранить.
:wq : Сохранить и выйим из редактора.
:номер строки : например :25 : перейти на 25 строку
:$ : Перейти на последнюю строку в файле
:0 : Перейти на первую строку в файле

grep : ищет заданное значение в файлах.
grep root /etc/passwd : ищет значения root в файле /etc/passwd
grep -v root /etc/passwd : покажет все строки где встречается значение root.

ln : создает ссылки между файлами и папками
ln -s /usr/local/apache/conf/httpd.conf /etc/httpd.conf : Теперь Вы можете редактировать /etc/httpd.conf а не оригинал. изменения будут произведены и в оригинале.

last : показывает кто авторизовывался и когда
last -20 : показывает последние 20 авторизаций

w : Показывает кто еще авторизован в шелле и откуда вошли
who : Также показывает кто залогинен в шелл.

netstat : показывает все текущие сетевые подключения.
netstat -an : показывает подключения к серверу, с какого IP на какой порт.
netstat -rn : показывает таблицу IP маршрутизации.

top : показывает все запущенные процессы в таблице, информацию по использованию памяти, uptime системы и другую полезную информацию. Нажав Shift + M увидите таблицу использования памяти или Shift + P таблицу использования процессора.

ps: показывает процесс лист в упрощенном виде.
ps U username : показывает процессы определенного юзера.
ps aux : показывает все системные процессы.
ps aux —forest : показывает все системные процессы, вывод процессов в форме дерева в определенной иерархии.

touch : создает пустой файл.

du : показывает использование жесткого диска.
du -sh : показывает суммарно, в человеко-читаемом формате, общее использование диска, текущей директории и подкаталогов.
du -sh * : тоже самое, но для каждого файла и директории. помогает найти большие файлы, занимающие много места.

wc : счетчик слов
wc -l filename.txt : посчтитает сколько строк находится в файле filename.txt

cp : копировать файл
cp filename filename.backup : скопирует filename в filename.backup

mv : перемещает файлы и папки.

rm : удаляет файл или папку.
rm filename.txt : удаляет filename.txt, при этои спросит действительно ли Вы хотите удалить данный файл.
rm -f filename.txt : удалит filename.txt без подтверждения удаления
rm -rf tmp/ : рекурсивно удаляет каталог tmp, все файлы в нем и подкаталоги.

TAR: упаковка и распаковка .tar.gz и .tar файлов.
tar -zxvf file.tar.gz : распакует архив
tar -xvf file.tar : распакует архив
tar -cf archive.tar contents/ : содержимое каталога contents/ упакует в archive.tar
gzip -d filename.gz : Декомпрессирует и распакует файл.

ZIP Files: распаковывает .zip файлы
unzip file.zip

Firewall — iptables команды
iptables -I INPUT -s IPADDRESSHERE -j DROP : Запретит все соединения с указанного IP
iptables -L : Лист правил iptables
iptables -F : очищает все iptables правила
iptables —save : Сохраняет текущие правила в память на диск
service iptables restart : Перезапустит iptables

Apache Shell Commands:
httpd -v : Покажет дату и время сборки и версию Apache сервера.
httpd -l : Покажет модули Apache
httpd status : будет работать только если mod_status разрешен и покажет страницу с активными подключениями.
service httpd restart : рестартанет Apache web server

MySQL Shell Commands:
mysqladmin processlist : покажет активные mysql соединения и запросы.

Вывод в реальном времени результатов выполнения shell_exec в PHP

Для чтения вывода процесса используется popen(). Она позволяет PHP скрипту работать параллельно с определённой программой и даёт возможность взаимодействовать с ней, читать и записывать во вывод/ввод программы будто бы в файл.

Допустим, мы хотим запустить в операционной системе, где установлен веб-сервер, такую команду:

Тогда в PHP скрипте мы присваиваем переменной значение, которое будет отправлено в ОС для выполнения в качестве команды:

Если мы хотим просто получить результат и вывод в реальном времени нас не интересует, тогда можно использовать passthru():

Но если вы хотите отображать вывод в реальном времени пока работает программа, то можно сделать так:

Этот код запустит команду и будет отправлять пользователь её вывод в реальном времени.

Подсказки использования shell_exec

Если вы пытаетесь запустить команду вроде «gunzip -t» через shell_exec и получаете пустой результат, вам следует добавить 2>&1 к концу команды, например:

Не всегда работает:

Похоже, в примере выше, разрыв строки вывода gunzip препятствует shell_exec напечатать что-либо ещё.

Быстрое напоминание тем, что пытается использовать shell_exec в UNIX-подобных платформах и не может заставить работать свой скрипт. В системе PHP делает запуск программ как веб-пользователь (обычно www, www-data или http для Apache), поэтому вам нужно убедиться, что веб-пользователь имеет достаточно прав для файлов, директорий или программ, которые вы пытаетесь использовать в команде shell_exec. В противном случае, будет казаться, что ничего не происходит.

Скорее всего неправильным (и точно опасным), но рабочим способом является добавление Apache прав запускать программы от имени суперпользователя без пароля.

Для Debian (и производных вроде Kali Linux, Linux Mint, Ubuntu) это делается так:

В файл /etc/sudoers

Для Arch Linux / BlackArch это делается так:

Добавить (раскомментировать) строчку:

Помните, что shell_exec() does не захватывает STDERR (стандартный вывод ошибок), поэтому используйте «2>&1» для его перенаправления в STDOUT (стандартный вывод) и захвата.

Простой способ захватить STDERR (стандартный вывод ошибок) и отбросить STDOUT (стандартный вывод) это добавить ‘2>&1 1> /dev/null‘ к концу вашей команды

Как shell_exec, так и обратная кавычка (`) возвращают NULL, если выполняемая команда не выводит что-либо.

Это позволяет нам делать примерно такие трюки:

Здесь мы просто выводим пустой пробел если команда завершилась успешно, что удовлетворяет это слегка странной проблеме. Отсюда вы можете использовать trim() для вывода команды.

Ошибка Subversion «svn: Can’t recode string» может быть вызвана неправильной (отсутствующей) локалью (locale). Попробуйте

(или любую другую локаль, какую вы предпочитаете) перед вызовом shell_exec()

shell_exec

(PHP 4, PHP 5, PHP 7)

shell_exec — Выполнить команду через оболочку и вернуть вывод в виде строки

Описание

Эта функция идентична оператору с обратным апострофом.

Список параметров

Команда, которая будет выполнена.

Возвращаемые значения

Вывод исполняемой команды или NULL , если произошла ошибка или команда не производит вывод.

Эта функция может вернуть NULL в двух случаях: если произошла ошибка или если выполняемая команда ничего не выводит. Не пользуйтесь этой функцией, для определения, успешно ли выполнилась комманда. Вместо этого используйте exec() , так как она предоставляет возможность проверить код возврата.

Примеры

Пример #1 Пример использования shell_exec()

Системный интегратор

Встроенные команды языка shell

Встроенные команды, в отличие от утилит, выполняет сам shell.

. файл Выполнить команды из файла

eval [аргумент . ] Выполнить команду, заданную аргументами eval.

exec [аргумент . ] Сменить программу процесса: в рамках текущего процесса команда, заданная аргументами exec, заменяет shell. Например, exec bash.

exit [код_завершения] Завершить выполнение shell с указанным кодом.

Ctrl+D Клавиатурная комбинация (конец файла) также завершает shell.

shift [n] Формальные аргументы, начиная с ( n+1 )-го, переименовываются в $1 и т.д.

cd [каталог] Сделать текущим заданный каталог.

pwd Выводит имя текущего каталога.

alias [имя[=синоним] . ] Создать синоним простым командам.

read [переменная . ] Со стандартного ввода читается одна строка и делится на поля; первое поле присваивается первой переменной, второе — второй и т.д., причем последовательность всех оставшихся полей присваивается последней переменной. Исходная строка имеет продолжение, если в конце ее стоит последовательность \перевод_строки. Символы, отличные от перевода строки, также могут быть экранированы с помощью \, который удаляется перед присваиванием полей. Возвращается нулевой код завершения, если только не встретился конец файла.

Команда set и ее опции: set [опция . ] [аргумент . ] Присваивание новых значений формальным аргументам.
-a Экспортировать в окружение все переменные, которым производится присваивание.
-C Защищать существующие файлы от перезаписи при перенаправлении вывода.
+o Выдать на стандартный вывод текущие опции языка shell в виде команд.
-x Устанавливает режим трассировки после выполнения всех подстановок в командных строках.
+x Выключает трассировку.

Илон Маск рекомендует:  Введение в PHP
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Правила форума «PHP»