简短的:
我有一个目录,其中文件被任意放置在服务器 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
你需要理解<<EOF
并EOF
在下面的例子中,<<EOF
sftp 命令具有含义后,将所有内容作为标准输入传递给 sftp 程序,直到到达 EOF(文件结束)。
因此您可以使用它轻松修改脚本并使其正常运行。
sftp YourSftpServer <<EOF
put YourFile
exit
EOF
答案2
有两种方法可以做到这一点,比直接使用要容易得多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
它将使用这些密钥。