我正在尝试编写一个Bash脚本负责在远程服务器上创build一个文件夹。
片段:
!/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,但显然有一个错误。
如何捕捉远程错误并在脚本中设置适当的返回码?
使用sftp的选项-b (带有batch file或bash的进程替代),您将获得mkdir的返回代码。
sftp -b <(echo "mkdir test_folder") user@remotehost:/ echo $?
输出:
更改为:/ sftp> mkdir test_folder 无法创build目录:失败 1
或者使用这个:
echo "mkdir test_folder" | sftp -b - user@remotehost:/ echo ${PIPESTATUS[1]}
从man sftp:
-b batchfile批处理-b batchfile:批处理模式从inputbatch file而不是标准input读取一系列命令。 由于缺乏用户交互,因此应该与非交互式authentication一起使用。 batch file“ – ”可以用来指示标准input。 如果以下任一命令失败,sftp将中止:get,put,rename,ln,rm,mkdir,chdir,ls,lchdir,chmod,chown,chgrp,lpwd,df,symlink和lmkdir。 通过在命令前添加“ – ”字符(例如-rm / tmp / blah *),可以在命令的基础上抑制错误终止。
1)使用$? variables是不正确的。 问题是你需要在执行sftp命令后立即存储返回值($?)。 否则,你会得到另一个命令的返回值。 例如:
rm /directory_which/does_not_exists echo $? echo "Deleting directory ..."
完全不同于:
rm /directory_which/does_not_exists echo "Deleting directory ..." echo $?
2)你可以用ssh来创build远程目录
ssh [email protected] "cd /tmp && mkdir test_folder"
希望能帮助到你…