获取SFTP命令的返回码

时间:2018-03-06 01:00:27

标签: unix sftp ksh

我的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

3 个答案:

答案 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。

  1. sftp选项-b -需要添加到sftp命令中。只有这样,如果某些sftp命令出错,sftp才会以状态1退出。否则,退出状态始终为0。

  2. 我添加了2>&1 | tee来记录错误(它将stderr重定向到stdout)

  3. 您必须使用${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

关于, 马尔滕