Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта 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"
    

MAIL

  • послать почту всем пользователям
         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
    

Comments: info@citmgu.ru
Copyright © CIT