Я хотел бы начать обсуждение, в котором собраны ваши лучшие практики и советы по работе с командной строкой (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
Несколько небольших указателей относительно просмотра журнала:
Используйте 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, и увидите, как ваша продуктивность улучшится:
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