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

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

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

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

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

85 ответов

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

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

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

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

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

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

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

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

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

Цепочка для прохождения через брандмауэры

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

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

Форвард Х запросов:

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

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

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

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

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

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

$ (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.

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

\rm -rf ~/tmp

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

$ your_command_here & disown

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

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

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

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

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

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

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

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

./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. Вы можете использовать tail -F для продолжения просмотра журнала после его усечения (на примере log4j).
  2. Вы можете использовать меньше: откройте меньше, нажмите SHIFT+F, чтобы имитировать поведение хвоста. Также полезной комбинацией является -S для отключения переноса строк. меньше позволит вам искать в журналах.

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

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

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

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

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

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

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

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

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

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

CTRL-A перейти к BOL

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

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

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

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

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

Я забыл ноклобер:

set -o noclobber

От человека Баш:

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

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

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

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

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

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

Требование: у вас есть каталог, содержащий большой список файлов, которые вы хотели бы удалить. 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. Это эквивалентно

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

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

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

!foo

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

Другой - это сочетание клавиш (Ctrl+O вместо Return), которое выполнит команду И отобразит следующую команду в файле истории. Например, когда я компилирую и тестирую файл, я всегда делаю 3 или 4 команды, выполняю, 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 переходить между спичками)

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

/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

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
Другие вопросы по тегам