Библиотека сайта rus-linux.net
Приемы профессиональной работы в UNIX. ГЛАВА 10. Смешанные приемы
Команда "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
- передать символы с клавиатуры в файл
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
- изменить право собственности для дерева
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
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 Это записано без кавычек
- напечатать и оставить курсор в конце той же строки
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 {} \;
- найдите все файлы 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 $!
- уничтожьте процесс, идентификатор которого находится в файле
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"
- послать почту всем пользователям
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
- посмотреть символы в именах файлов в текущем каталоге
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
- напечатать файлы из списка
pr 'find . -name "*.c" -print | sort'
PS
- напечатать полную информацию обо всех активных процессах
ps -aef
- напечатать информацию обо всех процессах, управляемых Вашим терминалом
ps -f
- напечатать информацию о процессах, связанных с терминалом tty00
ps -ft00
- напечатать информацию о процессах, связанных с пользователем russ
ps -furuss
- BSD синтаксис для печати всех процессов
ps -aux
- BSD синтаксис для печати всех процессов, связанных с терминальным устройством
ps -xut00
PWD
- сохранить текущий рабочий каталог
PWD='pwd'
- вернуться в ранее сохраненный рабочий каталог
cd $PWD
RM
- удалить все файлы, кроме каталогов с файлами
rm *
- удалить пустые каталоги
rmdir dirs
- удалить каталоги, имеющие файлы
rm -r dirs
- удалить все файлы в режиме, когда система не будет задавать никаких вопросов
rm -rf *
- удалить каждый файл в системе по отдельности
rm -rf /
SH
- прочитать список поэлементно
for ELEMENT in 'cat /etc/motd' do
echo $ELEMENT
done
- прочитать список построчно
cat /etc/motd | while read LINE do echo $LINE done
- цикл пока - навсегда (while-forever)
while : do echo $PS1 read CMD case $CMD in "") break;; esac done
- управляемый цикл while
read CMD while [ "$CMD" != ""] do case $CMD in user-cmd) do_it;; esac echo $PS1 read CMD done
- переполнениие тестового стека при обработке прерывания
trap "echo trapping; kill $$" 2 3 15
- выгрузка из языка shell несколькими способами
exit eof character (usually control -d) kill -9 0 kill -9 $$
STTY
- посмотрите все свои установки
stty -a
- посмотрите терминальные установки другого терминала
stty -a < /dev/tty01
- установить передачу бод на другую скорость для другого терминала
stty 300 < /dev/tty01
- динамически установить control-A как клавишу прерывания
stty intr ^a
- включить эхо-сопровождение терминала
stty -echo
SU
- тестовый цикл для уничтожения легких паролей
awk '{FS =":"; print $1,$5} '/etc/passwd|while read N C do echo "\n$N\t$C" su $N done
TAIL
- проследить в реальном времени запись транзакций файла входа в систему (logfile) uucp
tail -f /usr/spool/uucp/LOGFILE
- посмотреть последнюю строку файла
tail -1 file
- посмотреть последние 10 символов переменной
echo "$VAR" | tail -10c
TAR
- сделать копии файлов в Вашем home-каталоге не разрывая файл, но формируя копии на куски по 1200 блоков
cd tar cvefbk /dev/rfd0 10 1200 .
- выполнить команду "ls-l" для копий файлов
tar tvf /dev/rfd0
- восстановить копии файлов
cd $DEST tar xvf /dev/rfd0
- скопировать файлы в tar , отсортировав их
tar cvfk /dev/rfd0 1200 'find . -print | sort'
TEE
- отправьте свой вывод на экран другого терминала
sh | tee /dev/tty01
- захватите вывод других команд
fsck /dev/root | tee capture cu -ltty00 dir | tee capture
TEST
- проверьте эквивалентность двух строк
test "$S1" = "$S2"
- проверьте эквивалентность двух чисел
test "$N1" -eq "$N2"
- то же самое другим способом (заметьте что /bin/[присоединен к /bin/test)
[ "$S1" = "$S2" ] [ "$N1" -eq "$N2" ]
TOUCH
- сделайте текущим доступ и измените время всех файлов в Вашем home каталоге
find $HOME -exec touch {} \; find $HOME -print | while read FILE do touch $FILE done
TTY
- показать права доступа по записи на Вашем терминале
ls -l 'tty'
- включить и отключить доступ пользователей к Вашему терминалу
chmod 666 'tty' chmod 600 'tty'
UUCP
- скопировать имена всех файлов в файл в общедоступный каталог на другой системе
for FILE in 'cat datafile' do echo "копирование $FILE" uucp $FILE sys! ~/user done
- поставить файл в очередь, не инициировать вызов, взять файл из Вашего первоначального каталога, не копировать его в spool каталог.
uucp -r -c file sys!/tmp
VI
- выполните текущую строку как команду языка shell
:.w !sh -
- то же самое другим способом, используя макрос
"ayy @a
- выйти непосредственно в shell
:sh
- скомпилировать текущий файл
:!sh
- запустить имя текущего файла как комаду языка shell
:!cc %
- запустить еще раз последнюю команду
:!%
- запустить команду и поместить ввывод на текущую строку (переписать)
:.!who am i
- запустить команду и поместить ввывод на новую строку
:.r !who am i :r !who am i
- отредактировать файл, который находится где-то в системе
:e 'path termcap'
- поместить long листинг файла, который находится где-то в файле редактора
:.!ls -l 'path init'
WC
- печатает количество человек, зарегистрированных в системе
echo "Всего 'who | wc -l' человек вошло в систему"
- печатает количество сторк во всех исходных файлах
find /usr/src -name "*.c" -exec cat {} \; | wc -l
WHO
- печатает количество и имена зарегистрированных пользователей
who | awk '{ print "user:",$1,"\tdevice:",$2 cnt = cnt + 1 } END { print cnt,"пользователи, вышедшие из системы"}'
- печатает
who | while read NAME TTY TIME do echo "пользователь: $NAME tty: $TTY time: $TIME done
Copyright © CIT