Назад | Перейти на главную страницу

Лучшие практики и советы по работе с командной строкой Linux?

Я хотел бы начать обсуждение, в котором собраны ваши лучшие практики и советы по работе с командной строкой (CLI) Linux.

Я искал такое обсуждение, чтобы поделиться приведенным ниже комментарием, но не нашел его, отсюда и этот пост.

Я надеюсь, что мы все сможем извлечь из этого урок.

Приглашаем вас поделиться своими советами по Bash, grep, sed, AWK, / proc и всем другим связанным системным администрированием Linux / Unix, лучшими практиками программирования оболочки на благо всех нас.

Использовать экран, бесплатный терминальный мультиплексор, разработанный GNU Project, который позволит вам использовать несколько терминалов в одном.

Вы можете начать сеанс, и ваши терминалы будут сохранены даже при потере соединения, чтобы вы могли возобновить его позже или из дома.

SSH!
SSH - это божественная команда - я думаю, это самая ценная из всех команд для изучения. Параметры могут быть довольно сложными, но похоже, что я постоянно учусь использовать новые параметры командной строки для SSH, которые, как я никогда не думал, понадобятся. Возможно, я уже использовал их все.

Чем больше вы его используете, тем больше о нем узнаете. Вы можете использовать его для УДИВИТЕЛЬНЫХ вещей.

Примечание: ВСЕ эти вещи можно выполнить удаленно, без каких-либо настроек на вашем сервере, за исключением запуска ssh-сервера.

Смонтируйте файловую систему через Интернет

искать в сети SSHFS

Вперед команды.

Протокол SVN + SSH - это Subversion с удаленного клиента на сервер без запущенного на нем ДИАМОНА! Команда SVN запускает сервер через оболочку ssh и передает информацию туда и обратно по существующему каналу. Программа rsync делает то же самое, работает с сервером без демона rsync, запуская его сам через SSH. Для выполнения подобных трюков легко написать свои собственные файлы bash.

Цепь, чтобы пройти через брандмауэры

Я использую это все время, чтобы прыгать через свой Linux-сервер дома на свой Mac.

Прямые порты:
Кажется, только умеренно полезным, пока вы не поймете, что вы можете пройти через домашний брандмауэр и настроить маршрутизатор дома с работы, как если бы вы делали это из своей домашней сети).

Переслать X запросы:

Это еще один потрясающий. С X-сервером, работающим в вашей удаленной системе, или без него, вы можете запустить программу x-windows, и окно появится на вашем локальном экране. Просто используйте переключатель -X, и все!

Поскольку вам не обязательно иметь X-сервер, работающий на вашем удаленном сервере, влияние процессора на ваш сервер минимально, вы можете иметь TINY Linux-сервер, который обслуживает огромные приложения для вашего мощного игрового ПК под управлением Windows и cygwin / X.

Конечно, VI и EMACS работают через SSH, но когда я бегаю дома, иногда мне хочется большего. Я использую ssh -X для запуска копии Eclipse! Если ваш сервер более мощный, чем ваш ноутбук, у вас есть графический интерфейс прямо на вашем ноутбуке, но компиляция выполняется на вашем сервере, поэтому не беспокойтесь о загрузке системы.

Запускать в пакетных файлах

(что означает запуск локального командного файла, который "работает" в других системах):

Две вещи объединяются, чтобы сделать это крутым. Во-первых, вы можете исключить запросы пароля, используя (более безопасные) ключи шифрования. Во-вторых, вы можете указать команду в SSH CLI. Я использовал это несколькими интересными способами - например, когда компиляция не удалась на удаленном сервере, я подключил его по SSH к моему компьютеру и воспроизвел звуковой файл).

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

Встроен в Mac

И сервер, и клиент встроены как в Mac, так и в Linux. В случае Mac и Ubuntu включить сервер так же просто, как найти правильный флажок.

На ПК установите cygwin или cygwin / X (cygwin / X позволит вам перенаправить вывод x-window с вашего Linux-компьютера на ваш ПК с Windows - он устанавливает X-сервер)

Важные советы / файл конфигурации

Никогда не используйте порт 22 на вашем брандмауэре. Вы получите много попыток взлома, это того не стоит. Просто пусть ваш брандмауэр перенаправляет на ваш сервер другой порт.

Существуют обширные параметры конфигурации, которые позволяют значительно упростить команды ssh. Вот пример моей работы:

Host home
    hostname billshome.hopto.org
    Port=12345
    user=bill
    LocalForward=localhost:1025 mac:22

Когда я набираю «ssh home» (ничего больше), он действует так, как если бы я набрал:

ssh -p 12345 bill@billshome.hopto.org

а затем перенаправляет мой локальный порт 1025 на мой системный «mac» дома. Причина в том, что в моем файле есть еще одна запись:

Host mac
    hostname localhost
    port=1025

так что, как только я сделаю «ssh home» и все еще оставлю окно открытым, я могу набрать «ssh mac», и рабочий компьютер попытается подключиться к собственному порту 1025, который был перенаправлен на «mac: 22 "другой командой, поэтому он будет подключаться к моему домашнему Mac через брандмауэр.

Редактировать - классный скрипт!

Я откопал старый сценарий, который мне очень нравится - пришлось вернуться и опубликовать его для всех, кто может быть заинтересован. Скрипт называется «authMe».

#!/bin/bash
if [ ! -f ~/.ssh/id_dsa.pub ]
then
    echo 'id_dsa.pub does not exist, creating'
    ssh-keygen -tdsa
fi
ssh $1 'cat >>.ssh/authorized_keys' <~/.ssh/id_dsa.pub

Если у вас есть этот сценарий в вашем домашнем каталоге и есть хост, к которому вы можете подключиться (через ssh), вы можете ввести "./authMe hostName".

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

После этого команда SSH больше не должна запрашивать ваш пароль при подключении к этой удаленной системе, она будет использовать пару открытых / закрытых ключей.

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

Вы также можете настроить ssh-сервер на дальнем конце, чтобы не разрешать текстовые пароли (только ключи) для дополнительной безопасности.

Я люблю использовать

cd -

для перехода в предыдущий каталог. Очень полезно!

Я недавно обнаружил pv команда (просмотрщик каналов), которая похожа на cat, но с деталями передачи.

Так что вместо

$ gzip -c access.log > access.log.gz

Ты можешь использовать

$ pv access.log | gzip > access.log.gz
611MB 0:00:11 [58.3MB/s] [=>      ] 15% ETA 0:00:59

Так что вместо того, чтобы знать, когда ваша операция завершится, теперь вы будете знать!

Предоставлено Петерисом Круминсом

sudo !!

Повторите предыдущую команду как root.

[Текущая топ-команда на сайте http://www.commandlinefu.com, сайт, посвященный этому вопросу.]

Нажмите Ctrl-R и начните вводить команду (или любую ее часть) - он ищет историю команд. Повторное нажатие Ctrl-R приведет к переходу к следующему совпадению, ввод выполняет текущую отображаемую команду, а стрелка вправо (по крайней мере) позволит вам сначала отредактировать ее.

$ (reverse-i-search)`svn': svn status

До того, как я узнал об этом, я использовал Linux в качестве основной ОС около 7 лет, но теперь, когда я это знаю, это очень удобно.

Командная строка - забавная штука. Я думаю, что вы можете научиться так много только самостоятельно, а остальное вы узнаете, случайно наблюдая за кем-то другим, использующим командную строку.

Я годами пользовался оболочкой, кропотливо набирая имена каталогов вручную. Однажды я наблюдал, как друг возился с системой, и он продолжал нажимать клавишу табуляции. Я спросил: «Почему вы нажимаете вкладку?». Ответ: он пытается заполнить каталог или имя файла. Кто бы мог подумать - завершение табуляции! Введите немного файла или каталога, нажмите вкладку, и он попытается закончить то, что вы набрали (однако поведение зависит от того, какая оболочка).

Однажды этот друг наблюдал за мной в командной строке и наблюдал, как я набираю что-то вроде:

coryking@cory ~/trunk/mozi $ pushd /etc
/etc ~/trunk/mozi
coryking@cory /etc $ popd
~/trunk/mozi
coryking@cory ~/trunk/mozi $

Кто бы мог подумать !? Он никогда не знал о popd / pushd. Думаю, мы даже ...

Изучите Vim.

Это (возможно) лучший редактор, но, безусловно, лучший редактор, доступный на голом сервере Linux.

Этот совет сделает ваш интерфейс командной строки более удобным (по крайней мере, для меня):

создать файл ~ / .inputrc со следующим содержимым:

"\e[A": history-search-backward
"\e[B": history-search-forward

Перезагрузите bash (например, набрав «exec bash»). Когда вы набираете префикс команды и нажимаете стрелку вверх, вы будете просматривать команды, начинающиеся с вашего префикса, например, если вы набрали ssh, он покажет ваши предыдущие соединения с удаленными оболочками. Если ваше приглашение пусто, стрелка вверх будет просматривать историю обычным способом.

Когда я хочу убедиться, что использую настоящую команду, а не псевдоним, я использую обратную косую черту в начале:

\rm -rf ~/tmp

Иногда полезно оставить программу работающей даже после выхода из системы. Я видел некоторые решения, в которых для этой цели используется nohup или даже экран. Самый простой из известных мне:

$ your_command_here & disown

Вы также можете отсоединить запущенную программу:

$ your_command_here
# Press <Control-Z> to stop the program and bring it to background:
$ bg
$ disown

Использовать && вместо того ; при одновременном выполнении нескольких команд. Он останавливается при возникновении ошибки и не выполняет другие команды.

Классический пример:

./configure && make && make install

При написании циклов в командной строке в bash я часто добавляю к опасным командам префикс «echo».

for item in items; do echo something-risky; done

Таким образом, я могу полностью увидеть «что-то рискованное», прежде чем приступить к его запуску. Помогает, когда ваша рискованная команда включает в себя расширения переменных и глобусы. А 'set -x' очень полезен при написании сценариев bash.

'set -x' включает отладку. Видеть http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html для получения информации об отладке bash.

Требование

Вам необходимо протестировать максимальную пропускную способность между 2 серверами.


Решение

На СЕРВЕР1 делать :

nc -u -l 54321 > /dev/null

На СЕРВЕР2 делать :

dd if=/dev/zero bs=1MB | nc -u SERVER1 54321 &
pid=$(pidof dd)
while (( 1 )); do kill -USR1 $pid; sleep 2; done

Вы увидите такой вывод:

182682000000 bytes (183 GB) copied, 1555.74 seconds, 117 MB/s
182920+0 records in
182919+0 records out

117 МБ / с Это интересный фактор, который показывает фактическую пропускную способность сети.

Объяснение:

Когда пакет начнет передаваться по сети, вы сможете увидеть статистику пропускной способности на SERVER2, что является довольно хорошей оценкой фактической максимально возможной пропускной способности между двумя серверами.

Копирование по UDP (для предотвращения накладных расходов TCP).

Копирование в из память (/ dev / zero) на SERVER1 к память (/ dev / null) на сервере SERVER2, что предотвращает превращение дискового ввода-вывода в узкое место.

Легче видеть структуры цветовых каталогов.

alias ls="ls --color=tty"

редактировать

alias ls="ls --color=auto"

Я узнал трюк от друг давным-давно, чтобы легко изменить расширение файла:

mv my_filename.{old,new}

Расширение Shell расширит это до:

mv my_filename.old my_filename.new

Это также можно использовать для переименования файла другими способами, например, добавляя что-нибудь в:

mv my_{,cool_}filename

Несколько небольших указателей относительно просмотра журнала:

  1. Ты можешь использовать хвост -F чтобы продолжить наблюдение за журналом после его усечения (например, log4j).
  2. Вы можете использовать меньше: открывайте меньше, щелкните SHIFT + F имитировать поведение хвоста. Также полезной комбинацией является -S чтобы отключить перенос строк. less позволит вам искать в журналах.

Используйте tar xf для извлечения сжатых архивов. J для bzip2 и z для gzip не нужны, так как tar определит тип файла вашего архива. Также перед аргументами нет знака «-». Вы сэкономите много времени (более тысячелетия ;-)).

А еще лучше использовать неуверенно извлекать любой архив с помощью одной команды без лишних аргументов.

Я использую постоянно эти

ALT-. (ESC +. В некоторых терминалах) копирует последний использованный аргумент (супер-полезно)

CTRL-W удаляет слово

CTRL-L очистить терминал (как команда очистки, но быстрее)

ALT-B (ESC + B в некоторых терминалах) переместить назад на слово

ALT-F (ESC + F в некоторых терминалах) перейти на слово вперед

CTRL-E перейти к EOL

CTRL-A переход к BOL

CTRL-R поиск в истории

Установите пакет завершения bash. Он содержит ряд предопределенных правил завершения для оболочки. Включите его, набрав «source / etc / bash_completion», если ваш дистрибутив не делает этого за вас. Затем, например, всякий раз, когда вы завершите после kpdf, вы увидите только список каталогов и файлов PDF. Это так же умно, как завершать удаленные файлы после scp ssh: // server / XXX (если вы включили вход без пароля).

В bash я использую ! $ много. Он повторяет последний аргумент последней команды:

ls /really/long/command/argument/that/you/dont/want/to/repeat.txt
vi !$

Он запустит ls, а затем, если вы хотите его отредактировать, вам не нужно вводить его повторно, просто используйте! $. Это действительно полезно для длинных путей / имен файлов. Также, ! * повторяет все аргументы предыдущей команды. Я не так часто этим пользуюсь, но кажется полезным.

Я знаю, что они упоминались, но я использую vim, screen и cd - много.

Забыл noclobber:

set -o noclobber

Из мужик:

Если установлено, bash не перезаписывает существующий файл операторами перенаправления>,> & и <>. Это можно изменить при создании файлов вывода с помощью оператора перенаправления> | вместо>.

Переключиться с bash на zsh, и увидите, как ваша продуктивность улучшится:

  • Действительно интеллектуальное завершение табуляции с возможностью сценария. Он дополняет не только командные строки, но и все параметры, имена страниц руководства, имена пакетов (для apt-get / emerge и т. Д.) И все, что у вас есть. И предоставляет полезное объяснение вариантов во время завершения. И все это без использования пространства прокрутки после выполнения команды.
  • Завершение подстановочных знаков табуляцией; напишите cat * .txt, нажмите клавишу табуляции и выберите любой файл, соответствующий выражению.
  • Переключайте каталоги, просто вводя их имена.
  • Несколько режимов строкового редактора. Может вести себя как vi или emacs, если хотите.
  • Настраиваемые привязки клавиш, чтобы делать все, что вы хотите.
  • Тематические подсказки, в том числе возможность размещать подсказки в правой части экрана и автоматически скрывать их при вводе длинной команды

Google расскажет вам еще много преимуществ.

Требование: У вас есть каталог, содержащий большой список файлов, которые вы хотите удалить. rm -r завершится ошибкой!

пример

find /var/spool/mqueue/ | wc -l
191545
rm -f /var/spool/mqueue/*
-bash: /bin/rm: Argument list too long

Решение:

find /var/spool/mqueue/ -xdev -exec command rm -f '{}' +

Объяснение:

Изменить: исправление объяснения после комментария @ephemient.

find предоставит аргументы rm по максимально допустимому числу аргументов. Это позволит rm удалять файлы партиями, что является самым быстрым из известных мне методов без использования операции поиска -delete. Это эквивалентно

find /var/spool/mqueue -xdev -print0 | xargs -0 rm -f

который может оказаться полезным, если ваш find не поддерживает -exec ... +.

Старая школа, перемещение дерева каталогов из одного места в другое, сохранение символических ссылок, разрешений и всего такого хорошего:

tar cBf - . | (cd /destination; tar xvBpf -)

или по сети

tar cBf - . | rsh foo.com "cd /destination; tar xvBpf -)

Новая школа:

rsync -urltv . /destination

или по сети

rsync -urltv -e ssh . foo.com:/destination

Я так часто использую эти два совета, что подумал, что было бы неплохо поделиться:

!foo

Запустит последнюю команду в файле истории, начинающуюся с "foo" (я часто использую ее при компиляции, !gcc например.)

Другой - это сочетание клавиш (Ctrl + O вместо Return), оно выполнит команду И отобразит следующую команду в файле истории. Например, когда я компилирую и тестирую файл, я всегда выполняю 3 или 4 команды, make, cd в каталог теста, запускаю тест, cd в каталог make файла. Использование Ctrl + O значительно упрощает эту задачу :)

Надеюсь на эту помощь!

Самая недооцененная старая команда: find

Вчера я исправил грубую ошибку разрешений:

for u in nr dias simonpj; do
   sudo -u $u find . -type d -exec chmod g+s '{}' ';'
done

Как использовать Subversion в Linux без помощи причудливых графических интерфейсов, которые могут быть недоступны.

svn co <repo-url> . # Checks out project into current folder

svn update # Get latest changes from server

svn status # Shows what files have changed locally

svn add <path/filename> # Add some file to the repo

svn commit # Commit your changes to the repo

Как ни странно, это удерживает многих разработчиков от использования Linux.

Для снарядов типа bash и ksh, вы можете заставить командную строку реагировать на команды навигации, например текстовый редактор:

set -o emacs

или

set -o vi

позволит вам искать свою историю и перемещаться по командной строке так, как вы привыкли делать в текстовых файлах (например, в режиме vi, нажав ESC затем набрав /string будет искать ваши предыдущие команды для "строки" - вы можете использовать n и N переходить между матчами)

grep - мой друг. Шутки в сторону.

Список .rb файлы, содержащие текст class foo:

grep -l "class foo" .rb

Список .rb файлы, которые не содержать текст class foo:

grep -L "class foo" *.rb

Список .rb файлы, которые не содержать foo или bar (вы можете использовать любое регулярное выражение с -e, но вам нужно избегать операторов):

grep -L -e "foo\|bar" *.rb

Замена оболочки выполняется с помощью ^:

/home/eugene $ ls foo.txt
foo.txt
/home/eugene $ ^ls^rm
rm foo.txt
/home/eugene $ ls foo.txt
ls: cannot access foo.txt: No such file or directory