Посты по тегу: cli

Передвигаемся в консоли без стрелок

Сегодня совсем небольшая заметка...

В MacOS меня жутко раздражжает, что нельзя прыгать по словам в консоли (да, я в курсе, что можно это настроить сторонним софтом).

А вот век живи и век учись... Таки можно, и вот как:

Moving in cli

30+ Linux команд, которые необходимо знать

30+ простых команд, которые помогут работать в консоли:

  • ls - list, выводит список файлов в каталоге
  • mkdir - make dir, создать каталог
  • pwd - print working dir, показать текущий каталог
  • cd - change dir, сменить каталог
  • rmdir - remove dir, удалить каталог
  • rm - remove, удалить файл/каталог
  • cp - copy, копирование файлов/каталогов
  • mv - move, переместить файл/каталог
  • cat - concatenate/print, объеденить или вывести содержимое файла
  • tail - вывести конец файла
  • less - вывести содержимое файла
  • grep - фильтровать содержимое файла
  • find - поиск файлов
  • tar, gzip, unzip - архивирование/разархивирование файлов/каталогов
  • help - краткая справка
  • whatis - однострочное описание команды
  • man - manual, подробная справка о команде
  • exit - закрытие текущей сессии терминала
  • ping - проверка доступности удаленного хоста
  • who - кто использует текущий компьютер
  • su - switch user, переключить пользователя
  • uname - информация о текущем компьтере
  • free - показать объем свободной памяти
  • df, du - показать статистику использования диска
  • ps - processes, показать выполняемые процессы
  • top - статистика выполняемых процессов
  • shutdown, halt - выключить/перезагрузить компьютер

How To: 16 практических примеров команды ls

Команда ls применяется для просмотра списка файлов в каталоге. Хотя, если вы используете Unix-like систему, то вы это уже знаете не хуже меня.

Но все ли вы знаете об этой прекрасной команде? Может быть вы используете ее не до конца?

1. Показать все файлы в каталоге

Классический вариант команды ls - это:

ls -a

Вывод покажет все файлы и каталоги в текущем каталоге, включая скрытые. В том числе и служебные '.' и '..'

2. Скрыть служебные каталоги '.' и '..'

ls -A

3. Отображение файлов и каталого в обратном порядке

По умолчанию, ls возвращает список файлов и каталогов в алфавитном порядке. Если необходимо вернуть список в обратном порядке:

ls -r

4. Сортируем файлы по расширению

Это тоже можно легко сделать:

ls -X

Читать далее...

Ищем причину зависания сервера

Игрался я тут как-то с Orange Pi Zero и стала она подвисать на ровном месте. Монитор я не подключал к нему, т.к. это такая себе была игровая площадка для всяких датчиков и т.п. В общем, надо было понять в чем дело и почему подвисает железка.

В Linux есть такая возможность ядра как Netconsole. Netconsole позволяет послать сообщения от ядра на удаленный компьютер. Вспомнил о ней и решил вот написать как ей пользоваться. Может кому-то еще пригодится.

Для настройки netconsole нужен другой (постоянно включенный) компьютер который примет сообщение по сети.

Настраиваем проблемный сервер

  1. В /etc/modules добавляем netconsole
  2. В /etc/modprobe.d/netconsole.conf пишем

    options netconsole netconsole=SRCPORT@SRCHOST/eth0,DSTPORT@DSTHOST/DSTMAC

Где SRCPORT и SRCHOST соответственно порт и IP адрес сервера который отлаживаем.
А DSTPORT и DSTHOST порт и IP адрес сервера который будет принимать сообщения.

DSTMAC — это MAC адрес сервера который будет принимать сообщения ЕСЛИ он в той же сети. Если он за роутером или где нибудь в интернете, то нужно указывать MAC адрес ближайшего роутера (Gateway).

Должно получится чтото типа:

options netconsole netconsole=6666@192.168.1.2/eth0,6666@192.168.1.3/e0:91:f5:7d:e6:38

Настраиваем сервер с логом

Нам нужно как-то запустить программу которая будет слушать UDP порт DSTPORT и куда-либо записывать сообшения.

Самый просто способ — запустить netcat который будет выдавать на экран все что приходит на порт. Для того чтобы после закрытия окна данная программа не прекратила работать, можно запустить ее в screen.

Запускаем screen

screen -U -D -RR

Запускаем в окне netcat

netcat -l -u DSTHOST DSTPORT

Как понять что все работает?

Можно подождать какого нибудь события, но как убедится что сообщения реально ходят?

kmsg

echo test > /dev/kmsg

После выполнения этой команды в лог прилетит отправленный текст

SysRq

Можно активировать SysRq механизм ядра.
echo 1 > /proc/sys/kernel/sysrq
echo h > /proc/sysrq-trigger

После этого на сервере который принимает сообщения в окне с netcat появится текст типа
[ 7849.700372] SysRq : HELP : loglevel(0-9)....

HTTP сервер для раздачи статики одной строкой

Иногда надо быстро поднять http сервер для отдачи какого-то одного или нескольких файликов.

Тут собраны несколько способов, как одной строкой запустить http сервер для раздачи статических файлов.

Python 2.x

$ python -m SimpleHTTPServer 8000

Python 3.x

$ python -m http.server 8000

Twisted

$ twistd -n web -p 8000 --path .

or

$ python -c 'from twisted.web.server import Site; from twisted.web.static import File; from twisted.internet import reactor; reactor.listenTCP(8000, Site(File("."))); reactor.run()'

Ruby

$ ruby -run -ehttpd . -p8000

asdf

$ gem install adsf   # install dependency
$ adsf -p 8000

Sinatra

$ gem install sinatra   # install dependency
$ ruby -rsinatra -e'set :public_folder, "."; set :port, 8000'

Perl

$ cpan HTTP::Server::Brick   # install dependency
$ perl -MHTTP::Server::Brick -e '$s=HTTP::Server::Brick->new(port=>8000); $s->mount("/"=>{path=>"."}); $s->start'

Plack

$ cpan Plack   # install dependency
$ plackup -MPlack::App::Directory -e 'Plack::App::Directory->new(root=>".");' -p 8000

PHP > 5.4

$ php -S 127.0.0.1:8000

busybox httpd

$ busybox httpd -f -p 8000

Консольные полезности 7

й, где была использована вспышка. Требуется ImageMagick

identify -format "%f F:%[EXIF:Flash]\n" *.jpg | egrep " F:(0|16|24|32)$"

Показать в файле символы табуляции

cat -T example.txt

Показать процессы httpd исключив сам grep

ps auxww | grep "[h]ttpd"

Список 20 самых больших по объему файлов/каталогов в текущем каталоге

du -ma | sort -nr | head -n 20

Удалить все письма из очереди Postfix за 11 декабря

mailq | awk '/^[0-9A-F]+ .+ Dec 11 /{print $1}' | xargs -n 1 postsuper -d

Сканировать внутренню сеть на хочты с открытым 22 портом

nmap --open -p T:22 192.168.1.0/24

Автоматически установить публичный ключ на удаленный хост

ssh-copy-id 'user@remotehost'

Использование -w в diif позволит игнорировать разницу в табах и пробелах

diff -w index.html bookexample/index.html

Поиск по файловой системе без спуска в /sys и /proc

find / \( -path /proc -o -path /sys \) -prune -o -print

Консольные полезности 6

Переименовать файл короткой командой:

mv foo.{old,new}

Показать количество НЕуспешных запросов (не 2хх, 3хх HTTP коды ответа)

awk '$9!~/^[23]/{print $4}' access_log | cut -c1-12 | uniq -c

Создать каталог и сразу перейти в него

mkdir dir && cd $_

Запустить скрипт из крона только если он еще не работает

*/3 * * * * if [[ -z $(pgrep offlineimap) ]]; then offlineimap -u quiet; fi

Проверить как давно работает процесс

ps -p PID -o pid,cmd,etime

scp не несколько удаленных хостов

parallel -j0 scp file.txt {}:/dstDir ::: user@srv1 user@srv2

Вывод dmesg в режиме реального времени и в "человеческом" виде (цвет, даты и т.п.)

dmesg -wH

Ого файла

sed '9417q;d' dbdump.sql

Текущее время в UTC:

date -u

Отцензурировать все email в report.txt

sed -r -i 's/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[a-z]{2,30}\b/xxx@yyy.zzz/' report.txt

wc имеет опции для подсчета символов, слов или строк:

wc -c
wc -w
wc -l

Объединить несколько pdf в один для печати

convert 1.pdf 2.pdf 3.pdf all.pdf

Суммировать числа из третьего столбца файла data.txt

awk '{s+=$3} END {print s}' data.txt

Вывести самую длинную строку из файла

awk 'length > max { max=length;maxline=$0 } END { print maxline; }' quotes.txt

Отсортировать вывод df, оставив заголовок вверху

df -hP | awk 'NR==1;NR>1{print|"sort -k5rn"}'

Разделить файл на несколько по 50 строк

split --lines=50 foo.txt

Проверить какая память установлена в компьютере не открывая его

dmidecode -t 17 
lshw -short -C memory

lftp: зеркалируем локальные и удаленные каталоги

lftp — программа для передачи файлов в сложных условиях ftp, http и других соединений. lftp имеет встроенную поддержку зеркалирования всего дерева каталогов. Она так же может зеркалировать в обратном режиме, т.е. сделать зеркало локального каталога на сервере, загрузив все файлы. Еще одна интересная возможность: зеркалирование двух удаленных серверов по протоколу FXP, если он доступен на серверах.

Синтаксис

mirror
mirror options
mirror -c
mirror -R

Пример: Как сделать зеркало удаленного каталога (скачать файлы)

Для начала необходимо подключиться к удаленному серверу:

lftp ftp.example.com

Введите имя пользователя и пароль:

lftp ftp.example.com:~> user user@example.com

Пример вывода:

Password:
lftp user@example.com@ftp.example.com:~>

Введите ls, чтоб увидеть список файлов:

lftp ftp.example.com:~> ls

Пример вывода:

-rw-r--r--    1 80       www      36809419 Jun 24 23:59 2012-06-24.log.gz
-rw-r--r--    1 80       www      100912271 Jun 25 23:59 2012-06-25.log.gz
-rw-r--r--    1 80       www      102926055 Jun 26 23:59 2012-06-26.log.gz

Для зеркалирования всех файлов в текущий каталог введите:

lftp ftp.example.com:~> mirror

С командой mirror вы можете указать исходный каталог и каталог назначения. Если каталог назначения будет оканчиваться на слеш («/»), то имя исходного каталога будет добавлено к каталогу назначения.

lftp ftp.example.com:~> mirror source destination

или

lftp ftp.example.com:~> mirror logs/ /data/logs

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

lftp ftp.example.com:~> mirror -c source destination

или

lftp ftp.example.com:~> mirror --continue

Чтоб скачать только новые файлы (не работает с -c):

lftp ftp.example.com:~> mirror -n

или

lftp ftp.example.com:~> mirror --only-newer

Вы можете ускорить загрузку файлов используя опцию параллельной загрузки:

lftp ftp.example.com:~> mirror -p

Чтоб указать количество потоков, введите:

lftp ftp.example.com:~> mirror --parallel=10

Пример: как сделать обратное зеркалирование (загрузка файлов)

Для создание обратного зеркала каталога вам необходимо передать опцию -R или —reverse команде mirror. Для начала вам необходимо подключиться к серверу, как было показано в предыдущем примере.

Сменить локальный каталог:

lftp ftp.example.com:~> lcd /home/silver/project/lftp

Пример вывода:

lcd ok, local cwd=/home/silver/project/lftp

Для загрузки дерева файлов и каталогов на сервер:

lftp ftp.example.com:~> mirror -R

или укажите локальный и удаленный каталоги:

lftp ftp.example.com:~> mirror -R /home/silver/project/lftp /var/www/html

Для выхода из FTP сессии:

lftp ftp.example.com:~> quit

Есть ли почта в консоли?

Я очень долгое время использовал для работы с почтой Mozilla Thunderbird. Но с каждым годом эта ранее быстрая и легковесная программа превращалась в неповоротливого монстра. И вот мне наконец надоело и я решил попробовать использовать старый, но от того не разросшийся до невменяемого состояния, консольный почтовый клиент mutt.

Справка

mutt — почтовый клиент с текстовым интерфейсом для Unix-подобных операционных систем. Написан Майклом Элкинсом в 1995 году и распространяется по лицензии GPL. Изначально напоминал Elm, затем программа больше походила на slrn.

Mutt поддерживает большинство форматов почтовых ящиков (в том числе mbox и Maildir) и протоколов (POP3, IMAP и т. д.). Также включает поддержку MIME, PGP/GPG и S/MIME-интеграцию.

Mutt является чистым Mail User Agent (MUA) и не может отсылать e-mail самостоятельно. Для этого ему необходимо иметь соединение с Mail Transfer Agent (MTA) (почтовым сервером) либо SMTP-клиентом.

Установка в Ubuntu

В Ubuntu есть две версии mutt:

  1. Классический mutt
  2. Mutt с кучей патчей по улучшению отображения и работы

Я поставил себе патченную версию, т.к. она мне показалась более логичной:

$ sudo apt-get install mutt-patched

Настройка

Настройка производится в файле \~/.muttrc. Я не буду расписывать всю настройку, документации полно в сети, а лишь покажу то, что сделано у меня:

# GENERAL
set realname = "Vasya Pupkin"                        # Имя пользователя
set use_from = yes
set sort = reverse-threads                           # Сортировка по обсуждениям в обратном порядке
set sort_aux = last-date-received                    # Сортировка по дате получения
set mail_check = 5                                   # Проверять почту раз в 5 секунд
set timeout = 10                                     # Таймаут соединения
set net_inc = 5
set signature = ~/.signature                         # Файл подписи
set delete = yes                                     # Удалять без подтверждения
set copy = no                                        # Копировать с подтверждением
set move = yes                                       # Перемещать письма без подтверждения
set edit_headers                                     # Показывать заголовки при написании письма
set editor = "/usr/bin/sublime-text -w"              # Редактор
set include = yes                                    # Добавлять цитирование при ответе
set mark_old = no                                    # Не помечать прочитанные для перемещения в mbox
set save_empty = no                                  # Не созранять пустые сообщения
set pgp_verify_sig = yes                             # Автоматически проверять PGP подпись письма

# Не показывать эти заголовки (нажатие 'h' покажет все)
ignore X-Mailer Delivered-To X-Delivery-ID X-Priority X-MSMail-Priority X-MimeOLE X-Spam-Checker-Version X-Spam-Level X-Spam-Status Precedence X-No-Archive List- DomainKey-Signature In-Reply-To User-Agent DKIM-Signature X-Google-Sender-Auth

# Bindings
macro index,pager S s+Junk                           # Shift+s отправит письмо в спам
macro index,pager A s+Archives.2016                  # Shift+a отправит письмо в папку Archives -> 2016
bind index G imap-fetch-mail                         # Shift+g получит новые письма

unhdr_order *                                        # Сбрасывает настройки порядка показа заголовков
hdr_order date from to cc subject                    # Порядок показа заголовков

# IMAP
set from = user@example.com                          # Адрес отправителя
set imap_user = user@example.com                     # IMAP логин
set imap_pass = Pa$sw0rd                             # IMAP пароль
set smtp_url = smtp://user@example.com:25/           # SMTP логин@сервер
set smtp_pass = Pa$sw0rd                             # SMTP пароль
set imap_keepalive = 900
set folder = imaps://example.com:993                 # IMAP сервер
set spoolfile = +INBOX #or +[Gmail]/Important        # Имя папки входящих сообщений
set postponed = +Drafts                              # Имя папки с черновиками
set header_cache = ~/.mutt/cache/headers             # Файл кеша заголовков
set message_cachedir = ~/.mutt/cache/bodies          # Файл кеша сообщений
set certificate_file = ~/.mutt/certificates          # Файл кеша сертификатов
set ssl_starttls = yes                               # Использовать StartTLS
set ssl_force_tls = yes                              # Обязательно использовать TLS
unset imap_passive                                   # Отключить пассивный решим IMAP
set imap_check_subscribed                            # Проверять подписки на папки

# HTML
set implicit_autoview                                # Использовать фильтры по содержимому
set mailcap_path="~/.mailcap"                        # Файл с описанием фильтров

# GPG
source /usr/share/doc/mutt/examples/gpg.rc           # Подключить PGP/GnuPG шифрование
# Ссылка на публичный ключ в сети
my_hdr X-PGP-Key: https://blog.lyalyuev.info/wp-content/uploads/05420A87.pub

set pgp_use_gpg_agent = yes                          # Использовать GPG Agent
set pgp_sign_as = 05420A87                           # Подписывать письма ключем 05420A87
set pgp_timeout = 3600
set crypt_autosign = no                              # Автоматически не подписывать сообщения
set crypt_replyencrypt = yes                         # Отвечать шифрованием на шифрованные сообщения

Из комментариев к конфигу все должно быть понятно. Осталось два файла:

  1. \~/.signature - это файл с подписью, которая будет автоматически добавляться к письму. Может содержать в себе что угодно.
  2. \~/.mailcap - файл с описанием типа вложения и программой, которая должна его открывать:

    text/html; firefox %s; needsterminal;

В данном случае имеется ввиду, что файлы вложений типа text/html открывать надо с помощью firefox. Так я открываю HTML письма, которые не содержат в себе текстовой части.

Работа в mutt

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

? - справка по клавишам
m - создать письмо
r - ответить на письмо
c - сменить папку
q - выход
y - подтверждение действия

Следите за подсказками в верхней строке и почаще заглядывайте в хелп. И все у вас получится. ;)

How To: Проксируем весь трафик через ssh

Иногда надо отправить весь трафик через удаленный сервер. VPN'а и ничего другого, кроме ssh, нет. Чтоб провернуть этот фокус одной коммандой нам понадобится только python на обоих концах "туннеля" и ssh доступ.

Устанавливаем пакетный менеджер pip:

$ sudo apt install python-pip

Устанавливаем sshuttle:

$ sudo pip install sshuttle

Запускаем туннель:

$ sshuttle -r user@example.com 0.0.0.0/0

Все. С этого момента весь траффик пойдет через сервер example.com. И да, для консольных утилит тоже.

Чтоб DNS трафик пошел туда же надо добавить опцию --dns. Учтите, что если вы используете провайдерский DNS, то он может перестать отдавать записи:

$ sshuttle --dns -r user@example.com 0.0.0.0/0

Более подробное описание смотрите в официальной документации.