Кладовочка

О разном, чтобы было под рукой онлайн

Linux: шпаргалка по командам — bash, права, процессы, grep/sed/awk, перенаправление, хоткеи

Linux — основа серверной разработки и DevOps. Шпаргалка охватывает повседневные команды, перенаправление, хоткеи и диагностику реальных проблем.

Горячие клавиши терминала

Сочетание Действие
Ctrl+R Интерактивный поиск по истории (нажмите ещё раз — следующее совпадение)
Ctrl+A / Ctrl+E В начало / конец строки
Ctrl+U / Ctrl+K Удалить от курсора до начала / до конца строки
Ctrl+W Удалить слово перед курсором
Ctrl+L Очистить экран (аналог clear)
Ctrl+C Прервать текущий процесс (SIGINT)
Ctrl+D EOF (выйти из shell, закрыть stdin)
Ctrl+Z Приостановить процесс (SIGTSTP), fg вернуть, bg в фон
Tab Автодополнение (двойной Tab — показать варианты)
!! Повторить последнюю команду
sudo !! Повторить последнюю команду с sudo
!$ Последний аргумент предыдущей команды
!123 Выполнить команду #123 из history

Перенаправление и коннекторы

# Стандартные потоки: stdin(0), stdout(1), stderr(2)

cmd > file           # stdout в файл (перезапись)
cmd >> file          # stdout в файл (добавление)
cmd < file           # stdin из файла
cmd 2> file          # stderr в файл
cmd > file 2>&1      # stdout и stderr в один файл
cmd &> file          # то же самое (bash)
cmd > /dev/null 2>&1 # скрыть весь вывод

# Пайпы — передача stdout → stdin
cmd1 | cmd2          # вывод cmd1 на вход cmd2
cmd1 | tee file      # вывод и в файл, и дальше в пайп

# Коннекторы
cmd1 && cmd2         # cmd2 только если cmd1 успешно (exit 0)
cmd1 || cmd2         # cmd2 только если cmd1 с ошибкой
cmd1 ; cmd2          # cmd2 всегда, независимо от результата

# Коды возврата
echo $?              # код возврата последней команды (0 = успех)
true && echo "OK"    # true возвращает 0
false || echo "FAIL" # false возвращает 1

Файловая система и навигация

# Навигация
pwd && ls -la && ls -ltr            # список + сортировка по времени
tree -L 2                           # дерево, глубина 2
cd -                                # предыдущая директория
pushd /tmp && popd                  # временный переход

# Поиск файлов
find . -name "*.log" -type f -mtime -7     # логи за 7 дней
find . -size +100M                           # > 100MB
find . -name "*.tmp" -delete                 # найти и удалить
find . -type f -exec chmod 644 {} +          # выполнить над найденным
locate nginx.conf                             # быстрый поиск (sudo updatedb)

# Просмотр
cat / head -n 20 / tail -n 100 / less / wc -l file
tail -f app.log                                # follow
du -sh * | sort -rh | head -10                # топ-10 по размеру
du -ahx . | sort -rh | head -5                # топ-5 файлов (без других ФС)
df -h && df -i                                # место и inodes
stat file                                      # все метаданные

Права доступа: две нотации

# Символьная нотация: u(user) g(group) o(others) a(all)
chmod u+x script.sh         # user + execute
chmod go-w file.txt         # group и others убрать write
chmod ug=rw,o=r file.txt    # user/group=rw, others=r
chmod a+x script.sh         # всем + execute

# Числовая нотация: r=4, w=2, x=1
chmod 755 script.sh         # rwxr-xr-x (4+2+1=7, 4+0+1=5, 4+0+1=5)
chmod 644 file.txt          # rw-r--r--
chmod 600 secret.key        # только владелец
chmod 777 public/           # всем всё (опасно!)

# Таблица:
# 7 = rwx   6 = rw-   5 = r-x   4 = r--
# 3 = -wx   2 = -w-    1 = --x   0 = ---
# Первая цифра: владелец, вторая: группа, третья: остальные

# Смена владельца
chown user:group file && chown -R user:group dir/

# Специальные биты и атрибуты
chmod 1777 /tmp             # sticky bit (только владелец удаляет)
chattr +i important.txt     # immutable (даже root не удалит)
lsattr file && chattr -i file

Процессы

ps aux | grep nginx                                  # поиск
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head    # топ по памяти
pstree -p                                             # дерево
top -u username                                       # процессы пользователя

kill PID          # SIGTERM (15) — вежливо
kill -9 PID       # SIGKILL — жёстко
killall name      # все процессы по имени
pkill -f "python" # убить по паттерну

# Фоновые процессы
cmd &                   # в фоне
Ctrl+Z → bg             # приостановить → в фон
jobs && fg %1           # список → вернуть задачу 1
nohup cmd & && disown   # не убивать при выходе

# Приоритет
nice -n 10 cmd          # низкий приоритет (-20..19, меньше = выше)
renice -n 5 -p PID      # изменить запущенному

Системная информация и память

uname -a && lsb_release -a && hostnamectl
uptime && free -h && lscpu && lsblk
dmesg | tail -50                          # ядро
journalctl -u nginx -f                    # логи сервиса
journalctl --since "1 hour ago"

# Диагностика «No space»
df -h && df -i                            # блоки и inodes
du -sh /* | sort -rh | head -20           # кто занимает
lsof | grep deleted                       # файлы, занятые процессами

# Память
vmstat 1 && cat /proc/meminfo

# Очистка
journalctl --vacuum-size=500M
docker system prune -a

Сеть

ip a && ip route                        # интерфейсы и маршруты
ss -tlnp                                # слушающие TCP (PID/процесс)
ss -tlnp | grep :8080                   # кто на порту
lsof -i :8080                           # альтернатива
ss -tan state time-wait | wc -l         # сколько TIME_WAIT

ping -c 3 host                          # доступность
traceroute host && nslookup domain && dig domain ANY
curl -v https://example.com             # детальный HTTP
curl -I https://example.com             # только заголовки
wget -O file url && nc -zv host 443     # TCP-порт

# Файрвол
iptables -L -n -v
# ufw (Ubuntu): ufw enable / ufw allow 80 / ufw status

grep, sed, awk

# grep
grep -i -r "pattern" dir/                         # рекурсивно, без регистра
grep -E "pat1|pat2" file                          # расширенный regex
grep -P "\d{3}-\d{2}" file                        # Perl-совместимый regex
grep -v "exclude" file                            # исключить
grep -c "pattern" file                            # подсчёт
grep -n -A 3 -B 2 "pattern" file                  # контекст + номера строк
grep -l "TODO" *.js                                # только имена файлов
grep --color=auto "pattern" file                   # подсветка

# sed
sed 's/old/new/' file               # первая замена в строке
sed 's/old/new/g' file              # все замены
sed -i 's/old/new/g' file           # на месте (⚠️ перезапись)
sed -i.bak 's/old/new/g' file       # с бэкапом
sed '/^$/d' file                    # удалить пустые строки
sed -n '5,10p' file                 # строки 5-10
sed '/start/,/end/d' file           # удалить блок между паттернами

# awk
awk '{print $1, $NF}' file                          # первый и последний столбец
awk -F: '{print $1, $7}' /etc/passwd                # свой разделитель
awk '$3 > 1000 {print $1}' file                     # условие
awk '{sum += $2} END {print "Sum:", sum}' file      # сумма
awk '{count[$1]++} END {for (w in count) print w, count[w]}' | sort -rn -k2 | head  # частотный топ
awk 'NR==FNR {map[$1]=$2; next} {print $0, map[$1]}' f1 f2  # JOIN (NR=общий, FNR=текущий)

Systemd

systemctl start|stop|restart|reload|enable|disable|status nginx
systemctl is-enabled nginx
journalctl -u nginx -f --since today
systemctl list-timers                 # таймеры (cron-альтернатива)
systemctl list-units --state=failed  # упавшие сервисы

Пользователи и история

who && w && id
useradd -m -s /bin/bash user && usermod -aG docker user
passwd user && su - user && sudo -i

# История
history | grep git
!123 && !! && sudo !!           # повторить команду / последнюю / с sudo
^old^new                        # заменить в последней команде и выполнить
export HISTTIMEFORMAT="%F %T "  # дата в истории
export HISTSIZE=10000           # размер истории

Пакетные менеджеры

# apt (Debian/Ubuntu)
apt update && apt upgrade && apt install pkg && apt search keyword
apt autoremove --purge          # удалить сиротские пакеты

# dnf (RHEL/Fedora)
dnf install pkg && dnf update && dnf search keyword

Алиасы и конфигурация

# ~/.bashrc или ~/.bash_aliases
alias ll="ls -la"
alias la="ls -A"
alias ..="cd .."
alias ...="cd ../.."
alias grep="grep --color=auto"

# Защита от дурака
alias rm="rm -i"
alias cp="cp -i"
alias mv="mv -i"

# Полезные
alias ports="ss -tlnp"
alias myip="curl -s ifconfig.me"
alias df="df -h"
alias free="free -h"
alias psg="ps aux | grep -v grep | grep"
alias untar="tar -xzf"
alias serve="python3 -m http.server"

Bash-однострочники

# Заменить текст во всех файлах
find . -name "*.txt" -exec sed -i 's/old/new/g' {} +

# Убить процессы по имени
ps aux | grep process | awk '{print $2}' | xargs kill

# Топ-10 больших файлов
find . -type f -exec du -h {} + | sort -rh | head -10

# Удалить файлы старше 30 дней
find /logs -name "*.log" -mtime +30 -delete

# Мониторинг лога с фильтрацией
tail -f app.log | grep --line-buffered "ERROR"

# Архивация
tar -czf archive.tar.gz dir/ && tar -xzf archive.tar.gz
curl -s url | tar -xz                      # скачать и распаковать

# Частотный анализ
sort file | uniq -c | sort -rn | head -10

# Параллельное выполнение
echo "h1 h2 h3" | xargs -n1 -P3 ssh {} 'uptime'

# Быстрый HTTP-сервер
python3 -m http.server 8000

Реальные проблемы: диагностика и решение

«Permission denied» — 5 причин

# 1. Обычные права → ls -la → chmod/chown
# 2. Родительская директория без +x → ls -ld /path → chmod +x dir
# 3. SELinux/AppArmor → ls -Z file → getenforce → chcon/setenforce 0
# 4. Immutable → lsattr file → chattr -i file
# 5. noexec mount → mount | grep noexec
# Полный трейс: namei -l /full/path/to/file

«No space left on device» — но df показывает место

df -i                         # inodes закончились? (много мелких файлов)
lsof | grep deleted           # удалённые файлы, занятые процессами
# Решение: перезапустить процесс, держащий deleted-файлы

«Address already in use» — порт занят

ss -tlnp | grep :PORT         # кто слушает
fuser -k PORT/tcp              # убить процесс на порту
sysctl net.ipv4.tcp_tw_reuse=1 # для TIME_WAIT

Процесс не убивается через kill -9

ps aux | awk '$8 ~ /D/'       # D-state = uninterruptible sleep
# kill -9 бессилен. Причина: I/O (NFS-таймаут, диск)
# Решение: восстановить I/O или перезагрузка

«Too many open files» — ulimit

ulimit -n                     # текущий лимит
ulimit -n 65536               # увеличить (временно)
lsof -p PID | wc -l           # сколько открыто
# Постоянно: /etc/security/limits.conf

Высокая нагрузка

uptime                        # load average (1, 5, 15 мин)
top -o %CPU                   # кто грузит CPU
iostat -x 1                   # дисковая нагрузка

Частые проблемы и их решения

Проблема Диагностика ✅ Решение
«Permission denied» ls -la + lsattr + namei -l /path chmod, chown, chattr -i, SELinux
«No space» при df с местом df -i + lsof | grep deleted inodes или перезапуск процессов
Порт занят ss -tlnp | grep PORT kill PID / сменить порт
Процесс не убивается ps aux | awk '$8 ~ /D/' D-state — решить I/O
Высокий LA uptime + top + iostat Найти и оптимизировать процесс
OOM Killer dmesg | grep -i oom Увеличить память/лимиты
DNS не работает nslookup google.com + ping 8.8.8.8 /etc/resolv.conf

Полезные ресурсы


Что дальше

Связанные шпаргалки: Docker, Kubernetes, Git Advanced, curl, awk, Си, C++, Rust, Go