在.sh
脚本中,我使用expect
自动sftp
到另一台计算机来存储get
文件。我的脚本将设置为每 30 分钟运行一次,此时我想要get
仅有的自上次运行以来创建(修改)的文件(在过去 30 分钟内有重复风险)。我知道这些文件将遵循特定的命名方法:AppData*.RAW
其中*
将是日期和时间字符串。但是,我不知道这些文件何时会被创建或传输到我正在通信的计算机上,也不知道可能有多少个,因为数量会有所不同。
...
/usr/bin/expect<<EOD
spawn sftp user@host
expect "User's password: "
send "$password\r"
expect "sftp>"
send "get ????"
EOD
...
我搜索了有关get
使用该开关的帮助并找到了参考-neweronly
,并尝试了synchronize
。但是,我不知道如何实现其中任何一个,或者甚至不知道对话
synchronize
中是否有一个选项。sftp
帮助get
此外,我的计算机必须sftp
将传入的文件存储在包含数千个旧文件(从 2013 年至今)的目录中,因此我必须只获取最近半小时的文件。
答案1
sftp
能力有限。通过 SFTP 执行复杂操作的最简单方法是使用SSHFS。 SSHFS 是一种使用 SFTP 使远程文件系统显示为本地文件系统的文件系统。在客户端,SSHFS 需要保险丝,在大多数现代 unice 上都可用。在服务器上,SSHFS需要SFTP;如果服务器允许 SFTP,那么您可以使用 SSHFS。
例如,要复制过去 30 分钟内修改的文件,请首先使用 .sftp 通过 SFTP 挂载远程目录sshfs
。使用sshpass如果您必须使用 SSH 密码。然后使用您在本地使用的命令(在这里,我使用 GNU 实用程序,但根据您正在执行的操作,rsync -a mnt/ /local/path/
可能会更好)。完成后卸载 SSHFS 文件系统。
mkdir mnt
sshpass -f password.txt sshfs user@host: mnt
find mnt -mmin -30 -exec cp -t /local/path/ {} +
fusermount -u mnt