Как поместить файлы и удалить их сразу с помощью SFTP в скрипте Bash?

Коротко:

У меня есть каталог, где файлы произвольно удаляются на сервере A. Я хочу сбросить эти файлы на сервер B и удалить их с сервера A.

Фон:

Я хотел бы написать сценарий Bash, где код перебирает каждый файл, puts файл через сервер 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 для передачи каждого файла на другой сервер, а также удалить файл, если произошла успешная передача?

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 и он будет использовать эти ключи.

Другие вопросы по тегам