【发布时间】: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