Linux Команды (Shell Bash, Unix, SSH, PuTTY)

Список популярных Linux команд по категориям, которые нужно знать каждому разработчику.

На Windows для управления Linux сервером, используют бесплатную программу PuTTY - она самая популярная.

Файлы/Папки

Команда Действие
mc Midnight Commander - что-то вроде Norton Commander.
ls Показать список файлов и каталогов.
ls -al Показать все файлы на сервере (даже скрытые) + размер + владельца + права на фалы + дату изменения.
ls -aln Показывает UID вместо имени пользователя.
cd dir Перейти в папку "dir".
cd Перейти в домашний каталог.
pwd Показать текущую папку (путь до текущего каталога).
mkdir dir Создать папку "dir".
cp файл1 файл2 Копировать файл1 в файл2.
cp -r папка1 папка2 Копировать папка1 в папка2.
cp -rp папка1 папка2 Копировать папка1 в папка2 сохраняя данные файлов (привелегии).
mv папка1 папка2 Переименовать / переместить папку.
mv файл1 файл2 Переименовать / переместить файл.
rm file Удалить файл с именем file.
rm -r dir Удалить папку "dir".
rm -f file Удалить форсированно file.
rm -rf dir Удалить форсированно каталог dir *.
rm -rf folder/* Опустошить папку folder.
touch filename Создать файл и с именем filename.
> filename Очистка файла. > access.log.
cat (concatenate) объединяет файлы.
cat filename Показать контент файла filename.
cat filename | less Показать контент файла filename + скроллинг.
cat filename | grep 'искомая строка' Выведет строки файла, включающие искомую строку.
cat > filename Создает файл с написанным контентом (ctrl+d для завершения).
cat >> filename Дополнить файл.
echo "hello" > filename Записать hello в файл.
echo "hello" >> filename Дополнить файл текстом hello.
more filename Показать содержимое файла.
less filename +G Показать последние строки файла.
head filename Показывает первые 10 строк из файла.
tail filename Показывает последние 10 строк из файла.
tail -f filename Показывает содержимое file по мере роста, начинает с последних 10 строк.
Пример записи текста в файл
cat > filename
This is text, perhaps pasted in from some other source.
Or else entered at the keyboard, doesn't matter.
[Ctrl+D]

Использование оператора >> будет добавлять данные в конце файла, а использование > будет перезаписывать содержимое файла, если оно уже существует.

Также важно знать, что по умолчанию echo добавляет символ новой строки в конце. Его можно подавить с помощью флага -n:

echo -n "hello" >> filename

Занимаемое место

Команда Действие
df Покажет информацию об использовании диска.
df -h Тоже что df только для людей (в M, GB).
du Покажет информацию об использовании диска файлами и папками.
du -sh * Посчитать занимаемое место всех папок в указанной папке.
du -sh * | sort -hr Отсортировать по убыванию.
du -sh dir Узнать размер папки dir.

Подробнее

Процессы

Команда Действие
ps Показывает текущие активные процессы
top Показывает все процессы
kill процесс Убивает процесс с id "процесс"
killall проц Убивает все процессы с именем проц
bg Показывает список фоновых задач, а также остановленных
bg процесс Продолжит выполнение остановленного процесса в фоне

chmod - права доступа

Команда Действие
chmod 755 файл Задает права 755 для файла
chmod o-r,a-w month.txt text.txt Запретим Остальным читать и всем изменять два файла.
find /path/to/dir -type f -exec chmod 0644 {} \; Укажет права 644 на все файлы на сервере
find /path/to/dir -type d -exec chmod 0755 {} \; Укажет права 755 на все папки на сервере

chown - владелец и группа

chown пользователь опции /путь/к/файлу

Опции:

  • -c, --changes - подробный вывод всех выполняемых изменений.
  • -f, --silent, --quiet - минимум информации, скрыть сообщения об ошибках.
  • --dereference - изменять права для файла к которому ведет символическая ссылка вместо самой ссылки (поведение по умолчанию).
  • -h, --no-dereference - изменять права символических ссылок и не трогать файлы, к которым они ведут.
  • --from - изменять пользователя только для тех файлов, владельцем которых является указанный пользователь и группа.
  • -R, --recursive - рекурсивная обработка всех подкаталогов.
  • -H - если передана символическая ссылка на директорию - перейти по ней.
  • -L - переходить по всем символическим ссылкам на директории.
  • -P - не переходить по символическим ссылкам на директории (по умолчанию).
Команда Действие
chown root ./dir1 Изменим владельца папки dir1 на root.
chown root:root ./dir2 Изменим владельца и группу папки dir1 на root.
chown -R root:root ./dir3 Изменим владельца и группу папки dir1 и всех вложенных файлов/папок на root.
chown --from=root:root www-data:www-data -cR ./ Изменим владельца и группу на www-data только у файлов/папок, владелец и группа которых root в текущем каталоге.

SSH

Команда Действие
ssh user@host Подключает к хосту "host" как "user".
ssh user@host "echo \$HOME" Сразу выполняет команду echo $HOME на сервере.
ssh -p port user@host Подключает к хосту "host" на порт "port" как "user".
ssh-copy-id user@host Добавит ключ на "host" для пользователя "user", при этом операция входа будет происходить без логина, а через ключ.

Не интерактивное подключение и файл ~/.bashrc

При удаленном выполнении команды через ssh, например, ssh user@host "echo $HOME", НЕ подключается файл ~/.bashrc! Если у вас есть алиасы в этом файле, они работать не будут! И это может сыграть с вами в злую шутку в некоторых случаях.

Так происходит, потому что когда вы выполняете команду удаленно с помощью SSH, удаленная оболочка обычно запускается в неинтерактивном режиме. Когда оболочка запускается в неинтерактивном режиме, она может пропустить файлы инициализации, такие как .bashrc, чтобы обеспечить более быструю и предсказуемую среду выполнения.

.ssh/config

Чтобы постоянно не писать креды, можно создать файл .ssh/config и добавить в него конфиг удаленного подключения:

Host myhost
	HostName 56.30.203.178
	User ubuntu
	Port 22
	IdentityFile ~/.ssh/qa-server.key

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

$ ssh myhost

Все возможные параметры:

Host {YOUR_HOST_KEY}
  AddressFamily any
  BatchMode no
  CheckHostIP yes
  Cipher 3des
  Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
  ConnectTimeout 0
  EscapeChar ~
  ForwardAgent no
  ForwardX11 no
  GSSAPIAuthentication no
  GSSAPIDelegateCredentials no
  HostbasedAuthentication no
  IdentityFile ~/.ssh/id_dsa
  IdentityFile ~/.ssh/id_ecdsa
  IdentityFile ~/.ssh/id_ed25519
  IdentityFile ~/.ssh/id_rsa
  IdentityFile ~/.ssh/identity
  MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
  PasswordAuthentication yes
  PermitLocalCommand no
  Port 22
  Protocol 2
  ProxyCommand ssh -q -W %h:%p gateway.example.com
  RekeyLimit 1G 1h
  RhostsRSAAuthentication no
  RSAAuthentication yes
  StrictHostKeyChecking ask
  Tunnel no
  TunnelDevice any:any
  VisualHostKey no

Поиск файлов/папок/в файлах

find

Мануал: https://www.geeksforgeeks.org/find-command-in-linux-with-examples/

# Найдет все файлы/папки, которые начинаются с "Top" (регистр важен). В текущем каталоге
find . -name 'Top*'

# Найдет все файлы/папки, которые начинаются с 'top' (регистр не важен - Top, top, TOP)
find / -iname 'Top*'

# Найдет все файлы/папки, которые начинаются с 'top', а затем идут 3 любых символа
find / -name 'top???'

# Найдет все файлы/папки с расширением ".tex" (в домашнем каталоге ~)
find ~ -name '*.tex'

# Исключить директорию при поиске.
find . -name '*.js' -not -path '/dir/*'
# Ищет папку с именем начинающимся с "work".
find / -type d -name 'work*'

# Ищет файл заканчивающийся на "work.rb".
find / -type f -name '*work.rb'

# Ищет все svg и png файлы по регулярке.
# Note: -regex паттерн должен совпадаеть с полным именем файла
# относительно указанного каталога, а не с отдельным именем файла.
find / -regex ".*\.\(svg\|png\)$"

# Ищет по вхождению пути.
find ~/ -regex ".*/Docs/Для\ работы/.*"

# Ищет файлы в каталоге /usr/local, размер которых больше 10,000 КБ
$ find /usr/local -size +10000k

# Ищет файлы в домашнем каталоге, размер меньше 300 байт
find ~ -size -300b

# Ищет пустые файлы (размер 0)
find ~ -empty
# вывести все файлы в каталоге /usr/local, модифицированные в течение последних 24 часов.
find /usr/local -mtime -1

# вывести все файлы в домашнем каталоге, модифицированные вчера.
# Опция -daystart определяет отсчет времени с момента начала текущих суток.
find ~ -mtime 1 -daystart

# вывести все файлы в каталоге /usr, модифицированные в течение года:
find /usr -mtime +356 -daystart

# вывести все файлы в домашнем каталоге, модифицированные в период от 2 до 4 дней тому назад:
find ~ -mtime 2 -mtime -4 -daystart

# найти файлы, которые новее указанного файла, введите его имя в качестве аргумента опции -newer.
# вывести все файлы в каталоге /etc, которые новее файла /etc/motd:
find /etc -newer /etc/motd

Еще примеры: https://www.opennet.ru/docs/RUS/linux_base/node149.html

ripgrep

Это отдельный пакет https://github.com/BurntSushi/ripgrep

Установка на убунту:

$ sudo apt-get install ripgrep

// или так (последняя версия)
// Релизы: https://github.com/BurntSushi/ripgrep/releases
$ curl -LO https://github.com/BurntSushi/ripgrep/releases/download/13.0.0/ripgrep_13.0.0_amd64.deb
$ sudo dpkg -i ripgrep_13.0.0_amd64.deb
Команда Действие
rg -i "hello" /sys/ ripgrep - аналог grep. Искать слово hello во всех файлах папки /sys/ (регистронезависимый поиск).
rg -ig access.log "/api/wp" Поиск подстроки "/api/wp" в файле access.log

grep

grep [options] pattern [file...]

Примеры:

# Ищет "слово" в "файле".
grep 'слово' file

# Поиск по регулярке
grep "\<[A-Za-z].*\>" file

# Искать слово hello во всех файлах папки /sys/.
grep -r hello /sys/

# Искать слово text во всех файлах текущей папки. ignore-case (i) line-numbers (n)
grep -inIR "text"
# Case insensitive: match any line in foo.txt
# that contains "bar"
grep -i bar foo.txt

# match any line in bar.txt that contains
# either "foo" or "bar"
grep -E "foo|bar" bar.txt

# Remove all folders in current dir except "foo" and "bar"
ls | grep -v -Ew 'foo|bar' | xargs rm -r

# match anything that resembles a URL in
# foo.txt and only print out the match
grep -oE "https?:\/\/((\w+[_-]?)+\.?)+" foo.txt

# can also be used with pipes:
# match any line that contains "export" in
# .bash_profile, pipe to another grep that
# matches any of the first set of matches
# containing "PATH"
grep "export" .bash_profile | grep "PATH"

# follow the tail of server.log, pipe to grep
# and print out any line that contains "error"
# and include 5 lines of context
tail -f server.log | grep -iC 5 error

# can also be used with pipes:
# match any line that contains "export" in
# .bash_profile, pipe to another grep that
# matches any of the first set of matches
# containing "PATH"
grep "export" .bash_profile | grep "PATH"

Find all files containing specific text (string) on Linux.

# search pattern in all files:
grep -rnw '/path/to/somewhere/' -e 'pattern'

# only search through those files which have .c or .h extensions:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"

# exclude searching all the files ending with .o extension:
grep --exclude=\*.o -rnw '/path/to/somewhere/' -e "pattern"

# exclude the dirs dir1/, dir2/ and all of them matching *.dst/:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/search/' -e "pattern"

Опции:

# Matching options:

-r, --recursive             # All files recursively
							# follow symlinks only if they are on the command line, but
							# skip symlinks that are found recursively.
-R, --dereference-recursive # All files recursively (follow all symlinks).
-e, --regexp=PATTERN
-f, --file=FILE
-i, --ignore-case     # Forgets about case sensitivity
-v, --invert-match
-w, --word-regexp     # Ищем целое слово (а не подстроку)
-x, --line-regexp
-I                    # Skip binary files

# Pattern options:

-G, --basic-regexp    # basic regular expression (default)
-E, --extended-regexp # extended regular expression
-P, --perl-regexp     # perl compatible regular expression
-F, --fixed-strings   # list of fixed strings

# Output Options:

-n, --line-number     # Show the line numbers of the matches
-c, --count           # print the count of matching lines. suppresses normal output
	--color[=WHEN]    # applies color to the matches. WHEN is never, always, or auto
-m, --max-count=NUM   # stop reading after max count is reached
-o, --only-matching   # only print the matched part of a line
-q, --quiet, --silent
-s, --no-messages     # suppress error messages about nonexistent or unreadable files

Source: https://stackoverflow.com/questions/16956810/how-to-find-all-files-containing-specific-text-string-on-linux

Мануал: https://help.ubuntu.com/community/grep

Шпаргалки: https://devhints.io/grep https://quickref.me/grep

Информация о системе (диски, файлы, размеры)

Команда Действие
date Показать время и дату
cal Показать календарь
uptime Проверить аптайм (время безотканой работы)
w Покажет количество пользователей, которые в данный момент используют сервер
whoami Покажет Ваш логин
finger юзер Покажет инфу о пользователе "юзер"
uname -a Информация про ядро
cat /proc/cpuinfo Информация про CPU
cat /proc/meminfo Информация про память
man команда Покажет все о команде
free Сколько памяти используется
whereis программа Найдет место расположения программы
which программа Определяет, что "программа" будет запущена первой
vmstat Покажет загрузку процессора

ln (ссылки)

Ссылки в Linux бывают двух типов:

Символические

Символические ссылка (symbolic или soft link) — это специальный файл, который является ссылкой на другой файл или каталог.

Soft symlink

Символическая ссылка не содержит в себе (внутри) копии самого файла, на которую она указывает. Она является всего лишь указателем на файл. Так. если вы удалите исходный файл, мягкая ссылка не будет иметь никакой ценности, поскольку она будет указывать на несуществующий файл.

Связь между символической ссылкой и файлом является «мягкой». Если удалить символическую ссылку, то файл, на который она указывает, не удаляется.

При создании символических ссылок можно указывать относительный путь до целевого файла. В таком случае ссылка считает, что относительный путь указан относительно каталога, в котором создана сама ссылка (но не относительно каталога, из которого она была создана).

Жёсткие

Жестка ссылка (hard link) - является синонимом для файла. Когда вы создаете жесткую ссылку, создается дополнительный указатель на существующий файл, но не копия файла.

Hard link

Жесткие ссылки выглядят в файловой структуре как еще один полноценный файл.

Даже если удалить оригинальный файл, жесткая ссылка все равно будет содержать данные оригинального файла. Поскольку жесткая ссылка действует как зеркальная копия исходного файла.

В Linux каждый файл имеет уникальный идентификатор - индексный дескриптор (inode). Это число, которое однозначно идентифицирует файл в файловой системе. Жесткая ссылка и файл, для которой она создавалась имеют одинаковые inode. Поэтому жесткая ссылка имеет те же права доступа, владельца и время последней модификации, что и целевой файл. Различаются только имена файлов. Фактически жесткая ссылка это еще одно имя для файла.

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

Синтаксис:

ln опции исходный_файл имя_ссылки

Примеры:

«символьная» ссылка (symbolic link)

ln -s /home/pingvinus/myfile.txt mylink

ls -li
792300 -rw-rw-r-- 1 kama kama 13-фев-13 13:07 myfile.txt
787622 lrwxrwxrwx 1 kama kama 13-фев-13 13:08 mylink -> /home/kama/myfile.txt

# ссылка и целевой файл имеют разные inode (792300 и 787622).

«жёсткая» ссылка (hard link)

ln /home/pingvinus/myfile.txt mylink

ls -li
787622 -rw-rw-r-- 2 kama kama 13-фев-13 13:19 myfile.txt
787622 -rw-rw-r-- 2 kama kama 13-фев-13 13:19 mylink

# Видим что оба файла имеют одинаковый inode=787622,
# так как являются фактически разными именами для одного файла (одних данных)
# (inode которого 787622).

Подробнее: https://pingvinus.ru/note/ln

Архивы

tar

# Запаковать файлы текущей папки в архив myfile.tar
tar -cf myfile.tar

# Распаковать myfile.tar
tar -xf myfile.tar

# Сжать с использованием Gzip (особое сжатие на сервере)
tar -czf myfile.tar.gz dir

# Распаковать Gzip-файл
tar -xzf myfile.tar.gz

# Распаковать в папку dest.
tar -xzf myfile.tar.gz -C dest

# Сжать с использованием Gzip
tar -cjf myfile.tar.bz2

# Распаковать Bzip2-файл
tar -xjf myfile.tar.bz2

Пример.

Поместим папки languages, uploads (с файлами), которые находятся в папке www/wp-content/ (относительно текущей папки) в файл архива dev/dump/files.tar.gz (путь относительно текущей папки):

$ tar -cz -f dev/dump/files.tar.gz -C www/wp-content/ languages uploads

Опции:

tar [options] [archive-file] [file or directory to be archived]

Options:
-c : Creates Archive
-x : Extract the archive
-f : creates archive with given filename
-t : displays or lists files in archived file
-u : archives and adds to an existing archive file
-v : Displays Verbose Information
-A : Concatenates the archive files
-z : zip, tells tar command that creates tar file using gzip
-j : filter archive tar file using tbzip
-W : Verify a archive file
-r : update or add file or directory in already existed .tar file
-C dir : change current directory to dir before performing any operations

zip, unzip, gzip, gunzip

Команда Действие
gzip file Сжать file и переименовать в его в file.gz.
gzip -d file.gz Распаковать file.gz в file. Удаляет оригинал.
gunzip file.gz Распаковать file.gz в file. Удаляет оригинал.
gunzip --keep file.gz Распаковать file.gz в file. Сохранить оригинал.
gunzip -c file.gz > /other/file Распаковать file.gz в другое место. Удаляет оригинал.
Команда Действие
man zip / man unzip Расширенная документация.
zip --help или unzip --help Справка по командам и параметрам.
zip archive.zip filename Сжать файл filename в архив archive.zip.
zip –r archive.zip dirname Сжать папку dirname в архив archive.zip.
zip –r archive.zip dirname Дополнить/заменить все в архиве archive.zip из папки dirname.
zip -d file.zip "assets/*" Удалить все файлы из папки assets/* внутри zip архива file.zip.
unzip archive.zip Распаковать архив в текущую папку.
unzip –d dirname archive.zip Распаковать архив в папку dirname.
unzip -l archive.zip Выведет список файлов в архиве.
zip [options] [file_name.zip] [files_names]

-d : Remove files from the archive
-u : Update files in the archive
-m : Move files into the archive
-r : Recursively zip a directory
-x : Exclude files from the zip (zip -r name.zip -x dirname)
-v : Verbose mode - diagnostic information during compression.

Разница междe zip и gzip.

gzip сжимает контент одного файла. Не хранит информацию о названии и метаданные оригинального файла (только его контент).

zip сжимает несколько файлов или папки с файлами. Хранит информацию о каждом файле: название, дату создания/изменения и т.д.

Система, Apache, MySQL и База данных

Команда Действие
echo $PATH Показать все системные пути в переменной $PATH
apachectl restart Перезапуск сервера Apache
apachectl startssl Запуск сервера Apache
apachectl stop Выключение сервера Apache
/usr/local/etc/rc.d/mysql-server restart Перезапуск MySQL
mysqldump -u юзер_БД -p пароль_БД имя_БД > /путь/file.sql Создать копию базы данных бд.sql
mysql -u юзер_БД -p пароль_БД -D имя_БД < /путь/file.sql Импортировать бд.sql в базу данных mysql на сервере
exit Выйти из системы
reboot Перезапуск сервера
alias wpcli='php7.1 /usr/local/bin/wp' Создает алиас wpcli для команды php7.1 /usr/local/bin/wp. Работает только на время сессии.
alias -p Показать все существующие алиасы.
unalias wpcli Удаляет алиас wpcli

Копирование

scp (ssh)

Копирование файла с удаленного хоста на локальный хост:

$ scp username@from_host:file.txt /local/directory/

Копирование файла с локального хоста на удаленный хост:

$ scp file.txt username@to_host:/remote/directory/

Копирование каталога с удаленного хоста на локальный хост:

$ scp -r username@from_host:/remote/directory/  /local/directory/

Копирование каталога с локального хоста на удаленный хост:

$ scp -r /local/directory/ username@to_host:/remote/directory/

Копирование файла с удаленного хоста на удаленный хост:

$ scp username@from_host:/remote/directory/file.txt username@to_host:/remote/directory/
Заметки:
  • Хост может быть IP или имя домена. После нажатия Enter будет предложено ввести пароль SSH.

  • Хотя на этой странице рассматривается SCP Linux, инструкции будут работать и на Mac с помощью "Терминала". Вы также можете использовать WinSCP для выполнения этой задачи на ПК/сервере Windows.

  • При копировании исходного файла в целевой файл, который уже существует, SCP заменит содержимое целевого файла. Поэтому будьте осторожны.
  SCP options
–r Рекурсивное копирование целых каталогов. Обратите внимание, будет следование по символическим ссылкам, встречающиеся при обходе дерева.
-C Включить сжатие. Передает флаг -C в ssh для включения сжатия.
-P port - Указывает порт для подключения к удаленному хосту. Обратите внимание, что эта опция записывается с большой буквы 'P'.
-p Сохраняет mtime, atime, modes оригинального файла.
-q Тихий режим: отключает индикатор выполнения, а также warning'и и диагностические сообщения от ssh.
-o ssh_option - Может использоваться для передачи опций ssh в формате, используемом в ssh_config.
-v Развернутый режим. Печать отладочных сообщений о ходе выполнения. Это полезно при отладке проблем с подключением, аутентификацией и конфигурацией.
-l limit - Ограничивает используемую пропускную способность, указывается в Кбит/с.

rsync

Онлайн конфигуратор команды rsyncinator.app.

rsync опции источник назначение
Синхронизация папок на локальном компьютере
rsync -azvh /home/user/documents /mnt/backup_dir/
Синхронизация с удаленным сервером
rsync -azv /home/user/documents/ root@123.123.133.133:/home/
Синхронизация файлов по ssh
rsync -avzh -e ssh root@123.123.133.133:/home/ /home/user/documents/
# Или
rsync -avzh --rsh=ssh root@123.123.133.133:/home/ /home/user/documents/

Порт для ssh:

rsync -avzh -e "ssh -p 22" root@123.123.133.133:/home/ /home/user/documents/

Установка прав файлы/папки при копировании (эти права будут у файлов после копирования):

Флаг -a включает --perms параметр (сохранить исходные права). Допустим нам нужно, чтобы после копирования права на файлы/папки отличались от источника. Для этого мы можем использовать параметр --chmod, в котором указать какие права якобы установлены у источника, и они будут скопированы в папку назначения.

Здесь префикс D - directory, F - file.

rsync -avzh --chmod=D777,F666 --rsh=ssh root@1.1.1.1:source/ destination/
# Другой вариант записи
--chmod=777
--chmod=ugo=rwX
Исключение файлов
rsync --exclude 'file1.txt' source/ destination/
rsync --exclude 'file1.txt'  --exclude 'dir1/' source/ destination/

rsync --exclude={file1.txt,dir1/} source/ destination/
rsync --exclude={'file1.txt','dir1/'} source/ destination/

rsync --exclude={'*.txt','dir1/'} source/ destination/

# list.txt here is a file where every exclude rule is on separate line
rsync --exclude-from={'list.txt'} source/ destination/

При синхронизации каталогов (папок) через rsync ВАЖНО добавлять слэш / в конце пути источника.

  1. Если исходный путь НЕ содержит / на конце, rsync создаст сам каталог (вместе с содержимым) в каталоге назначения. Но обычно мы ожидаем что будет скопированно только содержимое каталога в папку назначения. Например:

    # неправильно
    rsync -av /path/to/source /path/to/destination

    Эта команда создаст папку source (вместе с содержимым) в папке /path/to/destination - т.е. по итогу у нас появится папка /path/to/destination/source. Обычно это НЕ то что мы ожидаем!

  2. Если исходный путь содержит / на конце, rsync скопирует только содержимое исходной папки в папку назначения. Например:

    # правильно
    rsync -av /path/to/source/ /path/to/destination/
    # тоже правильно, но вызывает вопросы
    rsync -av /path/to/source/ /path/to/destination

    Обе эти команды сработают одинаково и скопируют содержимое /path/to/source в /path/to/destination. Обычно, именно этого мы и ожидаем.

Таким образом, всегда нужно добавлять слэш в конце источника. Его можно не добавлять, когда вы хотите создать сам каталог (вместе с содержимым) в папке назначения.

Дефолтные параметры rsync:

rsync -r -l -t -p -g -o -D

Дефолтные параметры могут отличаться в разных версиях.

--no-OPTION - Можно отключить опцию добавив префикс no- к названию опции (в короткому или длинному названию). Например: --no-perms, --no-W.

Не все опции могут иметь префикс no-, а только базовые (некоторые опции это обертки - набор базовых опций).

Еще пример: вы используете опцию -a (--archive), но вам не нужно копировать владельца -o (--owner). Вместо того чтобы превращать -a в -rlptgD, вы можете написать так -a --no-o (или -a --no-owner).

Порядок важен: если записать так: --no-r -a, то -r опция останется включенной. Нужно писать так -a --no-r.

Опция описание
-e --rsh=COMMAND Указать оболочку для удаленного доступа, например, ssh.
-a --archive Режим архивирования - созраняет все metadata и permissions оригинальных файлов.
-z --compress Сжимать файлы перед передачей.
-v --verbose Выводить подробную информацию о процессе копирования.
-h --human-readable Выводить числа в удобочитаемом формате.
-q --quiet Минимум информации.
-c --checksum Проверка контрольных сумм для файлов.
-u --update Пропустить файлы, которые новее в папке назначения.
-l --links Копировать symlinks как symlinks.
-L --copy-links Превратить symlink в папку с содержимым.
-H --hard-links Копировать жесткие ссылки.
-t --times Сохранять время модификации.
-p --perms Сохранять права для файлов.
-o --owner Сохранять владельца (super-user only).
-g --group Сохранять группу.
-W --whole-file Копировать файлы целиком.
-r --recursive Перебирать директории рекурсивно.
-R --relative Относительные пути.
-b --backup Создание резервной копии.
-x --one-file-system Работать только в этой файловой системе - не пересекать границы файловой системы.
--delete Удалять файлы которых нет в источнике.
--chmod=CHMOD Пермишены файлов, которые якобы установлены на файлах источниках.
--exclude=PATTERN Исключить файлы по шаблону.
--exclude-from=FILE Считать паттерн исключения из указанного файла.
--include=PATTERN Включить файлы по шаблону.
--include-from=FILE Считать паттерн включения из указанного файла.
--progress Выводить прогресс передачи файла.
--stats Показать статистику передачи файлов.
--version -V Версия утилиты.
--dry-run -n Запустить тестово и реально ничего не делать.
--no-perms Не сохранять permissions оригинальных файлов (когда -p указан).
--no-recursive Отключить рекурсию.

Подробнее: https://man7.org/linux/man-pages/man1/rsync.1.html

Сеть

Команда Действие
ping хост Показывает пинг до хоста
whois dom.com Показывает WHOIS о домене "dom.com"
dig dom.com Показывает на каких DNS находится домен "dom.com"
dig -x host Реверсивно искать host
wget myfile Закачивает на компьютер файл myfile
wget -c file Если закачка была остановлена, то эта команда может ее продолжить
wget https://www.mysite.com/myfile.zip Загрузит файл из интернета (по адресу https://www.mysite.com/myfile.zip) в текущую директорию на сервере

Полезные команды

Команда Действие
cd - Вернуться в предыдущую директорию. Пример.
pushd / popd Сохранить и вернуться к директории. Пример.
history Показать историю всех команд. HISTTIMEFORMAT="%Y-%m-%d %T " в ~/.bashrc, чтобы добавить время напротив каждой команды когда она была использована. Пример.
tail -f /path/to/file Показать конец файла и вотчить его изменения.
truncate -s 0 /path/to/file Опустошить файл.
{command} | column -t Отобразить результат в виде колонок.
which {command} Например which php покажет путь до бинарного файла или ссылки на него который отвечает за команду. Пример.
sudo !! Повторяет последнюю команду с префиксом sudo.
exit Разлогиниться / выйти.

Комбинации клавиш

Команда Действие
Middle Mouse Вставить выделение.
Ctrl C Прекратить текущую команду.
Ctrl D Выйти из системы\сменить пользователя (вместо этого можно использовать команду exit).
Ctrl U Удаляет строку.
Ctrl Z Остановка текущей команды и продолжить с fg или bg.
Ctrl R Поиск по истории комманд.
Ctrl A Перейти к началу строки.
Ctrl ← \ Alt B Перевести курсор в начало предыдущего слова.
Ctrl → \ Alt L Перемещение курсора в конец слова.
Ctrl W Вырезать слово перед крусором.
Ctrl Y Вставить ранее вырезанный текст.
Ctrl K Удалить все после курсора.
Ctrl Y Вернет текст назад.
Ctrl U Удалить всю строку.

Менее полезные

Команда Действие
Alt T Поменять местами слова перед курсором.
Ctrl T Поменять местами символы перед курсором.
Alt U Перевести слово после курсора в ВЕРХНИЙ регистр.

Ctrl D / Delete | Удалить один символ после позиции курсора.

Тест скорости интернета

wget --output-document=/dev/null http://speedtest.wdc01.softlayer.com/downloads/test500.zip

Полезные ссылки

Коды ошибок (общепринятый стандарт)

Команда exit в bash принимает целые числа от 0 до 255, в большинстве случаев достаточно 0 и 1, однако существуют и другие зарезервированные коды выхода, которые могут использоваться для более специфических ошибок.

В Linux Documentation Project есть таблица зарезервированных кодов выхода и того, для чего они используются.

Exit Code Number Meaning Example Comments
1 Catchall for general errors let "var1 = 1/0" Miscellaneous errors, such as "divide by zero" and other impermissible operations
2 Misuse of shell builtins (according to Bash documentation) empty_function() {} Missing keyword or command, or permission problem (and diff return code on a failed binary file comparison).
126 Command invoked cannot execute /dev/null Permission problem or command is not an executable
127 "command not found" illegal_command Possible problem with $PATH or a typo
128 Invalid argument to exit exit 3.14159 exit takes only integer args in the range 0 - 255 (see first footnote)
128+n Fatal error signal "n" kill -9 $PPID of script $? returns 137 (128 + 9)
130 Script terminated by Control-C Ctl-C Control-C is fatal error signal 2, (130 = 128 + 2, see above)
255* Exit status out of range exit -1 exit takes only integer args in the range 0 - 255

Согласно приведенной выше таблице, коды выхода 1 - 2, 126 - 165 и 255 имеют специальные значения, поэтому их следует избегать для пользовательского выхода. Завершение скрипта с кодом exit 127, может, привести к путанице при поиске неисправностей. Во многих сценариях в качестве общего выхода при ошибке используется exit 1. Поскольку код выхода 1 означает разные ошибки, он не особенно полезен при отладке.

Была попытка систематизировать номера статусов выхода, но она предназначена для программистов на языках С и С++. Аналогичный стандарт для скриптинга, возможно, будет уместен. Автор данного документа предлагает ограничить определяемые пользователем коды выхода диапазоном 64 - 113 (в дополнение к 0 - успех), чтобы соответствовать стандарту C/C++. Это позволит ограничиться 50 допустимыми кодами и упростит поиск и устранение неисправностей.

Примечание: Выполнение команды echo $? из командной строки после выхода из сценария дает результат, соответствующий приведенной выше таблице, только в bash или sh. Запуск C-shell или tcsh в некоторых случаях может дать другие значения.

--

Использовал при написании https://ru.hostings.info/schools/komandy-dlya-putty-ssh-unix-i-linux-serverov.html