如何在cd命令失败时退出SFTP

3

已经编写了一个用于通过SFTP传输文件的Shell脚本,在AIX Version 6.1上运行良好。我正在使用SAP数据服务开发ETL,并对Shell脚本编写非常陌生。在单元测试期间,我提供了不存在的目标文件夹,以模拟目标文件夹名称被用户更改的情况,但是在命令cd之后返回退出代码0,尽管回显错误消息:Couldn't canonicalise: Failure。这使得ETL过程不知道文件没有被传输。当我在脚本中注入exit 1时,ETL作业捕获到了SFTP失败并自行失败,这是预期的行为。

我的问题是:如何调整现有的调用SFTP命令的Shell脚本以退出代码1?

以下是脚本摘录:

'#!/bin/sh

....

echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE

echo put $TARGET_LOCAL_DIR$TARGET_FILE_NAME>>$INPUT_FILE

echo quit>>$INPUT_FILE

/usr/bin/sftp -b $INPUT_FILE $USER@$HOSTNAME

当我在执行cd命令后,立即打印出$?变量。如果远程目录拼写错误,则返回0。我的想法是,在执行cd命令后,检查行内是否存在错误消息,如果长度不为0,则退出并返回代码1。

伪代码示例如下:

error_msg = get_error_msg({cd $TARGET_REMOTE_DIR>>$INPUT_FILE})

if length(trim(error_msg)) <> 0 then
echo “Cannot change directory! Aborting…”

exit 1

fi

任何评论都受到欢迎。
干杯!
在Martin的帮助下,我已经实现了这个解决方案:在/usr/bin/sftp命令之后立即捕获$?返回代码,并强制退出以捕获的错误!
/usr/bin/sftp -b $INPUT_FILE $USER@$HOSTNAME

if [[ $? -ne 0 ]]; then
  " SFTP Error while accessing remote target directory! Error message"
  exit $?
fi 

谢谢大家!这是一个很棒的论坛!
1个回答

1
首先,我假设您正在使用OpenSSH的sftp。
当cd命令失败时,OpenSSH的sftp确实会中止脚本并以1退出。
因此,您的问题可能不在于SFTP脚本,而是在于您捕获退出代码的方式。
如果您分享如何捕获退出代码的详细信息,您可能会得到更具体的答案。
至于您对echo $?的测试: 您把echo $?命令放在哪里?放到了您的SFTP脚本($INPUT_FILE)中吗?sftp没有echo命令;它也无法解析$?。
如果您像这样将其放入shell脚本中:
echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE
echo $?

它不会做你想要的事情。你只是在查询之前echo命令的结果,这很不可能失败。


谢谢您的回复。当我更改远程目录的拼写时,sftp实际上会返回错误“未找到”,但错误代码仍为0。我在脚本中不同的位置插入echo $?,它总是0。是否有可能仅捕获错误消息?如果其长度不为0,则强制退出并使用非0的错误代码? - user2418733
1
你尝试在/usr/bin/sftp ...之后加上echo $?了吗?那是唯一能够起作用的地方,而且确实有效。 - Martin Prikryl
再次感谢您的回复。是的,我尝试在if then fi语句中的那行代码后面捕获$?,它确实起作用了!它还返回了代码和错误消息本身!我的“声望”评级不允许评价您的答案... - user2418733

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接