当 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/Adhoc
和mget
。 mput
也是同样的情况。
这是我们第一次在同一代码中从不同位置进行传输。这在我们的转移中造成了问题。
请告诉我可以采取什么措施来解决此问题。
【问题讨论】:
【参考方案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 连接失败更频繁