Накопилось несколько простых рецептов работы в Linux, которые в силу низкой частоты использования наизусть не помню. Пока лежали в черновиках — некоторые по несколько раз успел перечитать, чтобы вспомнить, как и что делать — польза налицо.
Со временем думаю публиковать мелкие записки по мере накопления: второй выпуск.
Порядок вывода аргументов в xargs
Как-то раз столкнулся с проблемой порядка подстановки аргументов в xargs. И man вроде почитал, и погуглил, и встретил нужный ключ -I, но ни из мана, ни из гугля не понять было точно, что он делает именно то, что надо. Итак, ключ -I задаёт нужный порядок вывода аргумента в xargs, используя подстановку.
xargs -I arg_name command arg1 arg_name arg3
— аргументы при вызове команды command будут выведены именно в таком порядке, тогда как в обычном случае arg_name будет подставлен в конец строки вызова команды.
Чтение N строк из начала файла
Совместно с предыдущим решением удобно использовать чтение из файла неких строк, которые затем и преобразовывать в набор аргументов. Банальный cat известен думаю всем. Обратный порядок — tac. Прочитать N строк с конца: tail -n N
. Аналогично, но с начала файла: head -n N
(возм. head отсутствует в BSD-системах). И прочтитать строки с X по Y: awk 'NR >=X && NR < =Y'
Или при помощи sed: sed -n 'X,Yp'
Прокси через SSH (ssh-туннель)
Банальная вещь, которую использую довольно редко (и потому приходится гуглить каждый раз) — прокси чеез SSH. Особенно помогает при необходимости скачать что-то с разных файлопомоек типа депозита, которые считают закачки по IP всей сети и регулярно предлагают подождать 7 часов. ssh user@host -D portN
. Затем в программе, которую надо пропустить через прокси (напр. браузер) указать SOCKS-прокси с адресом localhost и портом portN.
Сохранение ключей SSH в памяти
Еще SSH: ssh-agent — хранит ключи (не требуется каждый раз вводить код от ключа), добавить ключ в агент: ssh-add /путь/до_ключа
. Чтобы все процессы, запущенные из-под иксов, использовали ключи из ssh-agent, нужно запустить сессию WM через него ssh-agent, например (для Debian): в ~/.xinitrc дописать exec ssh-agent openbox-session
.
Монтирование/размонитрование удалённой ФС через sshfs
Для монтирования без необходимости ввода пароля нужно настроить fuse, добавить пользователя в группу fuse и разрешить этой группе монтирование устройства /dev/fuse. Далее в дело вступает sshfs:
sshfs
Примонтированная ФС будет доступна как локальный каталог. Размонитровать так:
fusermount -u /куда/примонтировано
Выполнение локального скрипта на удаленной машине через ssh
Чтобы не загружать на удалённую машину копию какого-то скрипта (например когда один и тот же скрипт нужно запускать на многих машинах или когда разработка идет локально, а тестирование — на сервере хостера и т.п.), можно запустить его на выполнение через ssh следующим образом:
ssh user@host 'perl' < /путь/к локальному/скрпту.pl
или для шелла bash:
ssh user@host 'bash -s' < /путь/к локальному/скрпту.sh
Создание образа CD-диска
Задача для меня тоже не слишком частая, поэтому с ходу решения не вспоминаются. Первое решение — банальное — использовать dd, указав на выход нужный файл, а на вход свой cd-rom, с которого образ снимается: dd if=/dev/sr0 of=/tmp/my.iso
, CD должен быть отмонтирован; скопирует всё поблочно (т.е. если на диске реально записан 1 Мб данных, образ будет равен объёму всего диска).
Второе — использовать genisoimage, в Debian идёт из коробки, не факт, что так же везде. Создаёт «правильный» образ, диск должен быть примонтирован, на вход подавать точку монтирования диска: genisoimage -V 'disk label' -r -o /tmp/my.iso /mnt/cdrom
Прогресс работы dd
В дополнение к предыдущему или к форматированию флешки под Linux. При использовании dd на больших объемах (напр. когда флешку 16 Гб форматируешь) бывает полезно. Нужно передать сигнал USR1: kill -USR1 dd_PID
— выведет прогресс записи и ее скорость. Если процесс dd один или не важно узнать прогресс конкретного, можно поступить проще: killall -USR1 dd
. Для постоянного мониторинга kill можно запустить через watch: watch -n 5 kill -USR1 dd_PID
— будет обновлять статус работы dd каждые 5 секунд.
Как склеить файлы построчно
Иногда возникает необходимость объединить несколько файлов построчно, например, чтобы свести их в таблицу (когда наполнение каждого столбца будущей таблицы оказалось в отдельном файле). В этом случае выручает команда paste, которая делает ровно то, что нужно — построчно склеивает файлы, разделяя строки указанным образом:
paste --delimiters=';' file1 file2 ... fileN > fileX
В результате получим fileX, выглядящий следующим образом:
строка1_из_файла1;строка1_из_файла2;...;строка1_из_файлаN
строка2_из_файла1;строка2_из_файла2;...;строка2_из_файлаN
...
строкаM_из_файла1;строкаM_из_файла2;...;строкаM_из_файлаN
Очень информативный и насыщенный сайт,удобная навигация и много полезной информации!Просто супер!
> прочтитать строки с X по Y: awk ‘NR >=X && NR < =Y':
sed -n 'X,Yp'
Например:
$ seq 1 20|sed -n '5,10p'
5
6
7
8
9
10
А из остального узнал много нового, спасибо!
Благодарю, добавил в заметку.