当 sftp 语句之一在 Linux 中失败时,sftp 脚本失败

Posted

技术标签:

【中文标题】当 sftp 语句之一在 Linux 中失败时,sftp 脚本失败【英文标题】:sftp script failing when one of the sftp statement fails in Linux 【发布时间】:2016-06-30 17:42:33 【问题描述】:

我有一个 OpenSSH sftp 脚本,它将文件从 SFTP 服务器 (Solaris) 传输到应用程序服务器 (Linux)。这里的场景是从不同的位置进行传输,并且相同的文件被传输到不同位置的 SFTP 服务器。但是,如果由于文件不可用而导致任何传输失败,则不会继续剩余的sftp 命令。相反,它只是来自代码。下面是脚本。

export SSHPASS=*******
/usr/local/bin/sshpass -e sftp -oPort=22 -oBatchMode=no -b - rkwlahtt@10.204.140.14 << !

cd /home/rkwlahtt/Inbound
mget *.*
rm *.*
cd /home/rkwlahtt/Inbound/Adhoc
mget *.*
rm *.*
cd /home/rkwlahtt/Archive/Inbound
mput *.TXT
mput *.txt
cd /home/rkwlahtt/Archive/Adhoc
mput *.xlsx
bye
!

在上面的脚本中,当我尝试从/home/rkwlahtt/Inbound 文件夹中访问mget 时,如果文件不存在,它只是来自sftp 代码,而不是转到下一个命令cd /home/rkwlahtt/Inbound/Adhocmgetmput 也是同样的情况。

这是我们第一次在同一代码中从不同位置进行传输。这在我们的转移中造成了问题。

请告诉我可以采取什么措施来解决此问题。

【问题讨论】:

【参考方案1】:

您可以使用 - 前缀在每个命令的基础上抑制错误中止:

-mget *.*

另一个选项是删除-b - 开关。

开关在任何故障后导致中止。

即使没有开关,您仍然可以使用输入重定向来输入命令,就像您正在做的那样。

尽管您需要确保没有命令会要求任何输入。那么你的一些命令将被用作输入而不是被执行。

【讨论】:

酷。那行得通。那么 -b - 究竟代表什么。我以为 -b 用于批处理文件。而这一行声明 /usr/local/bin/sshpass -e sftp -oPort=22 -oBatchMode=no -b - rkwlahtt@10.204.140.14 -b 做了两件事。首先它启用批处理模式(= 中止任何错误),其次它设置一个脚本文件。除非您使用 - 而不是脚本文件名,在这种情况下,命令是从标准输入读取的,默认值是什么。您不需要第二个效果(因为您无论如何都使用-)并且您不想要第一个。请参阅 sftp 手册页:freebsd.org/cgi/man.cgi?query=sftp&sektion=1

以上是关于当 sftp 语句之一在 Linux 中失败时,sftp 脚本失败的主要内容,如果未能解决你的问题,请参考以下文章

如果网络速度小于 1kb/s 那么为啥 SFTP 连接失败更频繁

Linux操作系统设置SSH及SFTP通过密钥登录

使用WinSCP的SFTP传输在/ command上工作但在/ script上失败

批量执行时如何查找失败的sql语句

处理Camel sftp端点身份验证失败

linux远程开发工具byobu和sublime的SFTP