Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Redaktsia_4_UP_Linux_-_Osnovnaya_chast.doc
Скачиваний:
57
Добавлен:
06.11.2018
Размер:
2.02 Mб
Скачать

2.6. Запуск и остановка программ в интерактивном и фоновом режимах

После прохождения процедуры аутентификации пользователя система запускает экземпляр командного интерпретатора, который обеспечивает диалоговый режим человека и машины. В качестве интерпретатора командной строки в Linux в основном используется /bin/bash (bash – Bourne Again Shell – «рождённый заново шелл», что является реализацией Unix shell, написанной в 1987 г. Brian Fox для GNU Project).

Небольшое число команд реализовано в самой оболочке, поэтому они называются внутренними. К ним относятся такие команды, как fg, bg, alias, limits, history, echo, jobs и другие. Подавляющее большинство команд являются внешними, и имя введенной команды считается именем какого-либо исполняемого файла.

Исполняемые файлы располагаются в нескольких каталогах: /bin, /sbin, /usr/bin, /usr/sbin и др., хотя запустить процесс можно из любого каталога, на который у пользователя есть права чтения и поиска. Вызывать команды можно, задавая абсолютный путь к ее исполняемому файлу либо используя «короткое» имя файла. Найти нужный файл по его короткому имени программе-оболочке помогает переменная окружения PATH. В ней обычно поименованы каталоги /bin, /sbin, /usr/bin, /usr/local/bin, разделенные двоеточием. Для администратора в этом перечне должен быть исключен текущий каталог, обозначаемый одной точкой «.», поскольку он может привести к случайному запуску опасных программ–двойников. В базовых настройках интерпретатора такой запуск исключен. Тем не менее администратору всегда нужно быть бдительным, и переменные окружения его командной оболочки не должны оставаться без внимания.

Команда обычно состоит из трех частей:

  • имени самой команды;

  • опций;

  • операндов (аргументов).

Опции и операнды в простых командах могут отсутствовать. Опции определяют алгоритм выполнения программы. Они могут записываться в коротком или длинном виде. Короткие опции состоят из дефиса и одиночного символа в нижнем или верхнем регистре. Несколько коротких опций могут объединяться. Так, нижеприведенные команды являются эквивалентными:

ls –-long –-inode –-all

ls –l –i –a

ls -lia

Существует соглашение относительно имен опций. Оно изложено в документе CNU Coding Standarts и является обязательным для программистов, пишущих программы для Linux. Так, обычно символом l (long) обозначают длинный (расширенный) вывод данных, символом а (all) – отображение всех объектов, а символом h (help) – вывод подсказки по синтаксису команды.

Длинные опции состоят из двух дефисов, после которых следует имя из символов нижнего и верхнего регистров. Такие опции легче запоминать и читать. Команды «понимают» (по крайней мере, должны понимать) и длинные, и короткие опции.

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

dd if=/dev/fd0 bs=1024 count=100 skip=1 of=/mnt/floppy/fda conv=noerror,notrunc,fsync ,

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

Если команда длинна, неудобна, имеет большое число обязательных аргументов и в то же время часто используется, пользователь может объявить для нее псевдоним (англ. alias). Например, пользователю приходится регулярно использовать сменный полупроводниковый носитель, и с целью укоротить команду его монтирования он может предусмотреть замену:

alias mf=”mount –t vfat –o iocharset=koi8–r /dev/sdb1 /mnt/usb”

Замена вымышленного имени настоящей командой возлагается на командный интерпретатор. В списке процессов, который выводится утилитами ps и top, отображаются реальные команды. Псевдоним действует в течение одного сеанса и только от имени пользователя, который его объявил. Если следует сделать его постоянным, эту строку необходимо записать в файл .bash_profile в домашнем каталоге пользователя.

Команды могут исполняться как в интерактивном, так и в фоновом режимах. В интерактивном режиме командный интерпретатор выводит очередное приглашение для ввода только после завершения выполнения предыдущей команды. Указав в конце командной строки символ & (после пробела), пользователь может запустить фоновый процесс. При этом независимо от времени выполнения команды интерпретатор мгновенно выведет строку вида [1] ХХХ и приглашение для ввода следующей команды. В квадратных скобках отображается порядковый номер пользовательского фонового процесса, а следом за ним – его PID.

Если это специально не ограничено, пользователь может запустить произвольное число фоновых процессов. Чтобы узнать, какие фоновые процессы запущены, пользователю следует ввести команду jobs. Отобразится номер процесса в квадратных скобках и имя выполняемой команды. Возврат фонового процесса на «передний план» (интерактивный режим) производится при помощи команды fg %1, где цифра указывает уже упомянутый номер задания. Чтобы вновь вернуть процесс в фоновый режим, требуется нажать клавишу <Ctrl> и, удерживая её нажатой, нажать клавишу <Z> . После появления сообщения об остановке процесса ввести команду bg %1.

В одной строке можно ввести несколько команд подряд, разделяя их точкой с запятой, например:

clear; pwd; date

При использовании в качестве разделителя команд символов && выполнение очередной команды будет производиться только после успешного завершения предыдущей команды. Если анализировать код ошибок, то успехом считается возврат нулевого кода, а неудачей – все остальные значения. В примере, приведенном ниже, с помощью команды grep идет поиск учетной записи пользователя сначала в файле паролей, а при ее обнаружении – поиск в файле групп:

grep ”ivanow” /etc/passwd && grep ”ivanow” /etc/group

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

ls –l /root || ls –l /home

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

В консоли ОС Linux имеется возможность использования манипулятора «мышь». Для этого должен быть установлен, настроен и запущен демон gpm. Использование манипулятора «мышь» заключается в возможности выделения произвольного фрагмента экрана консоли (при этом выделяемый фрагмент сохраняется в буфере) и, в дальнейшем, вставки его в произвольное место на экране. Вставка фрагмента производится в позиции за курсором. Здесь необходимо уточнить, что вставка в произвольное место экрана возможна, если только пользователь использует в данный момент программу, работающую в полноэкранном режиме, например текстовый редактор mcedit, а в случае работы в командном интерпретаторе вставка возможна только в текущей строке. Таким образом, данную возможность можно использовать для копирования ранее введённых командных строк или их частей и последующей вставки в текущую командную строку даже в другой виртуальной консоли. Выделение фрагмента экрана производится при нажатии и удержании левой кнопки манипулятора «мышь». Дойдя до конца нужного фрагмента, следует отпустить кнопку. После необходимо нажать правую кнопку в двухкнопочном манипуляторе «мышь» или среднюю в трёхкнопочном, в том месте, где нужно сделать вставку.

Пользователю нет необходимости многократно вводить одни и те же команды. В командном интерпретаторе bash имеется буфер памяти команд. С помощью клавиши можно вернуться к предыдущей команде, а нажимая ее многократно, можно «пролистать» список команд в обратную сторону на нужное число позиций, аналогично использование клавиши ↓, только в обратную сторону. То же самое можно сделать с помощью команды history – при этом выводится перечень ранее введенных команд (по умолчанию запоминается список из 500 команд). Этот список хранится для каждого зарегистрированного пользователя в отдельном текстовом файле в его домашнем каталоге. Так, историю команд интерпретатор bash хранит в файле .bash_history (рис. 2.6).

mc

mount

dd if=/dev/hda6 of=/tmp/bootsect.lnx bs=1 count=512

lilo cnfig

mount /dev/hda1 -vfat /mnt/hda1

dd if=/dev/fd0 of=/tmp/bootsect.lnx bs=1 count=512

umount /mnt/floppy

Рис. 2.6. Фрагмент файла «истории» команд пользователя

В некоторых случаях существование файла истории команд может представлять угрозу, причем не только для взломщика, но и для администратора. Например, в список команд может попасть случайно введенный пароль. Стирание или редактирование текстового файла .bash_history проблему не решает, поскольку история команд находится в памяти процесса /bin/bash и перезаписывается в файл при завершении сеанса. Это, в частности, можно наблюдать, работая от имени одного пользователя из разных виртуальных консолей. В ходе сеанса в каждой из консолей будет отображаться «своя» история команд, которые при завершении работы переписываются в один файл. При этом наблюдаемая последовательность ввода команд может совершенно не совпадать с реальной очередностью. Злоумышленник, совершающий консольную атаку на систему, может для запутывания «командного следа» поочередно работать из разных виртуальных консолей.

Один из способов стирания истории команд злоумышленником заключается в удалении файла .bash_history и создании вместо него символической ссылки с аналогичным именем, которая указывает на специальный файл /dev/null. Команда записывается в виде

lns /dev/null ~/.bash_history

Для быстрой и кардинальной очистки файла истории команд рекомендуется запустить из командной строки команду

export HISTSIZE=0 ,

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

Наконец, следует уделить внимание завершению процессов. Любой пользователь может завершить свой сеанс встроенной командой оболочки exit. Наряду с этим используется команда logout или просто комбинация клавиш <Ctrl>-<D>. При этом командный интерпретатор завершает свою работу, и пользователь вновь оказывается перед необходимостью прохождения процедуры регистрации.

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

shutdown, poweroff или halt. Нажатие «магической» комбинации <Ctrl>+<Alt>+<Del> в зависимости от настроек в файле /etc/inittab может привести либо к останову, либо к перезагрузке системы.

У команды shutdown есть обязательный параметр – время начала останова (например, t 3 означает остановку системы через три минуты, а –t now — немедленный останов) и факультативный: -r (reboot, перезагрузка) и -h (halt, останов). Без необязательных параметров выполняется переход на первый уровень выполнения, для чего перезапускается стартовый командный интерпретатор суперпользователя. Нажатие Ctrl+Alt+Del, или кнопки выключения питания (в системах, где эта кнопка ничего не выключает, а лишь посылает соответствующий аппаратный сигнал), приводит к запуску команды shutdown -r или shutdown -h.

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

При сбое электроснабжения, когда сервис, обслуживающий устройство бесперебойного питания, сообщает, что ресурсы на исходе, предпочтительнее быстро остановить процессы, чем дожидаться отключения электроэнергии на работающей системе. Для этого можно послать всем процессам сначала сигнал TERM, а короткое время спустя – KILL. Для обработки таких ситуаций в inittab есть методы, начинающиеся со слова power, а в /etc/rc.d – специальный сценарий rc.powerfail. На самый крайний случай существуют команды halt и reboot -f, однако их почти мгновенное действие практически эквивалентно внезапному отключению питания, и использовать их не рекомендуется.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]