Bash 将输出/错误分配给变量

Bash 将输出/错误分配给变量

我的 bash 文件中有以下行:

LIST=$(ssh 192.168.0.22 'ls -1 /web');

我遇到的问题是它是自动化脚本的一部分,我经常在stdout而不是我需要的数据上得到这个:

ssh_exchange_identification: Connection closed by remote host

我意识到LIST只能得到stdoutls.所以我正在寻找一个可以从命令中获取更多信息的命令。尤其:

  • stdout因为ls- 我现在就有了
  • stderrfor ls- 不太感兴趣,我不认为那里会出现问题
  • stdoutfor ssh- 不感兴趣,我什至不知道它会输出什么
  • 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`

此变体在需要或可能不需要时抑制错误消息。但通常的输出也能捕获。那么你可以用 $ 来区分这两种情况吗?重视并纠正您的脚本。

相关内容