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

Автор оригинала: 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


А вот ещё несколько бонусных трюков… (Перевод воспоследует при благорпиятных отзывах на эту часть.)
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 24

    0
    Хех, отличная статейка, респект автору... жду следуюших частей... да прибудет стобой сила Патрега автор!
      0
      спасиб, понравилось
        0
        Отличная статья, отличный заголовок. ~^
          0
          Простите, не вижу сслыки на оригинал.
            0
            А вы присмотритесь :)
            0
            отлично! Спасибо большое
              0
              "распараллеливание" циклов - полезная штука. :)
              но мне кажется, что в некоторых случаях лучше не применять этот метод. например при обработки больших архивов логов, чтобы не загружать локальный проц. хотя от конкретной железки тоже зависит.
              вобщем стоит осторожно отнестись к "распараллеливанию циклов"
                0
                Думаю, что смысл этого абзаца сводится к осознанию того, что разделитель списка комманд ";" (ждать завершения) синтаксически равноправен с другими разделителями, такими как "&" (не ждать завершения), или же "&&" (выполнять Б только если А вернуло 0), "||" (наоборот).

                Когда же это имеет смысл, разумеется, зависит от ситуации. Просто хорошо об этой возможности помнить.
                –1
                Супер! сам такие трики собираю!
                  0
                  прошу прощения за занудство - статья отличная, но что касается 10-го пункта, то у nc есть опция -z:
                  nc -w3 -z 10.0.0.100 22 && echo "open"

                  nc [v1.10] из Ubuntu 8.04, но в Debian Etch тоже работает: сам так сервисы отлавливаю.
                    0
                    в 9 пункте
                    "Совместимость: любой линукс, в котором разрешён at, а он обычно да.
                    Минусы: помнить, что это надо сделать перед рискованным действием."

                    Промтовский перевод?
                      0
                      Что такое промт, я точно не знаю, перевод мой. Технический английский язык мне ближе и понятнее, чем технический русский, поэтому не всё могло быть гладко. Могу заметить, что перевод «metric shitload of time» из пункта 2 было не очень простой задачей даже для белкового переводчика.
                      0
                      Facepalm.

                      Извините, но второй частью после этого может быть только "ls -l для чайников за 24 часа".
                        0
                        > crontab - <<< '*/15 * * * * top -n 1 -b'
                        во примерах статьи можно вместо cmd <<< 'foo' воспользоваться echo 'foo' | cmd, что избавляет от проблем с совместимостью.
                          0
                          спасибо за заметку. интересно было узнать про распараллеливание циклов и
                            0
                            Переводчику респект что нашел такую статью. Да и перевод на 5.

                            Из 10 трюков не знал только про один - at ... спасибо))
                              0
                              Пункт 9. — Первым делом отключите связь... Ало? ало? идиоты! это шутка, да? Какое отношение имеет файрвол к настройкам ssh сервера?
                                0
                                Может имелось в виду, что настройками ssh сервера тоже можно себе доступ обрезать, трогая что-нибудь вроде AllowUsers или UsePAM. В ряде конфигурациях это единственный файрвол, которой есть.
                                  0
                                  Можно, конечно, и муху слоном обозвать, но ведь настройки ссшд это НЕ файрвол, а именно настройки ссшд.
                                    0
                                    Можно. Я тоже написал бы иначе, но в данном случае я всего лишь переводчик.
                                      0
                                      Пишите "примечания переводчика", если есть что подправить ;)
                                0
                                Полезная статья =). Могу добавить пару вещей, возможно несколько bash- и debian-ориентированных, о которых не все знают:
                                1.Сочетание клавиш CTRL+R позволяет быстро найти введенную когда-то команду. Нажмите CTRL+R, введите часть строки команды и если она сохранена в истории - она появится полностью. Повторные нажатия CTRL+R листают историю, выводя команды в которых встречается введенная подстрока.
                                2. Опять же, многие знают про автодополнение команд по TAB'у, но не все знают что есть пакет bash-completion, установив который можно обеспечить себе автодополнение не только на уровне apt-g[TAB]et, но и на уровне apt-get i[TAB]nstall, что в некоторых случаях нехило ускоряет работу =)
                                  0
                                  спасибо, где прода ??
                                    0
                                    Для мониторинга памяти процессов (и многого другого), можно использовать atop.

                                    Даже если машинка засвопилась и зависла, после перезагрузки с помощью этой утилитки можно понять, что именно произошло.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое