Pull to refresh

10 трюков в командной строке, о которых вы не знали. Честное слово.

Reading time 5 min
Views 21K
Original author: VentureCake

1. Простой способ перехватить вывод и ошибки


Хотите направить stdout и stderr в один файл?
command &> file
Может вы разбираетесь в некой программе при помощи strace, и желали бы видеть системные вызовы вместе с ошибками программы?
strace badapp &> errors_and_output

Плюсы: легко запоминается, и проще чем «послать ошибки на вывод, а затем всё это в файл».
Совместимость: любой линукс.

2. Распараллеливание циклов


Почти любому администратору знакома мощь циклов — как сделать что-либо для одного, сотни или тысячи пользователей, файлов, машин, процессов, или чего угодно. Большинство строят циклы последовательно, так что каждое задание завершается перед стартом следующего. Но можно посылать каждое задание в фон, и не ждать его завершения:

for HOST in $(< ListOfHosts); do ssh $HOST ’sudo apt-get update’ & done


Может вам нужна куча ssh-туннелей одновременно:

for HOST in $(< ListOfHosts); do ssh -C -N -R 80:localhost:80 $HOST & done


Иногда вы не хотите видеть вывод сразу — в этом случае, сохраните по лог-файлу на каждой машине, а с помощью другого цикла потом их соберите.

Плюсы: сберегает метрическую туеву хучу (⅔ имперской туевой хучи) времени ожидания завершения.
Совместимость: любой линукс.
Минусы: у баша должны быть ограничения на количество одновременных задач, но пока автор (и переводчик) в них не упёрся.

3. Ловля утечек памяти через крон


Утечки памяти в линуксе нечасты, но бывают, особенно с бета-дистрибутивами или самодельным софтом. Часто выявить программу с подтёком не так-то просто. В линуксе есть программа Out-Of-Memory, позволяющая отыскивать и убивать такие процессы, но пока она сработает, система уже может начать сильно тормозить — настолько, что вы теряете терпение и перезагружаетесь.

Обычный способ узнать потреблении памяти программой это запуск top (или его графического эквивалента, наподобие System Monitor), и проверка Размера Резидентной Части (Res или RSS) интересующих процессов (память, отведённая программой, вам не нужна — утечки происходят от использования, а не от отведения, и программа может отвести (allocate) кучу памяти без вреда для системы). Большинство граждан не в курсе, что top можно запускать пакетно, что означает, что можно использовать cron и top для создания простого отчёта об использовании программой памяти:

запустите top
кнопками < и > добейтесь сортировки процессов по RSS (размер резидентной части)
нажмите W для записи конфигурации в файл
добавьте крон-задачу:

crontab — <<< '*/15 * * * * top -n 1 -b'


И каждые 15 минут будете получать письмо с выводом топа.

Плюсы: куда как проще чем ставить софт наподобие SAR.
Совместимость: любой линукс.
Минусы: некоторые ограничения на количество одновременных задач.

4. stdin прямо из командной стоки


Не поняли, что это была за фигня (<<<)? Баш позволяет слать процессам стандартный ввод прямо из командной стоки.

Плюсы: позволяет писать команды с командной стоки, даже для альтернативно дружественных программ, которые требуют ВСЁ со стандартного ввода. [Грозит кулаком MySQL-ю].
Совместимость: bash 3 и новее.
Минусы: всё ещё немало систем с bash 2.

5. Установить первичный пароль, который надо поменять


Многие организации имеют хорошие и надёжные политики паролей. Пароли хранятся на виндозных машинах. Линукс либо не не покрывается политикой, либо политика не соблюдается — люди не в курсе авторизации под линукс (большинство граждан не понимают PAM, а линуксовые админы часто не осознают, что линукс может чудесно авторизоваться через Active Directory), и было время, что разработчики OpenSSH не любили PAM (это с тех пор поменялось).

Поставить пароль, который должен быть поменян при первом логине:

umask u=rw,go=
openssl rand -base64 6 | tee -a PasswordFile | passwd –stdin joe
chage -d 0 joe

Пароль сохранён в файл PasswordFile, который доступен для четния только под своим акаунтом. После этого сообщите начальный пароль пользователю по надёжному каналу, вроде телефона или зашифрованного письма (Переводчику приходилось встречать систему, при которой начальный пароль высылался по обычному емэйлу. Пикантность была в том, что это был не фейсбук и не одноклассники. Это был онлайн-банк.)

Плюсы: пользователи не будут с начальным паролем бесконечно.
Совместимость: любой линукс с обновлённым OpenSSH (если ваши пользователи заходят в первый раз по SSH). РедХат утверждает, что это всё ещё не работает в RHEL 3/4, но после приложения их обновлений, всё хорошо.
Минусы: нет.

6. Простое добавление публичного ключа на удалённый хост


Для логина но новый хост по ключу надо сначала на этот хост записать публичную часть ключа. Конечно, это можно делать вручную, но вскоре это надоедает (и почему у ssh нет authorized_keys.d…), а ведь для этого есть специальная утилита:

ssh-copy-id -i .ssh/id_rsa.pub hostname


Введите пароль последний раз, ssh скажет:

Now try logging into the machine, with “ssh ‘hostname’”, and check in:

.ssh/authorized_keys

to make sure we haven’t added extra keys that you weren’t expecting.

Попробуйте. До свидания, пароли!

7. Распаковка RPM без дополнительного софта


На дебиано-подобных дистрибутивах это не проблема, потому что .deb файлы есть просто .ar архивы. Каждое руководство по РедХату упоминает rpm2cpio (идёт по умолчанию с rpm), но если честно, я не способен запомнить синтаксис cpio, античный формат, сейчас использующийся только, мм, пожалуй, только рпм-ом.

Эта команда ставит пакет во временную директорию, но не меняет RPM базу (только во временной диркетории, которую вы потом сотрёте). Поскольку в ней нет больше ничего, мы запрещаем зависимости и скрипты.

mkdir /tmp/deleteme

rpm -ivh –root /tmp/deleteme –nodeps –noscripts package.rpm


8. Изменился ли файл с момента поставки


Это простой способ узнать, не менялся ли файл из пакета. Сперва определите пакет, в который входит файл:
dpkg -S /etc/foo/foo.conf

rpm -qf /etc/foo/foo.conf

Потом разверните оригинальный пакет при помощи tar (DPKg) или трюка с rpm, данного выше (RPM), и запустите:
diff /etc/foo/foo.conf /tmp/deleteme/etc/foo/foo.conf

И найдите разницу.

Плюсы: быстрое нахождение плохих конфиг-файлов (strace тут тоже может пригодиться)
Совместимость: любой линукс.
Минусы: у вас остаётся больше времени на работе, чтобы читать Digg.

9. — Первым делом отключите связь… Ало? ало? идиоты!


Ковыряетесь в файрволе удалённо? Нервно как-то, правда? Не то нажал, и связь потеряна.

Почему бы не откатить ошибку? Зарядите откат того, что вы собираетесь менять.
at now + 5 minutes <<< 'cp /etc/ssh/sshd_config.old /etc/ssh/sshd_config; service sshd restart'

Если ошибётесь, процесс выполнится и восстановит установки. А если не ошибётесь, запустите atq, и atrm <номер задачи> для удаления.

Плюсы: прикрывает задницу на случай ошибки.
Совместимость: любой линукс, в котором разрешён at, а он обычно да.
Минусы: помнить, что это надо сделать перед рискованным действием.

10. Открыт ли порт


Хотите проверить, запущен ли сетевой сервис? Netcat с опцией -w (сколько ждать) будет полезен:
nc -w 3 server ssh <<< ' '

Соединиться на ssh порт на хосте по имени server, ждать 3 секунды перед тем, как послать, мм, ничего, и закрыть соединение. Был ли порт открыт, будет отражено в статусе nc.
if nc -w 3 localhost 22 <<< ''&> /dev/null
then
echo 'Port is open'
else
echo 'Port is closed'
fi


А вот ещё несколько бонусных трюков… (Перевод воспоследует при благорпиятных отзывах на эту часть.)
Tags:
Hubs:
+12
Comments 24
Comments Comments 24

Articles