В этой статье будут описаны автоматические действия с SFTP сервером. Например — передача или скачивание файлов с помощью bash скрипта.
Утилита sshpass
Когда вы подключаетесь по SSH, то для подключения используете пароль или ключ. Если нет возможности настроить подключение по ключам, то остаётся использовать пароль. Но утилита ssh, с помощью которой мы подключаемся к серверу не разрешает подставлять пароль. Вместо этого она использует псевдо-терминал для ввода пароля вручную.
alex@deb-11:~$ ssh alex@192.168.0.34 alex@192.168.0.34's password:
Это затрудняет выполнение автоматических действий, когда у вас нет возможности использовать SSH ключи. Например такая команда не работает:
alex@deb-11:~$ (echo password) | ssh alex@192.168.0.34 Pseudo-terminal will not be allocated because stdin is not a terminal. alex@192.168.0.34's password:
Здесь даже на терминале появилось предупреждение о том, что STDIN это вам не терминал!
Для решения этой задачи придумали утилиту sshpass, которую можно установить из репозиториев:
alex@deb-11:~$ sudo apt install sshpass
С помощью этой утилиты можно передать пароль утилите ssh. Делается это таким способом:
alex@deb-11:~$ sshpass -p "password" ssh alex@192.168.0.34 Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-52-generic x86_64)
Выполнение команд ftp из bash скрипта
Но в этой статье описывается sftp а не просто ssh. Поэтому подключение будет выполнятся с помощью утилиты sftp:
alex@deb-11:~$ sshpass -p "password" sftp alex@192.168.0.34 Connected to 192.168.0.34. sftp>
После подключения вы можете, с помощью команд ftp, работать с файлами. Вот некоторые команды:
- ls — посмотреть список файлов в каталоге на sftp сервере;
- lls — посмотреть список файлов в каталоге на локальном сервере;
- pwd — посмотреть текущий каталог на sftp сервере;
- lpwd — посмотреть текущий каталог на локальном сервере;
- put — загрузить файл на sftp сервер;
- get — скачать файл с sftp сервера.
Но мы хотим выполнять команды не интерактивно, а например из bash скрипта. Например, чтобы подключиться, выполнить команду и отключиться от SFTP сервера, можно выполнить команду:
alex@deb-11:~$ echo -e "ls" | sshpass -p "password" sftp alex@192.168.0.34 Connected to 192.168.0.34. sftp> ls ubuntu.txt alex@deb-11:~$
То есть на удалённом сервере, в домашнем катоге пользователя alex лежит файл с именем ubuntu.txt.
А загрузить файл можно с помощью такой команды:
alex@deb-11:~$ echo -e "put debian.txt" | sshpass -p "password" sftp alex@192.168.0.34 Connected to 192.168.0.34. sftp> put debian.txt Uploading debian.txt to /home/alex/debian.txt alex@deb-11:~$
То-есть мы передаём файл debian.txt на sftp сервер.
Создаём bash функцию для автоматизации
Ну и чтобы как то соответствовать названию статьи «Автоматические действия с SFTP» нужно что-нибудь автоматизировать, или хотя-бы облегчить ручную работу:)
Можем сделать bash функцию и записать её в файл .bashrc:
alex@deb-11:~$ nano .bashrc ftp-put() { echo -e "put $1" | sshpass -p "$3" sftp "$2"@"$4" }
Теперь передать файл на SFTP сервер можно таким образом:
alex@deb-11:~$ ftp-put test.txt alex password 192.168.0.34 Connected to 192.168.0.34. sftp> put test.txt Uploading test.txt to /home/alex/test.txt alex@deb-11:~$
То есть передаём имя файла, имя пользователя и пароль, и адрес sftp сервера.
По подобию вы можете выполнять и другие действия с sftp сервером. Или, например, выполнять какие-то действия по расписанию.
Возможно вам понравятся и другие подобные статьи:
- Текст в речь с помощью Festival в Linux
- Как сгенерировать пароль в терминале Linux
- 10 ПОЛЕЗНЫХ SFTP КОМАНД