获取 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。
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
此致,
马丁
我的 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。
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
此致, 马丁