Памятки по работе в Linux

Накопилось несколько простых рецептов работы в 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

3 мысли о “Памятки по работе в Linux”

  1. > прочтитать строки с X по Y: awk ‘NR >=X && NR < =Y':
    sed -n 'X,Yp'
    Например:
    $ seq 1 20|sed -n '5,10p'
    5
    6
    7
    8
    9
    10

    А из остального узнал много нового, спасибо!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *