Полезные команды и утилиты Linux
Общее
Определить релиз системы
$ lsb_release -a
Узнать, где находится бинарник исполняемой команды
$ which ruby
Найти файл
$ find /var -name mod_magnet.so
$ updatedb #обновляем базу
$ locate mod_magnet.so
Кто логинился, в какой терминал?
$ w
$ last
$ who -a
Сколько памяти? Сколько свопится?
$ free -m
Какой аптайм
$ uptime
Изменение редактора по-умолчанию
$ update-alternatives --config editor
Терминал (tty - это железный терминал через ядро, pts - эмулированный, например через ssh или mc)
$ tty
Сервисы
Управление сервисами, cli. Так же можно включать/выключать
автостарт, напр. sysv-rc-conf ntp on
$ sudo sysv-rc-conf
Железо
Модель материнки, процессора, других железяк
$ dmidecode
$ lspci
Правильно ли установлена сетевая карта? Полу-дуплекс? 10 мегабит? TX/RX ошибки?
$ ethtool eth0
Процессы
Cписок запущенных процессов.
$ ps aux
Вместо довольно подробного ps aux
, pstree
показывает информащию о запущенных процессах в сжатом виде
$ pstree -a
Запуск процесса с пониженным или повышенным приоритетом ввода-вывода. Класс 1 для "real time", 2 для "best-effort", 3 для "idle".
$ ionice -c 3 programm_name -c
Пользователи и группы
Список всех пользвоателей (системных и локальных)
$ awk -F":" '{ print "Linux_name: " $1 "\t\tFull_Name: " $5 }' /etc/passwd
В каких группах пользователь swasher?
$ groups swasher
Добавить пользователя в группу
# -a is important!
$ usermod -aG group-name username
Создать пользователя rtorrent, c комментарием (-с), пользовательской директорией (-d), которую нужно создать (-m), и с шеллом bash (-s)
$ useradd -c "Torrent User" -d /home/rtorrent -m -s /bin/bash rtorrent
Лог подключений к серверу
$ last
Сеть (web)
Как отключить IPv6 протокол
$ sudo nano /etc/default/grub
> GRUB_CMDLINE_LINUX="ipv6.disable=1"
$ sudo update-grub2 Check if IPV6
Проверить текущее состояние IPv6:
$ [ -f /proc/net/if\_inet6 ] && echo 'IPv6 ready system!' || echo 'No IPv6 support found!'
Поиск DNS имени по IP (запись name =)
nslookup <IP>
Ping и traceroute в одном флаконе
mtr google.com
Как узнать свой внешний IP (на сайте ifconfig.me еще много примеров)
$ curl ifconfig.me
Аналогично определяется geo-ip информация
$ curl ipinfo.io
Ping плюс Trace в одном флаконе
$ mtr mail.ru
Сеть (ethernet)
В файле /etc/network/interface
указываем адрес, маску и (если надо) шлюз
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.0.20
netmask 255.255.255.0
gateway 192.168.0.1
В файле /etc/resolv.conf
указываем днс-сервер
nameserver 8.8.8.8 #(это гугловский dns-сервер)
В Ubuntu с 12 версии изменился способ указания DNS. Теперь он указывается в файле /etc/network/interface
:
dns-nameservers 24.56.100.20 192.168.69.2 208.67.222.222 208.67.220.220 8.8.8.8 8.8.4.4
Проверить открытые порты
$ nc -zv localhost 8070-8090
Открытые порты (Listening services)
$ netstat -ntlp
$ netstat -nulp
$ netstat -nxlp
keys:
-n - использовать IP вместо имен (может быть более наглядно)
-p - показывть PID и имя программы на сокете или порту
-l - показывать только открытые порты
-t - tcp, -u - udp, -x - Unix domain socket
Кто занимает/слушает порт
$ lsof -iTCP:80 -sTCP:LISTEN
Samba
Сканирование подсети на наличие samba-ресурсов
nbtscan 192.168.0.0/24
Ресурсы на хосте
smbclient -U <user> -L <host>
Кто мастер-браузер?
nmblookup -M -
Монтирование (может понадобиться apt-get install cifs.utils
)
mount -t cifs -o username=alexey //ALEXEY/work /mnt/work
Как сохранить executable bit при редактировании файлов через Samba? Archive=>Owner, System=>Group, Hidden=>World
[data]
path = /home/samba/data
browseable = yes
guest ok = yes
writeable = yes
map archive = no
map system = no
map hidden = no
Дисковая система
Информация о HDD
$ hdparm -I /dev/sda #directly from drive
$ hdparm -i /dev/sda #from kernel
$ fdisk -l -u
Поиск всех дисковых устройств
$ blkid
Активность процессов в записи/чтении на диск. Ключи -o
только активные процессы/нити, -P
-только процессы
$ iotop
Примонтировать ISO
$ mount -o loop some.iso /mnt/point
Удаление Partition Table
$ dd if=/dev/zero of=/dev/sda count=1 bs=1k
Тест скорости чтения
$ hdparm -t /dev/sdb
Тест скорости чтения посредством dd
$ dd if=/dev/sdb of=/dev/null bs=128K count=20000
Тест скорости записи посредством dd
#убивает раздел, запись производится на физический диск
$ dd if=/dev/zero of=/dev/sdb bs=128K count=20000
#безопасно, запись в файл
$ dd if=/dev/zero of=/mnt/hd/000.dd bs=128K count=100000
Статистика по утилизации дисков. Показать шесть отчетов с двухсекундным интервалом для всех устройств.
$ iostat -d 2 6
Файловая система
Какой процесс использует данный файл?
$ lsof /etc/passw
Свободное место на винчестерах. Ключи -h
human-readable, -T
вывод типов файловых систем
$ df -h
Сколько весит папка? Ключ -h
правильно сортирует human-readable формат
$ du -h --max-depth=1 | sort -h
Рекурсивно сравнить две директории и найти все отличающиеся файлы (длинные ключи --brief --recursive
)
$ diff -qr dir1/ dir2/
iSCSI
Обнаружить таргеты на удаленном сервере
iscsiadm -m discovery st -p 192.168.0.1 -t st
Вывести список уже подключенных таргетов (опция -P3 - подробный вывод, в конце вывода можно увидеть, какое блочное устройство какому target'у принадлежит).
iscsiadm -m session -P3
Вылогиниться из конкретного таргета
iscsiadm - m session -u -T iqn.2011-09.example:data
Залогиниться во все обнаруженные target'ы
iscsiadm -m node -l
Вылогиниться из всех target'ов
iscsiadm -m node -u
XFS
Проверить фрагментацию файла
$ xfs_bmap -v
#где point - файл возвращает список занимаемых екстентов.
Проверка фрагментации файловой системы
$ xfs_db -c frag -r /dev/hdd1
Дефрагментация
$ xfs_fsr -v
#где point -файл, точка монтирования или устройство. Может производится онлайн.
Дефраг через крон
30 1 * * * root /usr/sbin/xfs_fsr -t 21600 >/dev/null 2>&1
#запускать каждую ночь в 1:30 на шесть часов (опция -t 21600(сек))
Предотвращение дефрагментации при монтировании /etc/fstab
. Устанавливает размер екстента в 512 метров
/dev/hda3 /myth xfs defaults,allocsize=512m 0 0
Опции монтирования для увеличения быстродействия. Отменяет обновление метаданных о времени доступа к файлам и директориям
/dev/hda3 /myth xfs noatime,nodiratime,allocsize=512m 0 0
Восстановление при наличии сбоев или противоречий. Производится только на отмонтированной ФС, желательно в single mode (telinit 1)
$ telinit 1
$ umount /dev/hda3
$ xfs_repair /dev/hda3
Btrfs
Я получаю ошибку "No space left on device", но df сообщает о достаточном свободном месте.
Прежде всего, проверьте, сколько места было выделено в файловой системе:
$ sudo btrfs fi show
Label: 'media' uuid: 3993e50e-a926-48a4-867f-36b53d924c35
Total devices 1 FS bytes used 61.61GB
devid 1 size 133.04GB used 133.04GB path /dev/sdf
Отметим, что в этом случае, все устройства в файловой системе используются полностью. Это ваша первая подсказка. Затем проверим, сколько использовано места под метаданные:
$ sudo btrfs fi df /mount/point
Data: total=127.01GB, used=q56.97GB
System, DUP: total=8.00MB, used=20.00KB
System: total=4.00MB, used=0.00
Metadata, DUP: total=3.00GB, used=2.32GB
Metadata: total=8.00MB, used=0.00
Обратите внимание, что значение Metadata used довольно близко (75% или более) к заполнению, но есть много места под данные. А произошло то, что файловая система выделила все доступное место для данных или метаданных, а затем одно из них заполнилось (как правило, это просиходит с метаданными). На данный момент, эту проблему можно решить, запустив частичную балансировку:
$ sudo btrfs fi balance start -dusage=5 /mount/point
Обратите внимание, что не должно быть пробела между -d и usage. Эта команда будет пытаться переместить данные в пустые или почти пустые чанки данных, что позволяет восстановить свободное пространство для метаданных. Дополнительную информацию можно получить по ссылкам: что делает балансировка и опции балансировки
NFS
Очистить все шары, затем расшарить только то, что прописано в exportfs
exportfs -au
exportfs -a
Cron
Для редактирования файла кронтаба используем команду crontab -e
. Этой
командой мы открываем для редактирования файл crontab для текущего
пользователя. Если нашему скрипту нужны права супер пользователя, то
нужно редактировать crontab суперпользователя. Делается это командой sudo crontab -u root -e
.
Ну а если заменить root на логин другого пользователя, мы сможем редактировать чужой crontab.
Чтобы посмотреть файлcrontab введите команду crontab -l
. Файл crontab имеет следующую структуру:
поле1 поле2 поле3 поле4 поле5 команда
Значения первых пяти полей:
- минуты— число от 0 до 59
- часы — число от 0 до 23
- день месяца — число от 1 до 31
- номер месяца в году — число от 1 до 12
- день недели — число от 0 до 7(0-Вс,1-Пн,2-Вт,3-Ср,4-Чт,5-Пт,6-Сб,7-Вс)
Все поля обязательны для заполнения. Не сложно догадаться что первые 5 отвечают за определения периодичности запуска команды, а последняя собственно команда или полный путь к скрипту. Таким образом, чтобы запустить наш скрипт резервного копирования раз в 10 минут надо вписать следующую строчку:
*/10 * * * * /home/user/backup-script
* (звездочка) - обозначает все возможные варианты, - то есть, например, если * стоит в дне недели, то это эквивалентно записи 1,2,3,4,5,6,7
/ (прямой слеш) служит для определения периодичности выполнения задания. Например, если нужно будет выполнять скрипт раз в 3 часа, пишем в поле часы */3
, а в минуты просто , если раз в сутки — пишите /23, ну почти сутки.
Так же в одно поле можно вводить несколько значений через запятую, например если хотите выполнять скрипт 1-го, 5-го, и 25-го числа каждого месяца
введите 1,5,25 вместо третей звёздочки. Ещё можно вводить промежуток времени, если, допустим, в часы ввести 12-17 то скрипт будет выполняться
с 12 до 17 включительно раз в час. Ну вот и всё, в заключение несколько примеров:
min hour DoM MoY DoW Command
0 */3 * * 2,5 /script #Каждые три часа только по вторникам и пятницам
15 */3 * * * /script #Каждые три часа в 15 минут
45 15 * * 1 /script #По понедельникам в 15:45
13 13 13 * 5 /script #в пятницу 13 числа в 13 часов 13 минут
30 00 * * 0 /script #Раз в неделя по воскресеньем в 00:30
Apt
Основные команды
$ apt-get update
$ apt-get upgrade
$ apt-get install <package>
$ apt-get remove [--purge] <package> # purge для удаления конфигурации
$ apt-get dist-upgrade # В UBUNTU ЛУЧШЕ ИСПОЛЬЗОВАТЬ do-release-upgrade
При применении pinning, просмотреть источник пакета
$ apt-cache policy exim4-daemon-light
Поиск пакетов
$ dpkg --list #Установленные пакеты
$ apt-cache search <regex> # Полнотекстовый поиск по всем доступным пакетам (имя и описание)
$ apt-cache pkgnames # Все доступные пакеты
$ apt-cache pkgnames ssh # Все доступные пакеты, начинающиеся на ssh
Информация о пакетах и обслуживание apt
$ apt-cache show vsftpd # Инфа о пакете
$ apt-cache stats # Статистика кеша
$ apt-get clean # Удаление полученных deb-файлов
$ apt-get autoremove # Удаление завиисмостей после удаления их родительского пакета
$ apt-get check # Диагностика и проверка зависимостей
Проапгрейдить LTS до Normal
$ apt-get install update-manager
$ nano /etc/update-manager/release-upgrades
Prompt=normal
Pinning
Поставить пакет из следующего релиза (на примере trusty (след. релиз - utopic), и пакета ghostscript:
# Смотрим, какой пакет предлагается текущим релизом
$ apt-cache policy ghostscript
ghostscript:
Installed: (none)
Candidate: 9.10~dfsg-0ubuntu10.2
Version table:
9.10~dfsg-0ubuntu10.2 0
500 http://ua.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
9.10~dfsg-0ubuntu10 0
500 http://ua.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
# Версия пакета - 9.10
# Создаем файл `/etc/apt/preferences.d/ghostscript`
Package: ghostscript
Pin: release a=utopic
Pin-Priority: 10
# Смотрим, в какой секции содержится нужный пакет.
# Если секция явно не указана, то это main
apt-cache show ghostscript | grep Section
# добавляем репы utopic main в source.list.
deb http://ua.archive.ubuntu.com/ubuntu/ utopic main restricted
deb-src http://ua.archive.ubuntu.com/ubuntu/ utopic main restricted
#update и проверяем
$ apt-get update
$ apt-cache policy ghostscript
ghostscript:
Installed: 9.10~dfsg-0ubuntu10
Candidate: 9.14~dfsg-0ubuntu3
Package pin: 9.14~dfsg-0ubuntu3
Version table:
*** 9.14~dfsg-0ubuntu3 10
500 http://ua.archive.ubuntu.com/ubuntu/ utopic/main amd64 Packages
100 /var/lib/dpkg/status
9.10~dfsg-0ubuntu10.2 10
500 http://ua.archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
9.10~dfsg-0ubuntu10 10
500 http://ua.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
# Видно, что теперь кандидат на установку - версия 9.14. Можно устанавливать:
$ apt-get install ghostscript
Bash, команды и приемы
Выполнение последней команды с правами рута
$ sudo !!
Если зажать Alt или Esc и нажимать точку, мы будем перебирать последние введнные аргументы командной строки. Например
$ touch file.txt
$ nano <Alt-.>
Если в начале команды поставить пробел, она не запишется в history. Полезно скрывать команды с кофеденциальной информацией
$ mount -t cifs -o username=user,password=SeCrEtPaSsWoRd //share /mnt
Замедление вывода. 50 - байт в секунду
$ dmesg | pv -qL 50
Форматирование вывода колонками
$ mount | column -t
Очистка экрана - всместо clear
можно просто нажать Ctrl-l
Ctrl-l
Определить тип файла.
$ file my.pdf
my.pdf: PDF document, version 1.4
Bash, рецепты
Проверить, поднят ли компьютер в сети
nmtstatus=$(arp -v ${ip} | grep Found | awk '{print $6}')
Заменить расширение по шаблону, рекурсивно с текущей папки:
#Работает плохо, файл nf.nf.nf переименует в nfo.nf.nf
#нужно пофиксить
find . -type f -iname "*.nf" -exec rename 's/nf/nfo/' {} \;
Заменить рекурсивно права только для файлов или только для директорий
$ find /path/to/base/dir -type d -exec chmod 755 {} + #для директорий
$ find /path/to/base/dir -type f -exec chmod 644 {} + #для файлов
Or, if there are many objects to process:
$ chmod 755 $(find /path/to/base/dir -type d)
$ chmod 644 $(find /path/to/base/dir -type f)
Or, to reduce chmod spawning:
$ find /path/to/base/dir -type d -print0 | xargs -0 chmod 755
$ find /path/to/base/dir -type f -print0 | xargs -0 chmod 644
Заменить строку в конфиге
perl -pi -e "s/X11Forwarding yes/X11Forwarding no/g" /etc/ssh/sshd_config
Если что-то пошло не так, можно проанализировать переменную $?
apt-get install rar
if [ $? -gt 0 ]; then
set +x verbose
echo *** ERROR ***
echo "Looks like something is wrong with apt-get install, aborting."
set -e
exit 1
fi
Получить IP адрес
IPADDRESS1=`ifconfig | sed -n 's/.*inet addr:\([0-9.]\+\)\s.*/\1/p' | grep -v 127 | head -n 1`
Выполнить слудещую команду при (не-)удачном завершении предыдущей
$ apt-get install aaabbb && echo 1 || echo 2
Сортировка
# Сортировка по human-readable размеру директорий
du -h --max-depth=1 | sort -h
# Сортировка по столбцу. Опция n (numeric) обязательна для чисел
ls -l | sort -nk5
Архитектура
$ getconf LONG_BIT
32
Когда была установлена система (=создана файловая система на загрузочном диске, в примере sda1)
tune2fs -l /dev/sda1 | grep 'Filesystem created:'
Мониторинг и статистика
Мониторинг загрузки канала в реальном времени
$ iftop
Что является причиной нагрузки на сервер? Какая средняя нагрузка?
$ top
$ htop
Мониторинг любых подсистем в реальном времени. Поддерживает плагины
$ dstat --cpu --disk -D total --mem --net
Мониторинг загрузки сети по процессам
$ nethogs
fdisk c визуализацией
$ cfdisk
Анализ размеров директорий (ncurses)
$ ncdu
Python
Какая дата была N дней назад (или через N дней)
>>> from datetime import date, timedelta
>>> print date.today()-timedelta(days=45)
2013-01-28
Быстро поднять веб-сервер в текущей директории на 8000 порту
# python2
$ python -m SimpleHTTPServer
# python3
$ python -m http.server
pip: удалить все пакеты, которые отсутствуют в requirements.txt. Обычно эту операцию проводят в виртуальном окружении питон.
небольшое пояснение: с помощью awk извлекаем два списка - из pip freeze и из requirements.txt. Передаем их в diff и сравниваем. От результата берем только первый столбец и передаем его как аргумент в pip uninstall
$ diff --suppress-common-lines -y \
<(pip freeze | awk -F"==" '{ print $1 }') \
<(awk -F"==" '{ print $1 }' requirements.txt) | \
awk '{print $1}' | \
xargs pip uninstall -y
Comments !