如何在 Bash 脚本中通过 SFTP 放置文件然后立即删除它们?

如何在 Bash 脚本中通过 SFTP 放置文件然后立即删除它们?

简短的:

我有一个目录,其中文件被任意放置在服务器 A 中。我想将这些文件转储到服务器 B 中,并从服务器 A 中删除它们。

背景:

我想编写一个 Bash 脚本,其中代码遍历每个文件,put将文件发送到服务器 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 [email protected] <<EndOfTransfer
cd $PATH_TO_METRICS
for filename in $PATH_TO_METRICS; do
   PUT "$filename"
   rm "$filename"
done

EndOfTransfer

相关研究:

问题:

如何遍历给定目录中的文件并使用 sftp 将每个文件放到另一台服务器,并在传输成功后删除该文件?

答案1

你需要理解<<EOFEOF

在下面的例子中,<<EOFsftp 命令具有含义后,将所有内容作为标准输入传递给 sftp 程序,直到到达 EOF(文件结束)。

因此您可以使用它轻松修改脚本并使其正常运行。

sftp YourSftpServer <<EOF
put YourFile
exit
EOF

答案2

有两种方法可以做到这一点,比直接使用要容易得多sftp,因为无论哪种情况,你都会使用 SSH。你只需要需要如果您实际运行的是“老式” SFTP 服务器,则可以使用 SFTP。如果服务器 A/B 实际上是 Linux 计算机,则只需使用rsyncscp

rsync --remove-source-files -r /home/some/directory user@ServerB:/somewhere/else

这将复制所有文件,并且具有比sftp命令更好的性能,或者scp因为它们通常打开/关闭许多连接。rsync将打开一个连接,检查需要传输的内容,然后在没有碎片连接的情况下传输所有内容。

如果出于任何原因你需要要传递您的私钥或使用自定义端口到 SSH,您可以传递到-e "ssh -i foo.key -p 1234"rsync它将使用这些密钥。

相关内容