SFTP - 捕获文件列表未按预期工作

时间:2014-02-20 15:44:46

标签: bash sftp redhat

我们想要在BASH中捕获文件列表(无论是1还是更多),评估文件是否已更改..

  1. 如果文件已更改/更新
  2. 删除以前下载的文件
  3. 下载新文件
  4. 通知一群人(待办事项)
  5. 我见过这个.. 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(1)BSD通用命令手册
    • SFTP协议版本3

    使用上面的链接:

    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

1 个答案:

答案 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"