Как поместить файлы и удалить их сразу с помощью SFTP в скрипте Bash?
Коротко:
У меня есть каталог, где файлы произвольно удаляются на сервере A. Я хочу сбросить эти файлы на сервер B и удалить их с сервера A.
Фон:
Я хотел бы написать сценарий Bash, где код перебирает каждый файл, put
s файл через сервер B, и сразу же удаляет его. Это будет исправлено cron
и звонил каждый час, чтобы очистить файлы на сервере B
Код:
Код, который я попытался сделать:
#!/bin/bash
MY_SCRIPT_NAME=`basename "$0"`
PATH_TO_METRICS='/home/some/directory'
if pidof -o %PPID -x $MY_SCRIPT_NAME > /dev/null; then
echo "$MY_SCRIPT_NAME already running; exiting"
exit 1
fi
sftp -i my_priv_key -oPort=12345 user@12.123.123.123 <<EndOfTransfer
cd $PATH_TO_METRICS
for filename in $PATH_TO_METRICS; do
PUT "$filename"
rm "$filename"
done
EndOfTransfer
Соответствующие исследования:
- Выполнить команду в соединении sftp через скрипт
- Передача файлов по FTP, просмотр каталога и копирование старых файлов
Вопрос:
Как выполнить итерацию по файлам в заданном каталоге и использовать sftp для передачи каждого файла на другой сервер, а также удалить файл, если произошла успешная передача?
2 ответа
Вам нужно понять <<EOF
а также EOF
В приведенном ниже примере <<EOF
после того, как команда sftp имеет значение, передайте все в программу sftp как стандартный ввод, пока не получите EOF (End Of File).
Таким образом, вы можете легко изменить ваш скрипт с этим и заставить его работать.
sftp YourSftpServer <<EOF
put YourFile
exit
EOF
Есть два способа сделать это гораздо проще, чем использовать sftp
сам, так как вы используете SSH в любом случае. Вам нужно использовать SFTP, только если вы на самом деле используете SFTP-сервер "старой школы". Если сервер A/B на самом деле является машиной Linux, просто используйте rsync
или же scp
rsync --remove-source-files -r /home/some/directory user@ServerB:/somewhere/else
Это скопирует все файлы и имеет гораздо лучшую производительность, чем sftp
команды или scp
так как они обычно открывают / закрывают много соединений. rsync
откроет одно соединение, проверит, что нужно передать, а затем передаст все без фрагментированных соединений.
Если по какой-либо причине вам нужно передать свой закрытый ключ или использовать пользовательские порты в SSH, вы можете передать -e "ssh -i foo.key -p 1234"
в rsync
и он будет использовать эти ключи.