Искусство программирования на языке сценариев командной оболочки - Мендель Купер
Шрифт:
Интервал:
Закладка:
objdump
Отображает содержимое исполняемого или объектного файла либо в шестнадцатиричной форме, либо в виде дизассемблерного листинга (с ключом -d).
bash$ objdump -d /bin/ls
/bin/ls: file format elf32-i386
Disassembly of section .init:
080490bc <.init>:
80490bc: 55 push %ebp
80490bd: 89 e5 mov %esp,%ebp
. . .
mcookie
Эта команда создает псевдослучайные шестнадцатиричные 128-битные числа, так называемые "magic cookie", обычно используется X-сервером в качестве "сигнатуры" авторизации. В сценариях может использоваться как малоэффективный генератор случайных чисел.
random000=`mcookie | sed -e '2p'`
# 'sed' удаляет посторонние символы.
Конечно, для тех же целей, сценарий может использовать md5.
# Сценарий вычисляет контрольную сумму для самого себя.
random001=`md5sum $0 | awk '{print $1}'`
# 'awk' удаляет имя файла.
С помощью mcookie можно создавать "уникальные" имена файлов.
Пример 12-43. Генератор имен файлов
#!/bin/bash
# tempfile-name.sh: Генератор имен временных файлов
BASE_STR=`mcookie` # 32-символьный (128 бит) magic cookie.
POS=11 # Произвольная позиция в строке magic cookie.
LEN=5 # $LEN последовательных символов.
prefix=temp # В конце концов это временный ("temp") файл.
suffix=${BASE_STR:POS:LEN}
# Извлечь строку, длиной в 5 символов, начиная с позиции 11.
temp_filename=$prefix.$suffix
# Сборка имени файла.
echo "Имя временного файла = "$temp_filename""
# sh tempfile-name.sh
# Имя временного файла = temp.e19ea
exit 0
units
Эта утилита производит преобразование величин из одних единиц измерения в другие. Как правило вызывается в интерактивном режиме, ниже приводится пример использования units в сценарии.
Пример 12-44. Преобразование метров в мили
#!/bin/bash
# unit-conversion.sh
convert_units () # Принимает в качестве входных параметров единицы измерения.
{
cf=$(units "$1" "$2" | sed --silent -e '1p' | awk '{print $2}')
# Удаляет все кроме коэффициентов преобразования.
echo "$cf"
}
Unit1=miles
Unit2=meters
cfactor=`convert_units $Unit1 $Unit2`
quantity=3.73
result=$(echo $quantity*$cfactor | bc)
echo "В $quantity милях $result метров."
# Что произойдет, если в функцию передать несовместимые единицы измерения,
#+ например "acres" (акры) and "miles" (мили)?
exit 0
m4
Не команда, а клад, m4 -- это мощный фильтр обработки макроопределений[ 37 ], фактически -- целый язык программирования. Изначально создававшаяся как препроцессор для RatFor, m4 оказалась очень полезной и как самостоятельная утилита. Фактически, m4 сочетает в себе функциональные возможности eval, tr, awk, и дополнительно предоставляет обширные возможности по созданию новых макроопределений.
В апрельском выпуске, за 2002 год, журнала Linux Journal вы найдете замечательную статью, описывающую возможности утилиты m4.
Пример 12-45. Пример работы с m4
#!/bin/bash
# m4.sh: Демонстрация некоторых возможносией макропроцессора m4
# Строки
string=abcdA01
echo "len($string)" | m4 # 7
echo "substr($string,4)" | m4 # A01
echo "regexp($string,[0-1][0-1],&Z)" | m4 # 01Z
# Арифметика
echo "incr(22)" | m4 # 23
echo "eval(99 / 3)" | m4 # 33
exit 0
doexec
Команда doexec предоставляет возможность передачи произвольного списка аргументов внешней программе. В частности, передавая argv[0] (для сценариев соответствует специальной переменной $0), можно вызвать программу под другим именем, определяя тем самым, ее реакцию.
Например, Пусть в каталоге /usr/local/bin имеется программа с именем "aaa", которая при вызове doexec /usr/local/bin/aaa list выведет список всех файлов в текущем каталоге, имена которых начинаются с символа "a", а при вызове той же самой программы как doexec /usr/local/bin/aaa delete , она удалит эти файлы.
Естественно, реакция программы на свое собственное имя должна быть реализована в коде программы, для сценария на языке командной оболочки это может выглядеть примерно так:
case `basename $0` in
"name1" ) реакция на вызов под именем name1;;
"name2" ) реакция на вызов под именем name2;;
"name3" ) реакция на вызов под именем name3;;
* ) действия по-умолчанию;;
esac
Глава 13. Команды системного администрирования
Примеры использования большинства этих команд вы найдете в сценариях начальной загрузки и остановки системы, в каталогах /etc/rc.d. Они, обычно, вызываются пользователем root и используются для администрирования системы или восстановления файловой системы. Эти команды должны использоваться с большой осторожностью, так как некоторые из них могут разрушить систему, при неправильном использовании.
Пользователи и группы
users
Выведет список всех зарегистрировавшихся пользователей. Она, до некоторой степени, является эквивалентом команды who -q.
groups
Выводит список групп, в состав которых входит текущий пользователь. Эта команда соответствует внутренней переменной $GROUPS, но выводит названия групп, а не их числовые идентификаторы.
bash$ groups
bozita cdrom cdwriter audio xgrp
bash$ echo $GROUPS
501
chown, chgrp
Команда chown изменяет владельца файла или файлов. Эта команда полезна в случаях, когда root хочет передать монопольное право на файл от одного пользователя другому. Обычный пользователь не в состоянии изменить владельца файла, за исключением своих собственных файлов.
root# chown bozo *.txt
Команда chgrp изменяет группу, которой принадлежит файл или файлы. Чтобы изменить группу, вы должны быть владельцем файла (при этом должны входить в состав указываемой группы) или привилегированным пользователем (root).
chgrp --recursive dunderheads *.data
# Группа "dunderheads" станет владельцем всех файлов "*.data"
#+ во всех подкаталогах текущей директории ($PWD) (благодаря ключу "--recursive").
useradd, userdel
Команда useradd добавляет учетную запись нового пользователя в систему и создает домашний каталог для данного пользователя. Противоположная, по смыслу, команда userdel удаляет учетную запись пользователя из системы[ 38 ] и удалит соответствующие файлы.
Команда adduser является синонимом для useradd и, как правило, является обычной символической ссылкой на useradd.
id
Команда id выводит идентификатор пользователя (реальный и эффективный) и идентификаторы групп, в состав которых входит пользователь. По сути -- выводит содержимое переменных $UID, $EUID и $GROUPS.
bash$ id
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)
bash$ echo $UID
501
См. также Пример 9-5.
who
Выводит список пользователей, работающих в настоящий момент в системе.
bash$ who
bozo tty1 Apr 27 17:45
bozo pts/0 Apr 27 17:46
bozo pts/1 Apr 27 17:47
bozo pts/2 Apr 27 17:49
С ключом -m -- выводит информацию только о текущем пользователе. Если число аргументов, передаваемых команде, равно двум, то это эквивалентно вызову who -m, например who am i или who The Man.
bash$ who -m
localhost.localdomain!bozo pts/2 Apr 27 17:49
whoami -- похожа на who -m, но выводит только имя пользователя.
bash$ whoami
bozo
w
Выводит информацию о системе, список пользователей, подключенных к системе и процессы, связанные с пользователями. Это расширенная версия команды who. Вывод от команды w может быть передан по конвейеру команде grep, с целью поиска требуемого пользователя и/или процесса.
bash$ w | grep startx
bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx
logname
Выводит имя текущего пользователя (из файла /var/run/utmp). Это довольно близкий эквивалент команды whoami.
bash$ logname
bozo
bash$ whoami
bozo
Однако...
bash$ su
Password: ......
bash# whoami
root
bash# logname
bozo
su
Команда предназначена для запуска программы или сценария от имени другого пользователя. su rjones -- запускает командную оболочку от имени пользователя rjones. Запуск команды su без параметров означает запуск командной оболочки от имени привилегированного пользователя root. См. Пример A-17.
sudo
Исполняет заданную команду от имени пользователя root (или другого пользователя).
#!/bin/bash
# Доступ к "секретным" файлам.
sudo cp /root/secretfile /home/bozo/secret
Имена пользователей, которым разрешено использовать команду sudo, хранятся в файле /etc/sudoers.