FTP - старый протокол передачи файлов, который до сих пор встречается на хостингах, в сетевом оборудовании и обменниках файлов. SFTP - передача файлов поверх SSH, с шифрованием. Команды у их консольных клиентов почти одинаковые, поэтому разберём оба. Главное отличие стоит запомнить сразу: FTP передаёт логин, пароль и файлы открытым текстом. Если сервер поддерживает SFTP или FTPS, используйте их.

Установка клиента

Во многих дистрибутивах консольного клиента FTP по умолчанию нет:

bash
sudo apt install ftp        # Debian, Ubuntu (или пакет tnftp)
sudo dnf install ftp        # Fedora, RHEL и родственные
sudo apt install lftp       # продвинутый клиент с поддержкой FTPS и SFTP

Клиент sftp входит в состав OpenSSH и обычно уже установлен.

Подключение

Терминал, ключ и сервер с отметкой подключения

FTP:

bash
ftp ftp.example.com

Клиент спросит логин и пароль. Для анонимного доступа введите логин anonymous, а в качестве пароля - любой адрес почты.

SFTP:

bash
sftp user@server.example.com
sftp -P 2222 user@server.example.com   # нестандартный порт
sftp -i ~/.ssh/id_ed25519 user@server  # вход по ключу

Для SFTP работают те же ключи и настройки из ~/.ssh/config, что и для SSH.

Основные команды

Сервер, папка, стрелки вверх и вниз и ноутбук

Эти команды одинаково работают в ftp и sftp:

Команда Что делает
ls, dir список файлов на сервере
cd папка перейти в папку на сервере
pwd текущая папка на сервере
lcd папка перейти в папку на локальном компьютере
get файл скачать файл
put файл загрузить файл на сервер
mkdir папка создать папку на сервере
rmdir папка удалить пустую папку
delete файл (ftp), rm файл (sftp) удалить файл
rename старое новое переименовать
help список команд
bye, quit, exit выйти

В sftp добавляются локальные команды с буквой l: lls, lpwd, lmkdir - они работают с вашим компьютером.

Скачать файл под другим именем: get remote.txt local.txt.

Несколько файлов и папки

В ftp:

text
prompt          отключить запрос подтверждения для каждого файла
mget *.log      скачать все файлы .log
mput *.jpg      загрузить все файлы .jpg

Папки целиком клиент ftp передавать не умеет. В sftp это делается ключом -r:

bash
get -r backups
put -r site

Режим передачи

В классическом FTP есть два режима: ascii (текстовый, с преобразованием переводов строк) и binary (файл передаётся байт в байт). Архивы, картинки и программы в режиме ascii портятся. Перед передачей выполните:

text
binary

Современные клиенты и серверы обычно включают двоичный режим сами, но команда ничего не ломает. В SFTP такого разделения нет.

Активный и пассивный режим

В активном режиме FTP сервер сам открывает соединение для данных к клиенту, и файрвол или NAT на стороне клиента его не пропускают. Симптом - подключение и вход проходят, а команда ls зависает. Решение - пассивный режим, где оба соединения открывает клиент:

text
passive

Многие клиенты включают его по умолчанию. В ftp можно сразу запустить клиент в пассивном режиме ключом -p.

SFTP в скриптах

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

bash
cat > upload.txt <<'END'
cd /var/www/uploads
put report.pdf
bye
END
sftp -b upload.txt user@server.example.com

При ошибке любой команды sftp -b прекращает работу с ненулевым кодом возврата, и скрипт может это проверить.

Для простого копирования без интерактивной сессии удобнее scp или rsync поверх SSH:

bash
scp report.pdf user@server:/var/www/uploads/
rsync -avz site/ user@server:/var/www/site/

FTP в скриптах

Классический ftp можно запустить без автоматического входа (-n) и передать команды через ввод:

bash
ftp -n ftp.example.com <<'END'
user username password
binary
cd upload
put backup.tar.gz
bye
END

Пароль в скрипте виден всем, кто может прочитать файл. Чуть безопаснее хранить данные входа в файле ~/.netrc с правами 600:

text
machine ftp.example.com
login username
password password

lftp

lftp удобнее для скриптов: умеет FTPS (FTP с шифрованием), SFTP, повтор при обрывах, параллельную загрузку и синхронизацию папок.

bash
lftp -u username ftp.example.com

Синхронизация папки на сервере с локальной (зеркалирование):

bash
lftp -u username,password -e "mirror -R --delete site /public_html; bye" ftp.example.com

Ключ -R означает обратное направление: с компьютера на сервер. Без него mirror скачивает папку с сервера. --delete удаляет на приёмной стороне файлы, которых нет в источнике, - используйте его осторожно.

Подключение по FTPS или SFTP задаётся в адресе: lftp ftps://ftp.example.com или lftp sftp://user@server.example.com.

curl и wget

Для разовой операции не нужен интерактивный клиент:

bash
curl -u username:password -O ftp://ftp.example.com/pub/file.zip         # скачать
curl -u username:password -T backup.tar.gz ftp://ftp.example.com/upload/  # загрузить
curl -u username:password ftp://ftp.example.com/pub/                     # список файлов
wget ftp://username:password@ftp.example.com/pub/file.zip

curl поддерживает и SFTP: curl -u user: --key ~/.ssh/id_ed25519 sftp://server/path/file -O.

Частые проблемы

  • Вход проходит, ls зависает - включите пассивный режим.
  • 530 Login incorrect - неверный логин или пароль, либо для пользователя на сервере запрещён FTP-доступ.
  • 550 Permission denied или Failed to open file - нет прав на папку или файл на сервере.
  • Испорченные архивы после скачивания - файл передан в режиме ascii, повторите после binary.
  • Connection refused - на сервере не запущен FTP- или SSH-сервер, неверный порт или подключение блокирует файрвол.
  • Host key verification failed в sftp - ключ сервера изменился с прошлого подключения. Если вы знаете, что сервер переустановили, удалите старый ключ командой ssh-keygen -R server.example.com; если нет - выясните причину, прежде чем подключаться.