我的ksh脚本中有以下代码段。有没有一种方法可以获得返回代码,无论sftp是否成功执行并将文件从源复制到目标目的地?
echo "sftp start" >> /test/logfile.log
sftp user@server <<EOF >> /test/logfile.log
cd /tgt/files
lcd /src/files
rm *.csv
put -p *.csv
exit
EOF
echo "sftp end" >> /test/logfile.log
答案 0 :(得分:2)
我会做什么:
echo "sftp start" >> /test/logfile.log
sftp user@server <<EOF >> /test/logfile.log
cd /tgt/files
lcd /src/files
rm *.csv
put -p *.csv
exit
EOF
exit_code=$?
if [[ $exit_code != 0 ]]; then
echo "sftp error" >&2
exit 1
fi
echo "sftp end" >> /test/logfile.log
答案 1 :(得分:1)
除了使用sftp
并编写如此多的中间命令以便移动到正确的文件夹,在传输之前删除文件等,您可以使用以下方式更紧凑的命令:
echo "file transfer started" >> /test/logfile.log
ssh user@server 'rm /tgt/files/*.csv' >> /test/logfile.log 2>&1 && scp /src/files/*.csv user@server:/tgt/files/ >> /test/logfile.log 2>&1
rc=$?
if [[ $rc != 0 ]]; then
echo "ERROR: transfer failed" >> /test/logfile.log
exit 1
fi
echo "file transfer completed" >> /test/logfile.log
<强>说明:强>
ssh user@server 'rm /tgt/files/*.csv' >> /test/logfile.log 2>&1 && scp /src/files/*.csv user@server:/tgt/files/ >> /test/logfile.log 2>&1
如果从目标文件夹中正确删除文件而不是(&&
),则传输将完成!中间错误也会重定向到输出日志文件。
答案 2 :(得分:1)
吉尔·奎诺(Gilles Quenot)的解决方案仅在以下三个改进中起作用。没有这些改进,无论sftp命令的结果如何,退出状态始终为0。
sftp选项-b -
需要添加到sftp命令中。只有这样,如果某些sftp命令出错,sftp才会以状态1退出。否则,退出状态始终为0。
我添加了2>&1 | tee
来记录错误(它将stderr重定向到stdout)
您必须使用${PIPESTATUS[0]}
来读取sftp的退出状态。 $?给出最后一条命令的退出状态,即到日志文件的重定向。
echo "sftp start" >> /test/logfile.log sftp -b - user@server <<EOF 2>&1 | tee /test/logfile.log cd /tgt/files lcd /src/files rm *.csv put -p *.csv exit EOF exit_code=${PIPESTATUS[0]} if [[ $exit_code != 0 ]]; then echo "sftp error" >&2 exit 1 fi echo "sftp end" >> /test/logfile.log
关于, 马尔滕