我正在尝试编写一个负责在远程服务器上创建文件夹的 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 $?
Run Code Online (Sandbox Code Playgroud)
输出是:
Connected to 192.168.0.11.
Changing to: /tmp
sftp> mkdir test_folder
Couldn't create directory: Failure
Transfer complete.
0
Run Code Online (Sandbox Code Playgroud)
所以返回码是 0 但显然有错误。
如何捕获远程错误并在脚本中设置适当的返回码?
使用 sftp 的选项-b
(使用批处理文件或 bash 的进程替换),您将获得 mkdir 的返回代码。
sftp -b <(echo "mkdir test_folder") user@remotehost:/
echo $?
Run Code Online (Sandbox Code Playgroud)
输出:
更改为:/ sftp> mkdir test_folder 无法创建目录:失败 1
或使用这个:
echo "mkdir test_folder" | sftp -b - user@remotehost:/
echo ${PIPESTATUS[1]}
Run Code Online (Sandbox Code Playgroud)
来自 man sftp:
-b batchfile
:批处理模式从输入批处理文件而不是标准输入中读取一系列命令。由于它缺乏用户交互,因此应与非交互式身份验证结合使用。“-”的批处理文件可用于指示标准输入。如果以下任何命令失败,sftp 将中止:get、put、rename、ln、rm、mkdir、chdir、ls、lchdir、chmod、chown、chgrp、lpwd、df、symlink 和 lmkdir。通过在命令前加上“-”字符(例如,-rm /tmp/blah*),可以逐个命令地抑制错误终止。