我的 bash 文件中有以下行:
LIST=$(ssh 192.168.0.22 'ls -1 /web');
我遇到的问题是它是自动化脚本的一部分,我经常在stdout
而不是我需要的数据上得到这个:
ssh_exchange_identification: Connection closed by remote host
我意识到LIST
只能得到stdout
的ls
.所以我正在寻找一个可以从命令中获取更多信息的命令。尤其:
stdout
因为ls
- 我现在就有了stderr
forls
- 不太感兴趣,我不认为那里会出现问题stdout
forssh
- 不感兴趣,我什至不知道它会输出什么stderr
为了ssh
-这就是我正在寻找的检查是否ssh
正确。这是空的应该意味着我有$LIST
我期望的数据
答案1
来自 Ubuntu 16.04 (LTS) 上的 ssh 手册页:
EXIT STATUS
ssh exits with the exit status of the remote command or with 255 if an error occurred.
知道了这一点,我们就可以检查ssh
命令的退出状态。如果退出状态为225
,我们知道这是一个ssh
错误,如果它是任何其他非零值 - 那就是ls
错误。
#!/bin/bash
TEST=$(ssh $USER@localhost 'ls /proc' 2>&1)
if [ $? -eq 0 ];
then
printf "%s\n" "SSH command successful"
elif [ $? -eq 225 ]
printf "%s\n%s" "SSH failed with following error:" "$TEST"
else
printf "%s\n%s" "ls command failed" "$TEST"
fi
答案2
将 的标准错误重定向ssh
到命令替换中的文件,然后测试该文件是否为空:
output="$( ssh server 'command' 2>ssh.err )"
if [[ -s ssh.err ]]; then
echo 'SSH error:' >&2
cat ssh.err >&2
fi
rm -f ssh.err
其后显示SSH error:
捕获的错误输出ssh
。
答案3
我记得某些变体必须起作用。尝试这个:
cmd 2>>>$errmsg
可能三重重定向...那是很多年前...变量 errmsg 中必须输出错误消息。也许我错了。在这种情况下,这个变体得到消息 100% 保证:
errmsg=`cmd 2>/dev/null`
此变体在需要或可能不需要时抑制错误消息。但通常的输出也能捕获。那么你可以用 $ 来区分这两种情况吗?重视并纠正您的脚本。