即使报告错误“无法创建目录:失败”,sftp 仍返回代码 0

即使报告错误“无法创建目录:失败”,sftp 仍返回代码 0

我正在尝试编写一个 Bash 脚本,负责在远程服务器上创建一个文件夹。

片段:

!/bin/bash -e
echo "Creating remote folder."
echo mkdir test_folder | sftp -oPort=22 192.168.0.11:/tmp
if [[ $? != 0 ]]; then
  echo "Transfer failed!"
  exit 1
else
  echo "Transfer complete."
fi
echo $?

输出为:

Connected to 192.168.0.11.
Changing to: /tmp
sftp> mkdir test_folder
Couldn't create directory: Failure
Transfer complete.
0

因此返回代码是 0,但显然发生了错误。

如何捕获远程错误并在脚本中设置适当的返回代码?

答案1

使用 sftp 的选项-b(使用批处理文件或 bash 的进程替换)您将获得 mkdir 的返回代码。

sftp -b <(echo "mkdir test_folder") user@remotehost:/
echo $?

输出:

更改为:/
sftp> mkdir 测试文件夹
无法创建目录:失败
1

或者使用这个:

echo "mkdir test_folder" | sftp -b - user@remotehost:/
echo ${PIPESTATUS[1]}

来自 man sftp:

-b batchfile:批处理模式从输入批处理文件而不是标准输入中读取一系列命令。由于它缺乏用户交互,因此应与非交互式身份验证结合使用。批处理文件“-”可用于指示标准输入。如果以下任何命令失败,sftp 将中止:get、put、rename、ln、rm、mkdir、chdir、ls、lchdir、chmod、chown、chgrp、lpwd、df、symlink 和 lmkdir。可以通过在命令前添加“-”字符(例如,-rm /tmp/blah*)来逐个命令地抑制因错误而终止。

答案2

1) $? 变量的使用不正确。问题是您需要在执行 sftp 命令后立即存储返回值 ($?)。否则您将获得另一个命令的返回值。例如:

rm /directory_which/does_not_exists
echo $?
echo "Deleting directory ..."

完全不同于:

rm /directory_which/does_not_exists
echo "Deleting directory ..."
echo $?

2)你也可以使用 ssh 创建远程目录,例如

ssh [email protected] "cd /tmp && mkdir test_folder"

希望能帮助到你...

相关内容