我们想要在BASH中捕获文件列表(无论是1还是更多),评估文件是否已更改..
我见过这个.. save the result of ls command in the remote sftp server on local machine
但是,似乎无法正常运行我们想做的事情。
环境
LINUX:RedHat(2.6.xx-xxx.x.x.xxx)
SFTP:
使用上面的链接:
sftp account@0.0.0.0
expect "password:"
send "somepass\n";
set file [open /home/checks/sftp_files w]
send "ls /home/sftp_server_location/*.zip\n"
log_file
interact
我一直在读人们有SFTP创建文件列表的问题.. FTP - 来找出来,没有这个问题。
我们已经在Windows下使用WinSCP进行此操作并且工作正常。
然而,它所在的系统和数据中心正在关闭,我们需要在LINUX盒子上安装它。
使用Windows,我们正在进行高级别的工作:
Windows Scheduled Task that runs daily
To create a list of files beforehand: dir "d:\Downloads\*.gz" /B/S > D:\scripts\OLDLIST.TXT
Pause for 1 second: PING 127.0.0.1 -w 1000 > NUL
Run a script for WinSCP: cscript /nologo D:\scripts\somscript.js
Pause for 1 second: PING 127.0.0.1 -w 1000 > NUL
Create a list of files after: dir "d:\GEO_IP_Downloads\*.gz" /B/S > D:\scripts\NEWLIST.TXT
Pause for 1 second: PING 127.0.0.1 -w 1000 > NUL
Run a FC (File Compare):
%windir%\system32\FC /B D:\scripts\NEWLIST.TXT D:\scripts\OLDLIST.TXT | %windir%\system32\FIND /i "FC: D:\SCRIPTS\NEWLIST.TXT longer than D:\SCRIPTS\OLDLIST.TXT"
If there is a new file found, then e-mail:
IF NOT ERRORLEVEL 1 d:\SCRIPTS\BLAT.exe -body "New file(s) have been found at Vendor" -f somebody@fisglobal.com -to sombodyelse@fisglobal.com -server 1.2.3.4 -subject "New file(s) have been found at company" -q
WinSCP来自 - https://winscp.net
我们使用的具体脚本来自 -
https://winscp.net/eng/docs/script_download_most_recent_file#scripting
答案 0 :(得分:2)
这是您正在寻找的粗略版本。它将要求您保留上次同步的列表。 (您如何对此进行身份验证是一个不同的主题,但不是在脚本中保存密码,而是建议使用ssh密钥)。
#!/bin/bash
lastlist=/tmp/sftp_list.old
newlist=/tmp/sftp_list.new
localpath=/home/foo/downloads
remotepattern='/home/bar/*.zip'
remotehost='account@0.0.0.0'
notifysubject="New remote files"
notifyaddress="foo@example.com bar@example.com"
cd "$localpath"
if echo "ls -1 $remotepattern" | sftp "$remotehost" >"$newlist"; then
filelist=$(comm -13 "$lastlist" "$newlist")
[ $(echo "$filelist" | wc -l) -gt 0 ] && {
{
echo "New remote files:"
echo "$filelist"
} | mail -s "$notifysubject" "$notifyaddress"
# download new files
echo "$filelist" | sed 's/^/get /' | sftp "$remotehost"
rm -f "$lastlist"
mv "$newlist" "$lastlist"
}
else
echo "Error connecting to the remote host"
fi
这仅下载新文件,但如果任何文件名包含\n
(这种情况非常罕见),它将以微妙的方式失败。一个简单的解决方法是重新下载所有匹配的文件,而不是按名称选择:echo "get $remotepattern" | sftp "$remotehost"