获取 Return SFTP 命令代码

Get Return Code of SFTP command

我的 ksh 脚本中有下面的代码片段。有没有一种方法可以让我有一个 return 代码来判断 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

我会做什么:

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

与其使用 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 如果文件从目标文件夹中正确删除,并且只有 (&&) 传输才会完成!!中间错误也被重定向到输出日志文件。

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

此致, 马丁