BASH - шпаргалка
BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.
Поиск в Linux
Поиск в текущей директории . с максимальной вложенностью директорий 999, файла, с правами 0777, именем index.php, старше одного дня, к которым обращались более двух дней и размером меньше 2 мегабайт с обработкой каждого вхождения и добавления к нему строка Found и с выводом в лог
find . -maxdepth 999 -type f -perm 0777 -mtime +1 -atime +2 -size -2M -name 'index.php' -exec echo "Found" {} \;> /home/user/result.log
locate "*.php" - моментальный поиск по кешу файловой системы, найти все файлы, содержащие в имени "*.php". Предварительно прогнать updatedb
Не на SSD надо ставить mlocate, который делает locate легким и быстрым
whereis asterisk
- выведет список мест, где находятся бинарные файлы, исходные коды и руководства с названием asterisk
which nginx
- покажет по какому пути расположен исполняемый файл nginx
type nginx
- определить что из себя представляет указанная команда, алиас, файл, функция, встроенная команда или ключевое слово
grep port /etc/mysql/my.cnf
- из файла отобрать и вывести в консоль строки содержащие "port"
grep ^port /etc/mysql/my.cnf
- из файла отобрать и вывести в консоль строки начинающиеся на "port"
grep -r string
- просканирует в текущей директории содержимое всех файлов на наличие строки string
lsof | grep sshd
- узнать какие файлы использует SSH
lsof -p 98989
- список файлов, открытых процессом с указанным PID
lsof /home/user
- список открытых файлов из директории /home/user
ncdu /
- удобный просмотр сколько занимает места файлы/папки и поддиректории, ключ -x исключит из поиска смонтированные директории
Архивирование в Linuxtar -cvf user.tar /home/user/
- Создать архив директории /home/user/ в формате tar, где: c – Creates a new .tar archive file. v – Verbosely show the .tar file progress. f – File name type of the archive file.tar -cvzf user.tar.gz /home/user/
- То же самое, в формате .gztar -xvf user.tar -C /home/user
- Разархивировать с указанием директории, если не указывать, разархивируется в текущуюgzip -9 /home/user/file
- Сжать файл в .gz с максимальным сжатиемgunzip /home/user/file
- Разжать файл
Сервисы / Службы / Демоны в Linuxsystemctl list-units --type=service
- Все сервисы (юниты) в systemDservice --status-all
- Все сервисы в systemVsystemctl enable|disable mysql
- Разрешить или запретить автозапуск сервиса в systemDservice mysql enable|disable
- Разрешить или запретить автозапуск сервиса в systemVsystemctl status|stop|start|restart|reload|force-reload php5-fpm
- Управление сервисами в systemDservice php5-fpm status|stop|start|restart|reload|force-reload
- Управление сервисами в systemV
Информация о пользователях и системе в Linuxwhoami или echo $USER
- выведем имя юзераgroups
- выведет группы пользователяid
- выведет User IDentifier, его имя, Group IDentifier и группы данного юзера с их GID
(Обычно первая сотка/тысяча юзеров зарезервирована для системных)
В /etc/passwd
записываются UIDs пользователей
В /etc/groups
записываются GIDs пользователейlast
- список последних логинов в системуlast reboot
- список перезагрузок хоста по времениlast user1
- отобразить историю регистрации пользователя в системе и время его нахождения в нейw
- показывает активные сессии (дата, время, ip, простой, сколько было потреблено процессорного времени и что выполняет)echo $XDG_CURRENT_DESKTOP
- узнать какая графическая оболочкаhostname
- выведет имя хоста, hostname -i - IP адресаuname -a
- выводит ОС, версию ядра, архитектуру и дату сборки, процессор, лицензию и так далее, т.е. вся информация о системе, сборке или lsb_release -a
или пакет neofetch с полной информацией о системе или cat /etc/os-releasedmidecode
- информация о железеfree -w -t --mega
- выводит данные об использовании ОЗУ и swap в мегабайтах (поле shared значит разделенная между процессами память, кэш это то, что часто используется и хранится, буфер это то, что приготовлено для записи, кэш и буфера это условно свободная память)date
- полная дата с часовым поясомifconfig -a
- Настройки всех сетевых адаптеровip addr show
- Список всех сетевых интерфейсов и связанных IP-адресовwget -qO- eth0.me
- Узнать внешний IPuptime
- Время работыman ls
- Документация/инструкция по указанному пакету
Информация о дисках и директориях в Linuxlsblk -a
- Информация о разделах, размерах всех дисков, типе ФС и точках монтирования
blkid
- Информация о BLOCK_SIZE, UUID, LABEL, TYPE (файловая система) разделов
file -s /dev/hda1
- узнать тип файловой системыfdisk -l
- Подробно о дисках (размер сектора, тип разметки, ID) и его разделах (секторы, размер, тип ФС)df -h (diskfree)
- информация об использовании смонтированных файловых систем (смонтированное устройство, точка монтирования, размер (Всего, использовано, Доступно, %Использования))df -i
- показывает количество inodedu -sh /home/lepkov
- Сколько весит директория, без указания директории покажет вес текущейncdu /home/lepkov
- Сколько весит директория с подпапками и файлами внутри наглядно (надо устанавливать)findmnt
- показать все точки монтирования, их источники, тип ФС и их параметры
Размер установленных пакетов в килобайтах для Debian, Ubuntu:
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n
Размер установленных пакетов в килобайтах для Fedora, redhat, CentOS:
rpm -q -a --qf '%{SIZE}\t%{NAME}\n' | sort -n
Файловые системы и диски в Linux
badblocks -v /dev/hda1
- проверить hda1 на наличие bad блоков
mkfs -t ext4 /dev/hda1 или mkfs.ext4 /dev/hda1
- создать файловую систему ext4 (ext2 без опций, FAT*, NTFS, ext*, APFS, HFS*), ключ -c проверит перед созданием ФС на наличие bad block, ключ -v (verbose) отобразит всё подробно)
fsck.ext4 /dev/hda1
- проверить/восстановить целостность указанной файловой системы Linux
smartctl -i /dev/hda1
- проверить доступность смарта указанного диска
smartctl -А /dev/hda1
- контроль состояния смарта указанного диска
dd if=/dev/sda | dd of=/dev/sdb
- посекторное клонирование диска sda
на диск sdb
, отличный вариант для клонирования псевдорейдов
Монтирование файловых систем в Linuxmount -a
- смонтировать все точки из файла /etc/fstabmount /dev/hda2 /mnt/hda2
- монтирует раздел /dev/hda2 в /mnt/hda2mount /dev/cdrom /mnt/cdrom
- монтировать cd или dvdmount -o loop file.iso /mnt/cdrom
- монтировать ISO-образmount -t vfat /dev/hda2 /mnt/hda5
- монтировать файловую систему Windows FAT32mount -t ntfs /dev/hda3 /mnt/hda6
- монтировать файловую систему Windows NTFSmount -t smbfs -o username=user,password=pass //winclient/share /mnt/share
- монтировать сетевую файловую систему Windows (SMB/CIFS)mount.cifs //192.168.1.1/share /mnt -o user=user,domain=domain.local,vers=3.0,file_mode=0777,dir_mode=0777
- монтировать сетевую файловую систему Windows (SMB/CIFS) с определенными правамиmount -o bind /home/user/prg /var/ftp/user
- монтирует директорию в директорию, полезно, когда симлинки сделать невозможноumount /dev/hda2
- размонтирует раздел из /mnt/hda2umount -n /mnt/hda2
- размонтирует раздел из /mnt/hda2, не внося информацию в /etc/mtab? полезно, когда файл имеет расширение только для чтения или недостаточно места на дискеfuser -km /mnt/hda2
- принудительное размонтирование раздела, даже если он занят
Работа с файлами в Linux
Операции с файлами в Linuxpwd
(print working directory) - текущая активная директорияmkdir -p /home/user/photos
- создать цепочку папокcd /home/user/photos
- перейти в выбранную директорию, cd .. - подняться на уровень выше, cd - перейти в домашнюю директориюls -lha /home/user/photos
- отобразить все файлы, скрытые и системные, в указанной директорииlsattr
- показать атрибуты файловcp file file.backup
- скопировать файл в новый с расширением backupcp -r /home/user/photos /backups/
- скопировать рекурсивно photos в backupstime cp /home/user/backups/
- замерить производительность операции, скриптаscp -r /home/user/photos root@server.ru:/backups/
- скопировать по scp папку photos в директорию backups на сервереscp -r root@server.ru:/backups/photos /home/user/
- скопировать по scp папку photos с сервера в директорию /home/user/ на локальном хостеrsync -avr /source/folder/ /target/folder
- копирование/синхронизация файлов локально и удаленно
mv file /backups/file.backup
- перенести файлrm file - удалить файл, rm -r /home/user/photos
- удалить рекурсивно папку rm -rf /home/user/photos - принудительно удалить директорию без подтвержденияln -s /path/to/file link_name
- создать символическую ссылку (софтлинк, симлинк, ярлык) на указанный файл ln /path/to/file link_name - создать хардлинк (хардлинк это не ярлык, а новый адрес файла, изменяя атрибуты хардлинка, изменяется сам файл)touch file
или nano file
- создать файлcat file
- вывести в консоль всё содержимое file, ключ -n выведет с номерами строкtac file
- вывести в консоль всё содержимое file НАОБОРОТmore file
- вывести в консоль всё содержимое file и постранично скролить пробеломhead -n 10 file
- вывести первые 10 строк файлаtail -n 10 file
- вывести последние 10 строк файлаpaste -d '|' file1 file2
- сопоставить в двух столбцах строки из file1 и file2 и вывести в консольsed 's/что_заменить/чем_заменить/g' file.txt
- заменить в файле указанные строки на указанные, вывести в консоль, файл не меняетсяsort file1 file2 | uniq -u
- отобразить только неповторяющиеся строки в обоих файлахsort file1 file2 | uniq -d
- отобразить только повторяющиеся строки в обоих файлахwc file
- посчитать количество слов, строк и байт в файлеmc
- удобный псевдографический файловый менеджерnano -l$ file
- удобный текстовый редактор с переносом строк и нумерацией строк
Специальные атрибуты файлов Linux
chattr +i – сделать файл защищенным от изменений, добавив специальный бит, chattr -i – убрать защиту
chattr +a – позволяет открывать файл на запись только в режиме добавления
chattr +s – сделает невосстановимым после удаления, место заполнится нулями
chattr +u – сделает легко восстановимым после удаления
chattr +d – указывает утилите dump игнорировать этот файл во время создания резервной копии
chattr +с – позволяет ядру автоматически сжимать/разжимать содержимое файла
chattr +S – при сохранении будет произведена синхронизация, как при выполнении команды sync
Nano Hotkeys
- Ctrl+G – Все горячие клавиши
- Ctrl+W – Поиск
- Alt+W – Повторный поиск без диалога
- Ctrl+Y – Страница назад
- Ctrl+V – Страница вперед
- Ctrl+K – Удалить строку
- Ctrl+O – Сохранить
- Ctrl+X – Выход
- Alt+| или Alt+\ – В начало файла
- Alt+/ или Alt+? – В конец файла
- Alt+U – Действие назад
- Alt+E – Действие вперед
Управление пользователями и группами в Linuxuseradd -m user
- создать пользователя user(создаст /home/user
и в etc/passwd
)useradd -c "new user" -g admin -d /home/user -s /bin/bash user
- создать пользователя user, добавить в группе admin, назначить домашний каталог /home/user и назначить оболочку bashuserdel -r USER
- удалить пользователя и его домашний каталогpasswd user
- задать/изменить пароль указанному юзеруcat /etc/passwd | grep user
- вывести информацию о пользователе, его группах, папкахuserdel user
- удалить пользователяusermod -aG sudo user
- добавить пользователя в группу sudoers
Можно сразу убрать запрос пароля на эскалацию привилегий:echo "user ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/user
usermod -c "FTP User" -g system -d /ftp/user -s /bin/nologin USER
- изменить атрибуты USER, забрать оболочку, переназначит домашнюю директорию, добавить в группу и изменить комментарийusermod user
- изменение пользователяchage -E 2020-10-31 USER
- назначить время окончания действия учетной записи USER
groupadd group_name
- добавить группу group_namegroupdel group_name
- удалить группу group_namegroupmod -n new_group_name old_group_name
- переименовать группу old_group_name в new_group_name
pwck
- проверить корректность /etc/passwd и /etc/shadowgrpck
- проверить корректность /etc/group
Управление правами доступа в Linuxchown user: file
- сделать пользователя и группу lepkov владельцами файла file (не опечатка, это сокращенный вариант)chown -R user: /home/user
- рекурсивно сделать пользователя и группу user владельцами директории, поддиректорий и файлов /home/user
CHMOD
chmod -R u+rwx /home/user
chmod -R g-rwx /home/user
chmod -R o-rwx /home/user
или
chmod -R 700 /home/user
Права 755 на все папки и подпапки текущей директории
find . -type d -exec chmod 755 {} \;
Права 644 на все файлы и файлы в подпапках текущей директории
find . -type f -exec chmod 644 {} \;
Права доступа в Linux
r – чтение;
w – запись;
x – выполнение;
s – выполнение от имени суперпользователя (дополнительный);
Категории пользователей Linux
u – владелец файла;
g – группа файла;
o – все остальные пользователи;
Примеры настройки прав доступа в Linux
u+x – разрешить выполнение для владельца;
ugo+x – разрешить выполнение для всех;
ug+w – разрешить запись для владельца и группы;
o-x – запретить выполнение для остальных пользователей;
ugo+rwx – разрешить все для всех;
Права доступа в Linux в цифрах
0 – никаких прав;
1 – только выполнение;
2 – только запись;
3 – выполнение и запись;
4 – только чтение;
5 – чтение и выполнение;
6 – чтение и запись;
7 – чтение запись и выполнение.
Примеры настройки прав доступа с цифрами в Linux
744 – разрешить все для владельца, а остальным только чтение;
755 – все для владельца, остальным только чтение и выполнение;
764 – все для владельца, чтение и запись для группы, и только чтение для остальных;
777 – всем разрешено все.
Многозадачность в SSH сессии Linuxssh username@ip_address -p 22
- подключиться по ssh, ключ -p опционален ^Z (Ctrl+Z)
- остановить и увести текущую программу в фонbg
- продолжить её выполнение в фонеfg
- достать программу из фонаjobs
- посмотреть список фоновых задачfg N
- достать задачу номер N
Работа с текстовыми файлами в Linux
Вывод последних 10 строк из лога каждую секунду для наблюдения в реальном времени
tail -f -s 1 -n 10 /var/log/nginx/error.log
То же самое с помощью watch
watch -n 1 tail -n 10 /var/log/nginx/error.log
Системный журнал по сервису cron в реальном времени за сегодня с выводом последних 10 строк
journalctl -u cron.service -f -n 10 --since today --no-pager
Удаляем пустые строки из файла:
sed '/^$/d' file.txt
Удаляем дубли строк (для анализа логов помогает):
awk '!seen[$0]++' file.txt > file_new.txt
Удаляем все пробелы и символы табуляции в начале каждой строки файла (помогает чистить конфиги):
sed 's/^[ \t]*//' extensions.conf > extensions.conf.new
Удаляем строки, где знак комментария ; стоит в начале строки (то же самое, помогает чистить конфиги, особенно астериска):
sed '/^;/d' sip.conf
grep -E -v ';|^$' php.ini
Вывести файл без комментариев и пробелов
grep -ve '^[[:space:]]*\(#\|$\|;\)' filename
Вывести строки, начиная с третьей (в костылях с мониторингом помогает):
awk 'NR > 3' file.txt
Вырезаем первую и последнюю строки (то же самое, для мониторинга обычно надо):
cat file.txt | awk 'NR > 1' | head -n-1
Выполняем команду cat file.txt 5 раз (в консоли пригождается):
for n in {1..5}; do cat file.txt; done
Удаление последнего или двух последних символов в строках (какой-то мусор в строках удобно убирать):
sed 's/.$//' file.txt
sed 's/..$//' file.txt
Удаление первого или двух первых символов в строках (то же самое):
sed 's/^.//' file.txt
sed 's/^..//' file.txt
Находим все строки с hello=какое-то значение и меняем на hello=1000:
cat file.txt | sed 's/^hello=.*/hello=1000/g' > file_new.txt
Находим все строки с admin: и удаляем их (часто пригождалось, когда менял права доступа на линуксовых шарах, предварительно выгрузив их):
sed '/admin:/d' file.acl > file_new.acl
Заменяем все вхождения строки search на replace:
sed 's/search/replace/g' file.txt > file_new.txt
Заменить рекурсивно текст во всех файлах:
grep 'надо поменять' -P -R -I -l * | xargs sed -i 's/надо_поменять/меняем_на_это/g'
Работа с процессами в Linux
htop
- удобный диспетчер задач в реальном времени с нагрузкой, подсветкой, сортировкой, фильтрацией, завершением процессов
pstree -p
- Вывести процессы в виде дерева c PIDkill [process id]
- Убить процесс по айди, ключ -9 убьёт сразуpkill [process name]
- Убить процесс по имениkillall [process name]
- убить все процессы с указанным именем
Убить все процессы содержащие строку myProcessName
ps -ef | grep 'myProcessName' | grep -v grep | awk '{print $2}' | xargs -r kill -9
Выводим процессы астериска (или любого другого), а лучше в htop фильтр F4
ps -auxw | grep "asterisk"
Считаем количество процессов nodejs (или любого другого):
ps ax | grep "nodejs" | wc -l
Считаем количество процессов в системе и выводим 5, которые запустили больше всего экземпляров:
ps -ef | awk '{ print $8 }' | sort -n | uniq -c | sort -n | tail -5
Анализ сети в Linux
Скачать файл из интернета в текущую директорию
wget https://download.onlyoffice.com/install/workspace-install.sh
iptables -L -v -n
- Все правила iptablesiptables -t nat -L -v -n
- Правила NAT в iptablesufw status numbered
- Все правила ufw с нумерацией
netstat -pnltu
- Посмотреть какие порты слушаются
netstat -nutlp
- TCP и UDP порты и их программыhost subbnet.ru
- DNS записи указанного домена в удобном виде или подробней dig subbnet.ru ANYtcpdump tcp port 80
- отобразить весь трафик на TCP порт 80 (http)traceroute subbnet.ru
- трассировка маршрута до указанного хоста, аналог tracert в Windowscurl -LI https://subbnet.ru/
- Получить ответ-заголовки от сайта
Подсчет подключений с каждого IP. Если сервер публичный и вы видите, что он тормозит, первое, что стоит проверить, это количество подключений к нему.
netstat -ntu | awk '{print $5}' | grep -vE "(Address|servers|127.0.0.1)" | cut -d: -f1 | sort | uniq -c | sort -n| sed 's/^[ \t]*//'
Чаще всего имеет смысл сразу же исключить из списка адреса с малым количеством подключений. Например, можно вывести только те ip, с которых более 10-ти подключений. Для этого к предыдущей команде надо добавить небольшое дополнение
netstat -ntu | awk '{print $5}' | grep -vE "(Address|servers|127.0.0.1)" | cut -d: -f1 | sort | uniq -c | sort -n| sed 's/^[ \t]*//' | awk '{if ($1 > 10 ) print$2}';
Подсчет запросов к веб серверу с разных IP. Если вас какой-то бот спамит запросами к веб серверу, то похожим образом можно быстро вычислить его по записям в логе.
tail -1000 /var/log/nginx/access.log | awk '{print $1}' | sort -n | uniq -c | sort -n | tail -n100 | awk '{if ($1 > 10 ) print $2}'
Рекомендую обрабатывать только часть лога, так как если он очень большой, можете подвешивать сервер своими запросами. Здесь взяты последние 1000 строк. Если надо весь файл проанализировать, используйте вместо tail команду cat.
cat /var/log/nginx/access.log | awk '{print $1}' | sort -n | uniq -c | sort -n | tail -n100 | awk '{if ($1 > 10 ) print $2}'
Список установленных соединений с сервером. Бывает нужно, когда есть подозрения на взлом и какую-то паразитную активность. В этом примере не вычисляется количество соединений, а просто приводится список уникальных ip адресов, с которыми установлено соединение.
netstat -lantp | grep ESTABLISHED | awk '{print $5}' | awk -F: '{print $1}' | sort -u
При необходимости можно сделать подсчет соединений из примеров прошлых команд.
Список tcp соединений. Это то же самое, что было в прошлой команде, но мне вывод больше нравится. Более наглядный, если смотреть его весь.
lsof -ni
Список всех активных входящих сокетов unix. Этой командой я не видел, чтобы особо пользовались, но по факту бывает быстрее через нее посмотреть открытый сокет, нежели каким-то другим способом. Например, сразу смотрим, запустился ли нужный нам сокет php-fpm.
netstat -lx | grep php-fpm
Кстати, то же самое можно смотреть и через ss, но лично мне вывод netstat просто больше нравится, особенно если смотришь его полностью глазами. Можете сами сравнить. Те же сокеты с помощью ss:
ss -xa
Остановка работы Linux
shutdown
- нормально завершение работы через минуту с уведомление других пользователей, можно добавить now или минуты, как и к другим командам
reboot (shudown -r)
- перезагрузка
halt
- остановить систему (устаревшее)
poweroff (shudown -r)
- выключение
shutdown -c
- отменит любое запланированное завершение работы
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.