Глиф Учебники

Урок 10. Архивы и сеть: tar, zip, curl, ssh и scp

Курс «Командная строка Linux» · урок 10 из 10 · 5 минут чтения

Последний урок — о том, без чего не обходится работа с серверами: упаковать папку в архив, скачать файл из интернета, подключиться к удалённой машине и перенести на неё файлы. Всё это — тоже обычные команды.

tar — архив из папки

В Linux основной архиватор — tar. Он собирает файлы и папки в один файл, а сжимает его обычно gzip — отсюда расширение .tar.gz (или .tgz).

Bash
tar -czf site.tar.gz site
tar -tzf site.tar.gz
tar -xzf site.tar.gz
tar -xzf site.tar.gz -C /tmp/restore
site index.html css/style.css и другие файлы c один файл-архив z site.tar.gz сжат gzip tar -xzf site.tar.gz — распаковать обратно tar - c z f site.tar.gz site f — дальше имя архива z — сжать gzip c — создать архив
Команда tar -czf site.tar.gz site собирает все файлы папки site в один архив, сжимает его gzip и записывает в site.tar.gz, а tar -xzf распаковывает обратно.

Буквы ключей:

КлючЧто значит
ccreate — создать архив
xextract — распаковать
tlist — показать содержимое
zсжатие gzip (.tar.gz)
Jсжатие xz (.tar.xz) — медленнее, но меньше
jсжатие bzip2 (.tar.bz2)
fимя файла архива — ставится последним, сразу перед именем
vпечатать имена файлов по ходу работы
Cперейти в папку перед распаковкой

При распаковке способ сжатия указывать не обязательно: tar -xf архив сам разберётся, .tar.gz это или .tar.xz.

tar -x молча заменяет файлы с теми же именами. Перед распаковкой чужого архива посмотрите его содержимое (tar -tf) и распакуйте в отдельную пустую папку — иначе можно затереть свои файлы.

gzip — сжать один файл

Bash
gzip big.log
gunzip big.log.gz
gzip -k big.log

gzip сжимает файл и заменяет его сжатым big.log.gz; gunzip возвращает как было; -k оставляет исходный файл. Старые журналы в /var/log часто лежат как .gz. Читать их можно, не распаковывая: zcat, zless и zgrep — то же, что cat, less и grep, но для сжатых файлов.

zip — архив для Windows

Архивы .zip открываются в любой системе, поэтому их удобно отправлять тем, кто работает в Windows:

Bash
zip -r site.zip site
unzip -l site.zip
unzip site.zip -d site-copy

-r — с вложенными папками; unzip -l — показать содержимое, -d — распаковать в указанную папку. Команд zip и unzip может не быть в системе — тогда поставьте одноимённые пакеты (в Ubuntu, Debian и Mint: sudo apt install zip unzip).

ping — есть ли связь

Bash
ping -c 4 debian.org

ping посылает короткие запросы и показывает, за сколько миллисекунд пришёл ответ (time=…). В конце — итог: сколько запросов отправлено, сколько ответов получено и сколько потеряно (packet loss). Без -c ping в Linux работает бесконечно — остановите его Ctrl+C.

Если ответов нет, это ещё не значит, что сервер выключен: многие серверы и брандмауэры (программы и устройства, которые пропускают или отсекают подключения) не отвечают на ping нарочно. А сообщение вроде Name or service not known значит, что не удалось узнать адрес по имени: опечатка в имени или не работает DNS.

curl и wget — скачать из интернета

Bash
wget https://example.com/file.tar.gz
wget -c https://example.com/file.tar.gz
curl -O https://example.com/file.tar.gz
curl -L -o latest.tar.gz https://example.com/download
curl -I https://example.com
без ключа -L curl example.com запрос /download «переехал»: новый адрес curl на этом останавливается в latest.tar.gz — короткая страница «переехал» с ключом -L curl example.com запрос /download «переехал»: новый адрес запрос по новому адресу сам файл в latest.tar.gz — нужный архив
На адрес https://example.com/download сервер отвечает «переехал»: без -L curl сохраняет в latest.tar.gz этот короткий ответ, а с -L идёт по новому адресу и скачивает сам архив.

Без ключей curl печатает скачанное прямо в терминал — так удобно смотреть ответы программ и страницы. Если какой-то из команд нет, поставьте пакет curl или wget.

В инструкциях встречаются команды вида curl адрес | bash — скачать скрипт и сразу выполнить. Такой скрипт получает все ваши права, а с sudo — права root. Выполняйте его только с официального сайта программы, а лучше сначала скачайте в файл и прочитайте.

ssh — работа на удалённом сервере

Bash
ssh ivan@192.168.1.10
ssh -p 2222 ivan@203.0.113.5
ssh ivan@192.168.1.10 'df -h'

ssh пользователь@адрес подключает к серверу: приглашение сменится на серверное, и все команды курса будут выполняться там. Выход — exit или Ctrl+D. -p — если сервер ждёт подключений не на стандартном порту 22. Команда в кавычках после адреса выполнится на сервере, и вы сразу вернётесь к себе.

При первом подключении ssh покажет отпечаток ключа сервера и спросит, доверять ли ему — ответьте yes. Как включить сервер SSH и входить по ключу вместо пароля, подробно рассказано в теме Ubuntu.

scp — перенести файлы

scp копирует файлы через то же соединение SSH. Удалённый путь пишется как пользователь@адрес:путь:

Bash
scp site.tar.gz ivan@192.168.1.10:/home/ivan/
scp ivan@192.168.1.10:/var/log/nginx/error.log .
scp -r site ivan@192.168.1.10:~/
scp -P 2222 site.tar.gz ivan@203.0.113.5:~/
Ваш компьютер site.tar.gz ./error.log Сервер 192.168.1.10 /home/ivan/site.tar.gz /var/log/nginx/error.log 1 2 1 scp site.tar.gz ivan@192.168.1.10:/home/ivan/ откуда — у вас куда — на сервер 2 scp ivan@192.168.1.10:/var/log/nginx/error.log . откуда — с сервера куда — в текущую папку Сначала — откуда, потом — куда; адрес сервера и путь на нём разделяет двоеточие :
В scp сначала пишется, откуда копировать, потом — куда: файл site.tar.gz уходит на сервер 192.168.1.10, а error.log приходит с сервера в текущую папку.

Двоеточие после адреса обязательно. scp file ivan@192.168.1.10 без него просто сделает у вас копию файла с именем ivan@192.168.1.10.

Для больших папок и регулярного копирования удобнее rsync: он переносит только изменившиеся файлы — о нём справка Как скопировать файлы на сервер.

Пример: перенести сайт на сервер

Первые две команды выполняются на вашем компьютере, третья входит на сервер, а две последние — уже на сервере:

Bash
tar -czf site.tar.gz site
scp site.tar.gz ivan@192.168.1.10:~/
ssh ivan@192.168.1.10
mkdir -p ~/www
tar -xzf ~/site.tar.gz -C ~/www

Один архив переносится быстрее, чем тысячи мелких файлов, а tar записывает в архив права и даты каждого файла.

Коротко

Проверьте себя

1. Какой командой упаковать папку site в сжатый архив site.tar.gz?
2. Как посмотреть, что лежит в архиве, не распаковывая его?
3. Как указать порт 2222 для scp?
4. Почему curl -O адрес скачал маленький файл вместо нужного архива?