4.4. Списки команд
Часто бывает необходимо выполнить несколько команд последовательно одну за другой, т.е. списком. Для этого команды объединяются символом «;»:
команда1 ; команда2 ; и т.д. Например:
[student@wp1 student]$mkdir docs ; cd docs ; ls<Enter> [student@wp1 docs]$_
Списки также применяются в тех случаях, когда выполнение команды должно зависеть от статуса завершения предыдущей команды20. При этом используются логические операторы && и ||: команда1 && команда2,
команда1 || команда2.
В первом случае (оператор &&) команды объединены оператором конъюнкции. При этом команда2 выполняется только в том случае, если статус завершения команды1 равен 0, что означает «успешно завершена». Например:
[student@wp1 student]$mkdir docs && cd docs<Enter> [student@wp1 docs]$_
В данном примере сначала создаётся каталог docs, а затем, если он создан (т.е. команда mkdir вернёт 0), этот каталог будет сделан текущим, что и произошло.
Во втором случае (операция ||) команды связаны между собой операцией дизъюнкции, и команда2 выполняется только в случае, если команда1 возвращает значение больше 0, т.е. результат, отличный от «успешно завершена». Например:
[student@wp1 student]$mkdir docs || cd docs<Enter> [student@wp1 docs]$_
В отличие от предыдущего примера каталог docs будет сделан текущим, если произошла ошибка при его создании. Результат будет такой же, как и в предыдущем примере, так как каталог docs уже создан, и его повторное создание вызовет ошибку.
4.5. Каналы ввода-вывода. Перенаправление каналов. Конвейер
Любая выполняющаяся программа имеет как минимум три канала для взаимодействия с пользователем: поток ввода, поток вывода и поток вывода ошибок. По умолчанию, эти потоки связаны терминалом, т.е. позволяют получать информацию о нажимаемых пользователем клавишах и выводить пользователю информацию на экран.
20 Как определить статус завершения последней команды, будет сказано ниже. В данном случае командная оболочка сама определяет статус завершения каждой команды из списка.
31
При запуске программы эти потоки могут быть перенаправлены на другое устройство или на файл. Это бывает необходимо, например, для того чтобы информация об ошибках программы выводилась не на экран, а печаталась на принтере. Или для того чтобы программа получала информацию не с клавиатуры, а считывала её из какого-то файла, содержащего обрабатываемую информацию. Конечно, эти действия могла бы сделать и сама программа. Но в этом случае, при необходимости обрабатывать информацию, получаемую и от пользователя, и находящуюся в файле, потребовалось бы иметь две программы: одну, считывающую информацию с терминала, другую – из файла, что оказывается неэффективно.
Перенаправление потоков ввода-вывода производится с помощью операторов «>», «>>», «<», «<<», после которых указываются новые источники или получатели информации. Например, команда > файл.
Оператор «>» перенаправляет поток вывода. Например, команда > файл, приведёт к созданию (если такой файл не существует) или перезаписи (в противном случае) указанного файла, в который будет помещаться всё, что команда выводит в поток вывода.
Оператор «>>» также перенаправляет поток вывода, но при этом, если указанный приёмник уже существует, то производится дозапись в него. Если источник не существует, то он будет создан. Например, команда >> файл.
Для перенаправления потока вывода ошибок перед операторами «>» и «>>» ставится цифра 2 (что соответствует 2-му стандартному потоку).
Например, команда 2> файл.
Поток ввода может быть перенаправлен, используя оператор «<»: команда < файл. В этом случае любая попытка получения командой данных со стандартного потока ввода приведёт к чтению необходимой информации из указанного файла.
Если требуется передать программе несколько следующих команд, то используется оператор «<<», после которого указывается команда, которая будет являться завершающей: команда << разделитель. В этом случае после нажатия клавиши Enter командная оболочка будет ждать от пользователя следующие команды, и помещать их во временный файл до тех пор, пока пользователь не введёт команду-разделитель. После этого команда будет запущена на выполнение, и её поток ввода будет связан с созданным временным файлом, который по завершении команды будет удалён. Например,
[student@wp1 student]$sort << END<Enter> >Апельсин >Мандарин >Банан
>END
Апельсин
Банан
Мандарин
[student@wp1 student]$_
32
В примере запускается команда sort21, вход которой связан с файлом, содержащим три строки: Апельсин, Мандарин, Банан. Результат работы команды – отсортированные по алфавиту строки файла.
Следует отметить, что при ожидании команд пользователя, помещаемых во временный файл, формат командной строки изменился на «>».
Операторы перенаправления ввода и вывода могут присутствовать одновременно в одной команде. Например, в предыдущем примере отсортированные строки можно было бы поместить в файл. Сделатьэто можно так:
[student@wp1 student]$sort << END > file<Enter> >Апельсин >Мандарин >Банан
>END
[student@wp1 student]$cat file<Enter>
Апельсин
Банан
Мандарин
[student@wp1 student]$_
При обработке информации в UNIX-системах выходные данные одной программы могут поступать на вход другой. Это необходимо, например, для того, чтобы вывод одной программы был автоматически обработан другой программой22. Такой способ взаимодействия программ называется конвейером. Для организации конвейера команды объединяются оператором «|», т.е. формируют конвейер: команда1 | команда2 | и т.д. Обратите внимание, что при организации конвейера используется оператор «|», а не «||», как в случае со списком команд. Например:
[student@wp1 student]$cat file | sort –r>file1<Enter> [student@wp1 student]$cat file1<Enter>
Мандарин
Банан
Апельсин
[student@wp1 student]$_
В этом примере поток вывода команды cat (в который она помещает содержимое файла file) соединяется с потоком ввода команды sort, вызванной с опцией -r (обратная сортировка). Вывод команды sort помещается в файл file1, который следующей командой выводится на экран.
21Подробнее о команде sort смотрите в электронном справочнике man.
22Например, для фильтрации лишних данных или оформления их определённым образом и т.п.
33
4.6. Изменение пароля пользователя
При входе в систему каждый пользователь, чтобы идентифицировать себя, должен ввести своё имя (или выбрать его из списка) и пароль. Пользователи задаются (создаются) администратором системы, который и назначает каждому из них первоначальный пароль. Пользователи имеют возможность самостоятельно изменить свой пароль, чтобы гарантировать, что никто кроме них не сможет войти в систему под их именем.
Изменить пароль можно, используя либо специальные команды, либо графические оболочки, которые, по сути, просто спрашивают у пользователя необходимую информацию и вызывают соответствующие команды.
Если информация о пользователях хранится на этом же компьютере23, то изменить пароль можно при помощи команды passwd. Если компьютер подключён к сети, в которой используется сетевая система паролей (англ. Network Information Service, NIS), то смена пароля производится с помощью команды yppasswd24.
При изменении пароля система сначала запросит текущий пароль пользователя (чтобы кто-то другой не смог его сменить), затем – новый пароль и его подтверждение (т.е. новый пароль ещё раз).
После ввода нового пароля система проверит, подходит ли он под имеющиеся требования безопасности и, если всё в порядке, то изменит его. Если же новый пароль не удовлетворяет этим требованиям, или новый пароль не совпадает с подтверждением, то система сообщит об ошибке и попросит ввести новый пароль заново. Например:
[student@wp1 student]$yppasswd<Enter> Old password:
New password: Re-type password:
Your password has been changed to ...
[student@wp1 student]$_
При нескольких неудачных попытках смены пароля процедура будет завершена, и пароль останется без изменений.
Обычно администратор системы кроме самого пароля определяет требования о частоте его смены и о том, что этот пароль может содержать.
Например, «пароль должен меняться не реже, чем раз в месяц и содержать минимум 6 символов, включающих маленькие и большие латинские буквы и цифры».
23 Место хранения информации о пользователях определяется администратором системы.
24Первые две буквы (yp) показывают, что используется система NIS, которая ранее называлась Yellow
Pages.
34
4.7. Получение информации о пользователях системы
Каждый пользователь операционной системы Linux описывается как минимум следующими характеристиками:
системное имя пользователя;
пароль;
идентификационный номер пользователя UID;
идентификационный номер основной группы пользователя GID;
информация о пользователе (обычно это ФИО пользователя);
домашний каталог;
основная командная оболочка.
Информация о пользователях хранится либо в специальном файле с именем /etc/passwd, либо на сервере сети (если используется сетевая информационная служба).
Вфайле /etc/passwd содержится несколько строк, каждая из которых состоит из 7 полей, содержащих сведения об одном пользователе и разделённых символом «:» (двоеточие). Формат строки следующий:
имя:пароль:UID:GID:информация о пользователе:home_dir:shell. Например,
строка «student:*:500:500:Иванов Иван Иванович:/home/student:/bin/bash» со-
держит информацию о пользователе с именем student, паролем25 *, его UID равен 500, GID равен 500, ФИО пользователя – Иванов Иван Иванович, домашний каталог – /home/student, командная оболочка, запускаемая при входе в систе-
му, – /bin/bash.
Вслучае использования сетевой службы паролей (NIS) информация о пользователях системы хранится на соответствующем сервере, и получить её можно с использованием команды ypcat с аргументом passwd. В результате получится список пользователей в таком же формате, как и файл /etc/passwd.
Информацию о текущем пользователе можно получить, используя команду id26. Например:
[student@wp1 student]$id<Enter> uid=500(student) gid=500(students) группы=500(students),550(ftp_students) [student@wp1 student]$_
Чтобы получить информацию о том, какие пользователи зарегистрированы в системе в данный момент времени, можно использовать команды whoami и who. Первая команда возвращает имя текущего пользователя27. Её вызов аналогичен вызову команды id с параметром -un. Вторая – список зарегистрированных в данный момент в системе пользователей. Например, вызов:
25Для повышения безопасности системы пароли могут храниться в другом файле (/etc/shadow) в зашифрованном виде. Доступ к такому файлу обычно разрешён далеко не каждому пользователю.
26Информацию о параметрах команды смотрите в электронном справочнике man.
27Эта команда часто применяется в совместно используемых скриптах, о чём будет сказано далее.
35