【问题标题】:SFTP Transfer completion statusSFTP 传输完成状态
【发布时间】:2019-02-05 04:15:21
【问题描述】:

我有一个 SFTP 代码,可以使用“expect”将文件从远程服务器获取到本地服务器。下面是我的 shell 脚本中的 sn-p。

/usr/bin/expect<<EOF
spawn /usr/bin/sftp -o Port=$PORT $USER@$HOST
expect "$USER password:"
send "$PASSWORD\r"
expect "sftp>"
set timeout -1
send "get $FILE $LOCAL\r"
expect "sftp>"
send "bye\r"
sleep 1
EOF

我的要求: 有没有办法检查传输是否完成?

我愿意接受任何建议 - 根据文件大小进行检查(这将是一个很好的解决方案,但我认为 sftp 命令的限制不允许比较源文件和传输文件的大小)。

或者有没有办法根据返回码进行检查?即如果 get 为 100%,则返回 0,否则返回任何非零代码。如果这是一种测试方法?我的意思是如何捕获部分传输?或网络问题?或任何其他预期 场景?

我也愿意接受除expect之外的任何解决方案。比如在 sftp 批处理模式或其他 sftp 选项下工作(如果有)?

我使用的是 AIX unix,我只能使用 SFTP。

提前致谢!

【问题讨论】:

  • 也许您应该通过 ssh-keys 进行身份验证而忘记期望。
  • 你能提供更多细节吗..谢谢!
  • 快速入门:ssh-keygen -A; ssh-copy-id remoteuser@remotehost 在此之后您可以在没有密码的情况下使用sftp remoteuser@remotehost
  • 好的,谢谢!你能解释一下它将如何满足我的要求吗?文件大小比较和/或文件下载完成状态
  • 您将能够从 shell 脚本(批处理模式)执行 sftp,而无需使用期望,例如:printf $'cd somedir\nget somefile\nquit' | sftp remoteuser@remotehost

标签: unix sftp aix


【解决方案1】:

我会使用 SCP 而不是 SFTP。 Shell 返回代码作为完成状态。至于下载的工件完整性,最好的方法是将 md5 校验和放在您正在下载的文件附近,并在下载完成后对其进行验证。所以你有file.tarfile.md5(由md5sum file.tar &gt; file.md5 制作)你下载这两个并进行验证。

如果您有其他脚本需要等到下载完成,要处理下载的文件,最好在下载开始时创建 .lock 文件并在之后将其删除。处理脚本应该等到 .lock 文件消失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多