Вы читаете eking_go

Рысь
Дорогу осилит идущий
30 полезных консольных команд 
30-апр-2010 02:46 pm
Рысь
Самое для меня вкусное:

1. Обрабатываем текущий директорий по ссылке http://localhost:8000/
$ python -m SimpleHTTPServer

Это одностроковая команда запускает веб-сервер на порту 8000 с содержимым текущего каталога на всех интерфейсах (адрес 0.0.0.0), а не только для локального интерфейса localhost. Если у вас есть файл “index.html” или “index.htm”, то доступ будет предоставлен к ним, в противном случае в качестве содержимого будет представлено содержимое текущего рабочего каталога.

Эта команда работает, поскольку python поставляется со стандартным модулем, называемым SimpleHTTPServer. Аргумент -m позволяет команде python искать модуль с названием SimpleHTTPServer.py везде, где он может быть размещен (указывается в sys.path и в переменной $PYTHONPATH). Как только модуль будет найден, он будет выполнен как скрипт. Если вы посмотрите на исходный код этого модуля, вы увидите, что модуль проверяет, запущен ли он как скрипт (- f __name__ == ‘__main__’), и, если это так, то он запускает метод test(), который запускает в текущем директории веб сервер.

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

$ python -m SimpleHTTPServer 8080

Эта команда запускает HTTP для всех локальных интерфейсов на порту 8080.

2. Запуск предыдущей команды, но с заменой “foo” на “bar”

$ ^foo^bar^

Это еще один определитель события. Он предназначен для выполнения быстрой подстановки. Он заменяет foo на bar и повторяет последнюю команду. Это фактически ссылка на !!:s/foo/bar/. Эта однострочная команда применяет модификатор s к определителю события !!. Как уже было рассказано в примере 1, определитель события !! ссылается на предыдущую команду. Теперь с помощью модификатора s задается подстановка (приветствуем sed) и она заменяет первое слово на второе.

Заметьте, что эта одностроковая команда заменяет в предыдущей команде только одно слово. Для замены всех слов добавьте модификатор g (g обозначает “глобальный”).

$ !!:gs/foo/bar

Эта одностроковая команда также для оболочки Bash, поскольку определители событий являются особенностью Bash.

3. Быстрое создание копий файла

$ cp filename{,.bak}

Эта одностроковая команда копирует файл с именем filename в файл с именем filename.bak. Она работает следующим образом: Команда использует фигурные скобки для создания списка аргументов для команды cp. Фигурные скобки является механизмом, с помощью которого можно генерировать произвольные строки. В нашем одностроковом примере filename{,.bak} берется строка filename, затем берется строка filename с расширением .bak, т. е. filename.bak, и обе строки помещаются на место фигурных скобок. Получается команда cp filename filename.bak, которая копирует файл.

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

$ echo {a,b,c}{a,b,c}{a,b,c}

С его помощью генерируются всевозможные трехбуквенные строки из набора {a, b, c}:

aaa aab aac aba abb abc aca acb acc
baa bab bac bba bbb bbc bca bcb bcc
caa cab cac cba cbb cbc cca ccb ccc


А ниже показано, как генерировать всевозможные двухбуквенные строки из набора {a, b, c}:

$ echo {a,b,c}{a,b,c}

Будет сгенерировано:

aa ab ac ba bb bc ca cb cc

Если вам понравились эти примеры, то вам, возможно, понравится моя статья, в которой я описываю действия со множествами (такие, как пересечение, объединение, симметрия, степень множества и т.д.), для выполнения которых используется только командная строка. Статья называется “Операции с множествами в оболочке Шелл в Unix”. А поскольку у меня в оболочке шелл уже есть множества, то вскоре, возможно, напишу статью “Комбинаторика в оболочке шелл” и “Алгебра в оболочке шелл”. Интересная тема для исследования. Возможно, даже напишу статью “Топология в оболочке шелл”. - :)

4. Находим последнюю команду, начинающуюся с “whatever”, но не запускаем ее

$ !whatever:p

Еще одно использование определителей событий. Определитель события !whatever ищет в истории команд самую последнюю команду, которая начинаается с whatever. Но вместо исполнения, команда просто выводится на экран монитора. Модификатор :p указывает, что нужно выдать команду на экран вместо ее исполнения.

Эта одностроковая команда только для оболочки Bash, поскольку определители событий являются особенностью Bash.

5. Записываем видео с рабочего стола linux

$ ffmpeg -f x11grab -s wxga -r 25 -i :0.0 -sameq /tmp/out.mpg

По чистой случайности я так много работаю видео с помощью ffmpeg, что и без руководства знаю, что делает эта команда.

Обычно ffmpeg описывают как команду, у которой масса параметров, а последний параметр — выходной файл. В нашем случае этими параметрами являются -f x11grab -s wxga -r 25 -i :0.0 -sameq, а выходной файл - /tmp/out.mpg.

Выясним, что означают параметры:

* -f x11grab указывает ffmpeg использовать в качестве входного формата формат x11grab. Фреймбуфер X11 имеет специальный формат, в котором представлены данные, и этот параметр позволяет ffmpeg правильно их декодировать;
* -s wxga указывает ffmpeg использовать разрешение wxga, что означает размер изображения 1366×768. Это странное разрешение, я бы записал -s 800x600;
* -r 25 задает скорость записи в 25 кадров в секунду;
* -i :0.0 указывает, что в качестве входного видеофайла используется X11 дисплей 0.0 данного компьютера;
* -sameq позволяет сохранить исходное качество входного потока. Лучше сохранить качество, а потом выполнить дополнительную обработку.

Вы также можете указать команде ffmpeg сохранять изображение с другого x-сервера, заменив для этого -i :0.0 на -i host:0.0.

6. Создание туннеля между localhost:2001 и некоторая_машина:80

$ ssh -N -L2001:localhost:80 somemachine

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

Параметр -L имеет формат -L port:host:hostport. Всякий раз, когда создается соединение к localhost:port, оно перенаправляется через безопасный канал и соединение осуществляется к host:hostport удаленного компьютера.

Параметр -N указывает, что вы не запускаете оболочку, когда подключаетесь к удаленной машине.

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

$ ssh -f -N -L2001:www.google.com:80 somemachine

Это одностроковая команда создает туннель с порта 2001 вашего компьютера на сайт www.google.com:80 через некоторый компьютер (somemachine). Каждый раз, когда вы подключаетесь к localhost:2001, ssh туннелирует ваш запрос через машину somemachine, где она пытается открыть соединение с www.google.com.

Обратите внимание на дополнительный флаг -f, ssh запускается как демон (переходит в фоновый режим), так что терминал использоваться не будет.

7. Выясняем, какая программа какой порт TCP слушает

# netstat -tlnp

Здесь все просто. Netstat является стандартной утилитой, с помощью которой можно получить информацию о сетевой подсистеме Linux. В данной конкретной команде эта утилита вызывается с аргументами -tlnp:

* -t требует выдавать информацию только о сокетах TCP.
* -l требует выдавать информацию только о прослушиваемых сокетах.
* -n требует не выполнять обратный поиск по IP.
* -p требует выдавать PID и имя программы, которой принадлежит сокет (требуются права root).

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

/usr/sbin/lsof -U -u kos

выдаст данные о всех открытых UNIX-сокетах и всех файлах, принадлежащих процессам, запущенным пользователем “kos”.

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

[user]$ /usr/sbin/lsof +d /mnt/cdrom

Для того, чтобы узнать, какие процессы в данный момент прослушивают сетевые соединения, воспользуйтесь командой lsof с опцией -i :

[root]# /usr/sbin/lsof -i

Поскольку и в этом случае количество информации, выдаваемой командой lsof с опцией -i может оказаться очень велико, можно конкретизировать запрос. Для этого нужно использовать команду в следующем формате:

[root]# /usr/sbin/lsof -i adress

где после опции -i указывается еще параметр – интересующий вас порт, сервис или имя хоста. В общем случае параметр adress задается в следующем виде (квадратные скобки обозначают необязательность каждой части параметра):

[46][protocol][@hostname|hostaddr][:service|port]

Здесь “46” обозначает версию протокола IP. Цифру 6 можно указывать только в том случае, если ваше ядро поддерживает IPv6. Если не указано ни 4, ни 6, будут рассматриваться соединения по тому и другому варианту протокола. Задавать версию протокола можно указывая опцию в форме -i4 -i6 (это то же самое, что и указать просто -i). Если указывается только версия IP-протокола без указания других частей параметра address, отображаются только данные о тех процессах и файлах, которые работают по соответствующему протоколу.

Вместо “protocol” в параметре может стоять либо TCP, либо UDP (либо ничего).

hostname” - имя хоста, а “hostaddr” - числовой адрес. В случае протокола IPv4 эта часть задается в форме десятично-точечной записи, в случае IPv6 – в форме чисел, разделенных двоеточиями и заключенных в скобки.

service” - это название одного из сервисов, например, smtp, или список таких сервисов.

port” - это номер порта или список таких номеров.

8. Форматированная выдача списка файловых систем, смонтированных в текущий момент

$ mount | column -t

Здесь важно не то, что выдаются файловые системы. Важна команда column -t. Она принимает входной поток и форматирует его по столбцам так, чтобы столбцы были выравнены по вертикали.

9. Исполнение команды без сохранения ее в истории выполненных команд

$ <пробел>команда

Эта одностроковая команда работает, по меньшей мере, в bash, я не проверял ее в других оболочках.

10. Изображение первых десяти работающих процессов, отсортированных по объему используемой памяти

$ ps aux | sort -nk +4 | tail

Это, конечно, не самый лучший способ изображения первых десяти процессов, которые потребляют максимум памяти, но он работает.

Берется результат ps aux, который сортируется (sort) по 4-му столбцу, а затем используется tail, выдающий последние десять строк, в которых показаны процессы с наибольшим потреблением памяти.

Если я бы захотел узнать, какие процессы потребляют наибольший объем памяти, я бы просто использовал команду htop или top, но не ps.

11.Бонусная одностроковая команда: Запуск сервера SMTP

python -m smtpd -n -c DebuggingServer localhost:1025

Эта одностроковая команда запускает сервер SMTP на порту 1025. Здесь используется стандартная библиотека smtpd для языка Python (задается при помощи -m smtpd) и передаются три аргумента: -n, -c DebuggingServer и localhost:1025.

Аргумент -n указывает Python-у не устанавливать для setuid (позволяет изменять пользователя) значение “nobody” — код будет работать под вашим пользователем.

Аргумент -c DebuggingServer указывает Python-у использовать класс DebuggingServer в качестве реализации SMTP, которая печатает каждое получаемое сообщение в выходной поток stdout.

Аргумент localhost:1025 указывает Python-у запускать SMTP сервер как locahost на порту 1025.

Однако, если вы захотите запустить сервер на стандартном порту 25, вам нужно будет использовать команду sudo, поскольку только пользователь с правами root может запускать сервисы на портах 1 — 1024. Они также известны как привилегированные порты.

sudo python -m smtpd -n -c DebuggingServer localhost:25

Ссылки:
Новость на OpenNet
Первые 10
Следующие 10
И еще 10
lsof
Скачано июл 22 2014, 1:23 pm GMT.