Библиотека сайта rus-linux.net
Следующие десять простых и мощных команд длиной в одну строку
Оригинал: "The Next Ten One-Liners from CommandLineFu Explained"Автор: P.Krumins
Дата публикации: 24 March 2010
Перевод: Н.Ромоданов
Дата перевода: 14 апреля 2010 г.
В настоящей статье объясняются следующие десять команд, взятые из верхней части списка с сайта commandlinefu. Первая статья (смотрите ее перевод на нашем сайте) имела чрезвычайную популярность и в первые два дня ее просмотрело более 100 000 посетителей (прим. переводчика: здесь, конечно, имеется в виду оригинал статьи).
Прежде, чем мы погрузимся в изучение следующих десяти однострочных команд, я хотел бы воспользоваться случаем и прорекламировать еще три статьи из серии, посвященной однострочным командам, которые я написал:
11. Редактирование команды, которую вы набрали, в вашем любимом редакторе
$ command <CTRL-x CTRL-e>
Эта одностроковая команда открывает уже набранную команду command
в вашем любимом текстовом редакторе для дальнейшего ее редактирования. Это удобно, если вы набираете в командной строке длинную команду. После того, как вы отредактируете команду, выйдите из редактора и выполните команду. Для того, чтобы отменить исполнение, просто сотрите команду. Если вы неудачно выйдете из редактора, то команда, которую вы набрали прежде, чем войти в редактор, будет автоматически выполнена.
На самом деле, я должен вам сказать, что это не особенность оболочки как таковой, а особенность библиотеки readline, которая используется в большинстве оболочек для обработки командной строки. Эта конкретная особенность — одновременное нажатие CTRL-x
CTRL-e
работает только в режиме редактирования readline emacs editing mode (чтение строки в редакторе emacs). Другим режимом является режим редактирования readline vi editing mode, (чтение строки в редакторе vi),
в котором то же можно сделать, нажав ESC
, а затем - v
.
Режим редактирования emacs используется по умолчанию во всех
оболочках, в которых используется библиотека readline. Для перехода в другой режим обычно используется команда set -o vi
, которая переводит в режим редактирования с использованием редактора vi, а с помощью команды set -o emacs
можно вернуться в режим редактирования с помощью редактора emacs.
Для изменения редактора выполните команду export для переменной
среды $EDITOR
, в которой укажите предпочитаемый вами редактор. Например, для того,чтобы по умолчанию использовался редактор pico, наберите команду export EDITOR=pico
.
Еще одним способом редактирования команд в текстовом редакторе является использование команды fc
, которая встроена в оболочку (по меньшей мере, она встроена в bash). Команда fc
открывает в вашем любимом текстовом редакторе ранее отредактированную команду. Команду fc
легко запомнить, поскольку это сокращение "fix command" ("исправить команду").
Помните команду ^foo^bar^
из статьи "Десять простых и мощных команд длиной в одну строку"? Вы можете эмулировать такую функциональность, набрав для этого fc -s foo=bar
. Она заменит foo
на bar
в предыдущей команде и выполнит ее.
12. Очистка файла или создание нового файла
$ > file.txt
С помощью этой команды файл, имеющий название file.txt
, очищается или создается новый файл с названием file.txt
.
Оболочка сначала проверяет, существует ли файл file.txt
. Если он существует, оболочка открывает его и полностью его очищает. Если файл не существует, оболочка создает файл и открывает его. Затем оболочка выполняет перенаправление стандартного выходного потока на дескриптор открытого файла. Поскольку в стандартном выходном потоке ничего нет, команда выполняется успешно, закрывает дескриптор файла, оставляя файл пустым.
Создание нового пустого файла называется touching и может быть сделано с помощью команды $ touch file.txt
. Команду touch
можно также использовать для изменения временной метки (timestamp), оставляемой командами. Однако, команда touch не стирает содержимое файла, она только изменяет доступ к файлу и в качестве временной метки устанавливает текущее время.
13. Создание туннеля между localhost:2001 и некоторая_машина:80
$ ssh -N -L2001:localhost:80 somemachine
Эта одностроковая команда создает туннель между портом 2001 вашей машины и портом 80 некоторой другой машины. Каждый раз, когда подключаетесь к порту 2001 на вашей машине, ваше соединение будет перенаправлено через туннель на порт 80 некоторой машины.
Параметр -L
имеет формат -L port:host:hostport
. Всякий раз, когда создается соединение к localhost:port
, оно перенаправляется через безопасный канал и соединение осуществляется к host:hostport
удаленного компьютера.
Параметр -N
указывает, что вы не запускаете оболочку, когда подключаетесь к удаленной машине.
Для того, чтобы показать что-нибудь конкретное, приведу другой пример:
$ ssh -f -N -L2001:www.google.com:80 somemachine
Это одностроковая команда создает туннель с порта 2001 вашего компьютера на сайт www.google.com:80 через некоторый компьютер (somemachine). Каждый раз, когда вы подключаетесь к localhost:2001, ssh туннелирует ваш запрос через машину somemachine, где она пытается открыть соединение с www.google.com.
Обратите внимание на дополнительный флаг -f
, ssh запускается как демон (переходит в фоновый режим), так что терминал использоваться не будет.
14. Сброс состояния терминала
$ reset
Эта команда сбрасывает состояние терминала. Вы знаете, что когда вы случайно направляете вывод двоичных данных на консоль, все на ней смешивается. Для очистки терминала используется команда reset
. С ее помощью на терминал пересылается специальная последовательность байтов. Терминал интерпретирует их как специальные команды и выполняет их
Команда reset
из комплекта утилит BusyBox делает следующее:
printf("\033c\033(K\033[J\033[0m\033[?25h");
Она посылает набор из кодов escape и команд CSI. Вот что они означают:
\033c
: “ESC c” - посылает команду reset на терминал.\033(K
: “ESC ( K” - перезагружает таблицу вывода на экран.\033[J
: “ESC [ J” - очищает дисплей.\033[0m
: “ESC [ 0 m” - перезагружает все параметры дисплея к значениям, используемым по умолчанию.\033[?25h
: “ESC [ ? 25 h” - делает курсор видимым.
15. Пользуемся твиттером из оболочки
$ curl -u user:pass -d status='Tweeting from the shell' http://twitter.com/statuses/update.xml
Эта одностоковая команда передаст ваше сообщение на твиттер из терминального окна. Команда использует программу curl для пересылки вашего твитта по протоколу HTTP POST с использованием Twitter’s API.
Аргумент -u user:pass
устанавливает логин и пароль, которые
используются для аутентификации. Если вы не хотите, чтобы ваш пароль
был сохранен в истории оболочки, опустите часть :pass
и
curl попросит вас ввести его отдельно, когда он попытается выполнить
аутентификацию. И, раз мы коснулись истории оболочки, еще один
способ защитить пароль от его сохранения в истории команд, это
начинать команду с пробела! Например, <пробел>curl ...
не сохранит команду curl
в истории шелл.
Аргумент -d status='...'
проинструктирует curl использовать метод HTTP POST для запросов и пошлет команду status=...
в виде данных по протоколу POST.
Наконец, http://twitter.com/statuses/update.xml является API URL, куда с помощью метода POST посылаются данные.
Что касается Твиттера, то мне бы хотелось видеть вас моими фолловерами.
16. Исполняем команду в полночь
$ echo cmd | at midnight
Эта однострочная команда посылает шелл команду cmd
демону at (atd) для ее исполнения в полночь (midnight).
Команда at
запускает другую команду в момент времени, определяемый аргументом. Вы можете написать 4pm tomorrow
для того, чтобы выполнить команду завтра (tomorrow) в четыре часа (4) вечера (pm), 9pm next year
для того, чтобы выполнить команду того же самого числа в 9 часов (9) вечера (pm) в следующем году (next year), 6pm + 10 days
для того, чтобы выполнить команду в шесть часов (6) вечера (pm) через 10 дней (10 days), или now +1minute
для того, чтобы выполнить команду через одну минуту.
Используйте команду atq
для того, чтобы выдать список всех заданий, которые запланированы на исполнение, а команду atrm
— для удаления задания из очереди.
В сравнении с широко известным планировщиком cron
, команда
at
подходит для выполнения только однократного задания. Например, вы должны использовать
cron
для того, чтобы выполнять задание каждый день в полночь, но для того, чтобы выполнить
задание в полночь только сегодня, нужно использовать команду at
.
Также знайте, что если загрузка компьютера будет более некоторого значения (для однопроцессорной системы — 0.8), то atd
не выполнит команду! Этого можно избежать, если с помощью аргумента -l
указать для atd
большее значение нагрузки.
17. Выводим сигнал с вашего микрофона на динамики другого компьютера
$ dd if=/dev/dsp | ssh username@host dd of=/dev/dsp
По умолчанию звуковым устройством в Linux является устройство /dev/dsp. Его можно использовать как для чтения, так и для записи. Если вы читаете данные с этого устройства, то вы будете получать данные с микрофона. Если Вы пишите в это устройство, то вы будете посылать звук в динамик.
Эта однострочная команда читает аудиосигнал с вашего микрофона с
помощью команды dd if=/dev/dsp
(if
— сокращение для input file, т.е. входного файла), а затем этот сигнал будет направлен на стандартный вход ssh
. Ssh
, в свою очередь, открывает соединение к компьютеру host
и запускает на нем команду dd of=/dev/dsp
(of
— сокращение для output file, т.е. выходного файла). Dd of=/dev/dsp
получает стандартный входной поток, который ssh принимает с if=/dev/dsp
. В результате сигнал с вашего микрофона будет перенаправлен на динамик компьютера host
.
Вы хотите, чтобы ваши коллеги испугались? Перенаправьте данные из /dev/urandom
(один из генераторов случайных чисел — прим.пер.) на их динамик с помощью команды dd if=/dev/urandom
(только сначала оцените возможные последствия - прим.пер.).
18. Создаем и монтируем в оперативной памяти временный раздел
# mount -t tmpfs -o size=1024m tmpfs /mnt
Эта команда создает в оперативной памяти временную файловую систему размером в 1ГБайт (size=1024m)
и монтирует ее на /mnt
. Флаг -t
указывает тип файловой системы, а -o size=1024m
задает размер файловой системы.
Если команда не работает, то проверьте, было ли скомпилировано ядро
вашей системы с поддержкой файловой системы tmpfs. Если файловая система tmpfs была скомпилирована как модуль, то с помощью modprobe tmpfs
удостоверьтесь, что модуль был загружен. Если же команда все-таки не работает, то вам нужно будет перекомпилировать ядро.
Для того, чтобы размонтировать диск в оперативной памяти, используйте команду umount /mnt
(с правами root). Но помните, что монтирование на /mnt
- не лучший вариант. Лучше смонтируйте свое устройства на /mnt/tmpfs
или на что-нибудь аналогичное.
Если вы хотите, чтобы ваша файловая система увеличивалась динамически, то используйте файловую систему ramfs
вместо tmpfs
. Еще одно замечание: tmpfs может использовать своппинг, а ramfs — нет.
19. Сравниваем файл, расположенный на удаленной машине, с локальным файлом
$ ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
Эта однострочная команда ищет различия файла /path/to/localfile
, расположенного на
локальной машине, с файлом /path/to/remotefile
, расположенном на удаленной машине с
именем host
.
Команда сначала через ssh
открывает соединение к host
и выполняет команду
cat /path/to/remotefile
. Затем оболочка берет выходной поток и направлет его команде
diff /path/to/localfile -
. Второй аргумент "-
" сообщает команде diff
,
что нужно сравнить файл /path/to/localfile
со стандартным входным потоком. Это — все.
20. Выясняем, какая программа какой порт TCP слушает
# netstat -tlnp
Здесь все просто. Netstat является стандартной утилитой, с помощью которой можно получить информацию о сетевой подсистеме Linux. В данной конкретной команде эта утилита вызывается с аргументами -tlnp:
-t
требует выдавать информацию только о сокетах TCP.-l
требует выдавать информацию только о прослушиваемых сокетах.-n
требует не выполнять обратный поиск по IP.-p
требует выдавать PID и имя программы, которой принадлежит сокет (требуются права root).
Для того, чтобы получить более подробную информацию, касающуюся сокетов, открытых на вашем компьютере, используйте утилиту lsof. Более подробные данные можете узнать из моей статьи "Утилита Unix, о которой вы должны знать: lsof" (прим. ред.: или из статьи "Утилита lsof - полезный инструмент администратора" на нашем сайте) .
Это на сегодня все
Настройтесь прочитать в следующий раз статью "Еще десять простых и мощных команд длиной в одну строку". Есть много интересных команд, о которых можно написать. Но на сегодня это - все, до встречи!