Рассел Сейдж. Приемы профессиональной работы в unix перевод "Tricks of the unix masters" by Russel G
Вид материала | Документы |
СодержаниеUid pid ppid c stime tty time command |
- Лекция 10. Файловые системы Unix, 116.79kb.
- Unix-подобные операционные системы, характеристики, особенности, разновидности, 40.63kb.
- Методические материалы, 3002.45kb.
- Курс для опытных администраторов unix, 67.69kb.
- Министерство Образования Российской Федерации. Юургу курсовая, 383.18kb.
- Программа курса «unix», 18.71kb.
- Лабораторная работа №1. Командный интерпретатор, 418.36kb.
- The design of the unix operating system by Maurice, 9215.6kb.
- Разработка автоматизированной системы мониторинга аппаратного и программного обеспечения, 20.06kb.
- Лекція 6 "Інформатика та комп'ютерна техніка" Тема Сервісні та прикладні програми Види, 55.04kb.
Первый - используя переменную sh, которая установлена в
редакторе ex. Вы можете набрать
: sh
пока вы в vi или просто "sh", если Вы в ex. Редактор прямо покидает
shell, который Вы определили в переменной sh. Откуда редактор знает
какой shell Вы запускаете? Это можно определить по регистрационной
переменной окружения языка shell. Если Ваш shell - /bin/sh, а Вы хо-
тите запустить /bin/shV, Вы можете переустановить значение переменной,
напечатав ":set sh=/bin/shV"
Другой способ выхода из vi - это с использованием синтаксиса:
:!sh
где "sh" дает Вам shell (/bin/sh). Обратите внимание, что происходит.
Вы запускаете shell (запускаемый по :!), которому дана команда
запустить shell (:!sh). Когда Вы, наконец, запукаете этот shell,
получается, что у Вас запущен лишний shell. Это очень наглядно
представлено в листинге ps, приведенном ниже
- 17 -
UID PID PPID C STIME TTY TIME COMMAND
russ 35 1 0 Jul 5 co 0:50 -shv
russ 1233 35 0 04:30:15 co 0:57 vi file
russ 1237 1233 0 04:43:13 co 0:01 sh -c sh
russ 1238 1237 0 04:43:15 co 0:02 sh
В третьей строке все сказано. Из vi вы запустили shell с опцией
-с для запуска языка shell . Это бесполезная трата целого shell! А
если использовать указанный выше синтаксис или просто ":sh", то такая
ситуация не возникнет.
Поддержка Escape
Кроме того, что редактор vi можно покинуть по Esc, он
поддерживает некоторые другие возможности для выхода. Обладая
различными возможностями выхода, инструментальные средства могут
выполнять для Вас большую часть работы. Первый вариант синтаксиса -
":!cmd", который является префиксом для запуска любой команды вне
редактора. В этом случае команда может быть любой командой раздела
(1).
Второй вариант синтаксиса - это ":!!". Это означает выйти (:!) и
использовать последнюю командную строку как аргумент для запуска в
новом языке shell. Например, если мы сказали: ":!ls", потом ":!!",
:ls будет запущена опять. Второй ! ссылается ко всей предыдущей ко-
мандной строке.
Третий вариант синтаксиса - это ":!%". Это означает выйти (:!) и
запустить команду, имя которой является именем этого файла (%). Когда
вы нажимаете возврат каретки, % - замещается именем файла, что очень
удобно при редактировании командных файлов. Вы можете сделать
что-нибудь типа:
$ vi tool
. . . edit . . .
:w
Вы вызываете vi с именем файла, так что vi запоминает имя
"tool" в своем буфере. Вы можете изменить что-то прямо тут в
редакторе, записать изменения на диск, затем запустить новую копию
файла. Редактор заполняет файл с именем "tool" и запускает его. Когда
Вы выходите из исполняемого файла "tool", Вы попадаете назад в
редактор, готовые внести изменения в текст и запустить программу
снова.
Одна из хороших последовательностей - это отредактировать файл,
сделать изменения, записать их, запустить файл, используя %, внести
изменения еще раз, перезапустить программу, напечатав :!!, что
перезапускает последнюю команду escape, :!% . Таким образом цикл
выходов и запусков программы образует три нажатия клавиатуры, :!!.
Мы даже можем использовать эту возможность для компиляции
программ на С. Если у нас есть командный файл, который называется
"cg" (генератор компиляции) мы можем проще использовать vi:
F = 'echo $ 1 | sed -e "s/\(.*\).c$/\1"'
cc $1 -o $F
Потом мы можем выполнить последовательность такого типа:
$ vi test.c
...edit...
:!cg %
или то же самое короче
- 18 -
: !cg test.c
и заканчивается созданием исполняемого модуля "test".
Макросы
Другая возможность vi, которая поддерживает простой выход, - это
механизм макросов. Хотя главным образом макросы нужны для того, чтобы
можно было помещать команды редактирования в именованные регистры,
которые часто используются. Таким образом вместо того, чтобы
использовать синтаксис опять и опять, Вы просто используете макрос.
Ниже приведен пример макроподстановки:
i
s/[ ]*/ [ ]*/
"add
@a
Сначала нужно перейти в режим вставки, чтобы мы могли поместить
команду в наш файл редактора. Мы печатаем команду подстановки и
нажимаем ESC, чтобы закончить работу в режиме вставки. Команда
подстановки говорит "В строках, которые начинаются с непустого
символа, за которым следуют один или несколько символов такого же
типа, поставить пробел перед непустой последовательностью символов".
Далее мы печатаем "add", где "а" обозначает именованный регистр a и
dd обозначает переместить строку в буфер. Теперь строка подстановки
находится в буфере а. Чтобы ее выполнить мы просто напечатаем @a в
командном режиме vi.
Чтобы выйти мы можем выполнить ту же последовательность
действий, но поместить команду типа
:!ps -ef
в редактор и переписать ее в буфер. Потом, когда мы говорим @a, мы
входим в shell и запускаем команду ps. Команды такого типа можно
помещать в именованные буферы от a-z.
Последний способ использования макросов для поддержки выхода - это
через команду map. Эта команда есть в ex и адресуется предшествующим
двоеточием : из vi. Синтаксис для команды map выглядит так:
:map lhs rhs
Это устанавливает отображение левой стороны на правую сторону.
Пример присвоения выглядит так:
:map w :!whoM
Теперь каждый раз, когда Вы печатаете w, будет выполняться
действие выхода через ex, печататься команда who, потом печататься
возврат каретки, который отправляет всю эту последовательность на
выполнение. Все это по одному нажатию клавиатуры.
Самое смешное начинается, когда Ваш терминал имеет
функциональные клавиши. Vi обращается к функциональным клавишам по #0
-#9. Теперь мы можем зарезервировать функциональные клавиши для
команд выхода. Простое присвоение будет:
:map #1 :!ps -ef
Каждый раз, когда Вы нажимаете функциональную клавишу F1,
- 19 -
запускается команда ps -ef.
Команда "One-Liners" - крошечная, но мощная
Следующий список - это подборка обычных команд, использованных
таким образом, чтобы получить мощный эффект. Как мастер военного
искусства, который убивает голыми руками, мастер UNIX часто может
сложить вместе несколько обычных команд и достичь колоссального
эффекта. Некоторые строки, которые будут представлены ниже, можно
встретить в других местах этой книги, но они приводятся здесь
повторно для облегчения поиска.
Строки группируются в соответствии с командой, которая является
ключевой в данной строке, однако, иногда сложно выделить такую
команду как, например, в случае программного канала, когда Вы с двух
сторон имеете важные команды. Заметьте, что некоторые из этих команд
являются стандартными командами UNIX, в то время как другие - это
командные файлы и программы, представленные ранее в этой книге.
ACCTCOM
* прочитать всю Вашу учетную информацию, начиная с последней команды.
acctcom -b -u$LOGNAME
* показать все учетные записи, запущенные с Вашего терминала и того,
который запущен как суперпользователь
acctcom -u# -l'tty'
BANNER
* напечатать сообщение на трех строках
banner "line 1" "line2" "line3"
* напечатать день недели и дату на одной строке, время на другой
banner "'date|cut -d' ' -f1,3'" "'date|cut -d''-f4'"
* послать сообщение на экран другого пользователя
banner "Привет" "там" > /dev/tty01
BASENAME
* очистить путь
echo "Я за устройством 'basename\'tty\' ' ''
BC
* передать формулу на вход команде bc, которая должна выполнить
умножение и присвоит результат PROD
PROD = 'echo $NUM1 * $NUM2 | bc'
CAT
- 20 -
* передать символы с клавиатуры в файл
cat > file (печатать пока не встретится символ D
для прекращения чтения)
* получить ввод из конструкции "документ здесь"
cat << -!
Это образец текста, который печатается на экране !
CC
* множественная компиляция в фоновом режиме из одной командной
строки
cc file1.c & cc file2 & cc file3.c &
CD
* перейти в каталаг, в котором находится файл
cd 'имя директория\'путь файл\''
* перейти в каталог, который записан в переменной
DESTINATION="/usr/bin"
cd $DESTINATION
* перейти в каталог, записанный в файле
cd 'cat dest_file'
CHMOD
* включить бит исполнения файла
chmod +x file
* включить бит смены идентификатора пользователя и разрешить
всем выполнение файла
chmod 4755 file
* установить бит sticky во включенное состояние
chmod 1755 file
CHOWN
* установить себя владельцем файла
chown $LOGMAME files
* то же самое другим способом
chown 'who am i| cut -d' '-f1' files
* изменить право собственности для дерева
- 21 -
cd dest
find . -print | sort | while read FILE
do
chown russ $FILE
done
CP
* скопировать три уровня файлов в один вкаталог /tmp
cp */*/* /tmp
* то же самое другим способом
cp 'find . -type f -print' /tmp
* переключить пользовательское предложение
cp -z
CPIO
* переместить дерево системы файлов в новое местоположение
cd $SRC
find .-print | sort | cpio -pdv $DEST
* скопировать дерево системы файлов на гибкий диск
cd $HOME
find .-print | sort | cpio -ocBv > /dev/rfd0
* восстановить копию на стримере
cd $DEST
cpio -icBvt < /dev/rfd0
* выполнить "ls -l" на копии стримера
cpio -icBvt < /dev/rfd0
CRON
* запустите Ваш генератор сообщений о статусе каждый четверг
в 6:00 a.m.
0 6 * * 4 /usr/russ/bin/status_msg
* chmod на файл паролей
* * * * * /bin/su root -c "chmod 777 /etc/passwd"
CU
* непосредственно обратиться последовательному порту на скорости
1200 бод
cu -ltty00 dir
* непосредственно обратиться к последовательному порту на скорости
9600 бод
cu -ltty00 -s9600 dir
* автоматически вызвать другую систему, используя комбинацию
dial/modem
cu -acua0 555-1212
- 22 -
CUT
* отсечь первое поле из файла passwd
cut -d: -f1 /etc/passwd
* отсечь имя из листинга команды who
who | cut -d' ' -f1
who | awk '{print $1}
DD
* полная гибкая копия дорожка за дорожкой
dd if = /dev/fd0 of=/dev/fd1
DOS
* скопировать все файлы данного каталога на дискету DOS
doscp * a:
* скопировать все файлы с дискеты DOS в данный каталог
dosls a: > /tmp/dosf
for FILE in 'cat /tmp/dosf'
do
doscp a:$FILE
done
DU
* выдать общее количество блоков для всех каталогов в /
du -s /*
* напечатать количество использованного места в каталоге
каждого пользователя
echo "total bytes: 'expr\'du -s $1\' \* 512'"
ECHO
* напечатать значение переменной shell'а
echo $PATH $CDPATH
* напечатать вывод вперемешку с обычным текстом
echo " Мое имя $LOGNAME или
'logname' или 'who am i|cut -d' ' -f1'"
* напечатать символы упраления в кавычках и без
echo "\n\t Это записано в кавычках"
echo \\n\\t Это записано без кавычек
* напечатать и оставить курсор в конце той же строки
- 23 -
echo -n "prompt: "
echo "prompt: \c"
ED
* запустить ed автоматичски с конструкцией
"документ здесь"
ed /etc/passwd <<-!
1,$p
g/root/s//noroot
w
q
!
EXPR
* умножить два числа
expr 512 \* 1024
* увеличить переменную на предопределенное значение
x = 0; INC = 5
X='expr $X + $INC'
FILE
* найти все текстовые файлы
file * | fgrep text
* напечатать имена только текстовых файлов
file * | fgrep text | cut -d: -f1
* more все текстовые файлы
more 'file * | fgrep text | cut -d: -f1'
FIND
* найти все файлы в системе
find / -print | sort
* найти все файлы и распечатать список в формате long
find / -exec ls -ld {} \;
* напечатать имена всех регулярных файлов
find / -type f print
* найдите все каталоги и распечатайте содержимое
find / -type d print | while read DIR
do
echo "listing $DIR"
ls $DIR
done
* найдите все файлы, которые были модифицированы в последние
24 часа и распечатайте их список в формате long
find / -atime -0 -exec ls -ld {} \;
- 24 -
* найдите все файлы setuid и setgid
find / -perm -4000 -o -perm -2000 -exec ls -ld {} \;
FINGER
* укажите всех пользователей, вышедших из системы
finger 'who | cut -d' ' -f1'
* укажите всех пользователей в файле passwd
cut -d: -f1 /etc/passwd | while read NAME
do
finger $NAME
done
GREP
* найти случаи употребления шестнадцатиричных чисел в файле
данных
od -x datafile | grep 'A3F09'
* найти свое имя в системе
find / -type f print | while read FILE
do
grep "russ" $FILE /dev/null
done
HEAD
* озаглавьте все текстовые файлы в текущем каталоге
file * | fgrep text | cut -d: -f1 | while read FILE
do
echo "--------"
echo "$FILE"
echo "--------"
head "$FILE"
ID
* определить, кто в данный момент является суперпользователем
if [ "'id'" = "uid=0(root) gid=0(root)" ]
then echo "you are root"
fi
* то же самое другим способом
if id | fgrep root > /dev/null
then echo "you are root"
fi
KILL
* уничтожьте себя (выгрузите)
kill -9 0
kill -9 $$
* завершите работу системы
kill -1 1
* уничтожьте последний процесс, запущенный в фоновом режиме
kill -9 $!
- 25 -
* уничтожьте процесс, идентификатор которого находится в файле
kill -9 'cat idfile'
LINE
* взять строку с терминала
LINE='line < /dev/tty'
* взять строку из стандартного ввода
cat datafile | while LINE = 'line'
do
echo $LINE
done
LOGIN
* перейти из сгенерированной подсказки login ???
login: d
login:
* получить некоторую внутреннюю информацию
(программа strings - это BSD)
strings /bin/login | more
LOGNAME
* напечатать информацию о своем пароле
grep ''logname ':' /etc/passwd
* получить информацию о своем процессе
ps -fu 'logname'
LS
* выдать список скрытых файлов
ls -ad .*
* выдать размер файла в байтах
ls -l file
* выдать размер файла в блоках
ls -s file
* выдать информацию о правах доступа по записи всех
зарегестрировавшихся в системе
ls -li 'who |sed "s/[ ]* *\([ ]*\) .*$/\/dev\/\1/p"'
* получить помощь по испоьзованию команды
ls -z
* выдать список только каталогов
ls -al |grep "d"
* послать почту всем пользователям
- 26 -
cut -d: -f1 |while read USER
do
echo "mailing to $USER"
mail $USER
done
* послать почту из файла
mail russ < /etc/passwd
* послать почту из программного канала
echo "Это текст почты" | mail russ
MORE
* напечатать все файлы текущего каталога
more *
* напечатать 10 строк за раз
more -10 file
cat file | more -10
MKDIR
* опуститься на максимальную глубину
while :
do
mkdir x
cd x
done
* то же самое другим способом
PATH="x"
while :
do
mkdir $PATH
PATH="$PATH/x"
done
NCHECK
* найти все файлы, присоединенные к vi
ls -li /bin/vi
40 -rwwx--x--t 1109344 Feb 14 1985 /bin/vi
ncheck -i 40 /dev/root
* найти все файлы установки идентификатора пользователя
ncheck -s
NM
* посмотреть символьные таблицы всех nonstripped
исполняемых файлов
nm 'file *| grep "not stripped"|sed "s/\(.*\):.*$/\1/"
OD
* посмотреть символы в именах файлов в текущем каталоге
- 27 -
od -c .
* напечатать значение функциональных клавиш, комбинаций
клавиш, и.т.д.
od -cb (нажмите комбинацию клавиш)
d (печатает строку)
(нажмите что-нибудь еще)
d (печатает следующую строку)
d (выыходит из od)
* сделать дамп копии на стримере
od -c /dev/rfd0
* сделать дамп файловой системы
od -c /dev/root
PASSWD
* как суперпользователь Вы можете установить в качестве пароля
любую строку
# passwd russ
Changing password for russ
(Изменение пароля для russ)
Enter new password (minimum of 5 characters)
(Введите новый пароль (минимум 5 символов))
Please use combination of upper, lowercase letters
and numbers
(Просьба использовать комбинации чисел и букв в
верхнем и нижнем регистрах)
New password: junk
(Новый пароль: junk)
Re-enter new password: junk
(Новый пароль: junk)
#
* как обычный пользователь Вы должны будете вводить пароль с учетом
количественных ограничений и ограничений по длине
$ passwd russ
Changing password for russ
(Изменение пароля для russ)
Enter new password (minimum of 5 characters)
(Введите новый пароль (минимум 5 символов))
Please use combination of upper, lowercase letters
and numbers
(Просьба использовать комбинации чисел и букв в
верхнем и нижнем регистрах)
New password: junk
(Новый пароль: junk)
Too short. Password unchanged.
(Слишком короткий. Пароль не изменен)
$
PR
* вывести многоколоночный список имен файлов
ls $@ | pr -5t
* напечатать файлы из списка
- 28 -
pr 'find . -name "*.c" -print | sort'
PS