假设我想通过ssh做一些测试
例子
ssh 18.23.24.2 2>/dev/null "smartctl -a /dev/sdb -q silent"
echo $?
1
在这种情况下,我们得到退出代码1
如何知道问题是关于ssh还是关于smartctl命令?
由于许多过程都使用相同的值,因此确定很困难。
% ssh 2>/dev/null localhost 'exit 255' ; echo $?
255
% ssh 2>/dev/null nopelocalhost 'exit 0' ; echo $?
255
借助启发式方法,您可以根据常用的退出代码来猜测哪个代码来自哪个程序。除非所涉及的程序重叠或发生意外情况,否则这几乎是正确的。标准错误可能存在或可能不存在,并且退出代码可能会更改,具体取决于程序如何退出:
% ssh localhost ./segfault ; echo $?
255
% ./segfault ; echo $?
zsh: bus error ./segfault
138
%
因此,猜测从何$?
而来并不是那么可靠。相反,更好的选择可能是设计一种协议,该协议传达的信息比退出状态字所提供的信息更多。例如,Nagios或Ansible不仅$?
可以确定远程命令的运行方式,还可以进行更多的通信。这可能很简单,只需一行取决于smartctl
运行方式(或分段运行或...)的文本,也可以是更复杂的东西,例如带有标准输出,错误,退出状态字和其他此类元数据的JSON结构。因此smartctl
,smartctl
与其直接运行,不如调用运行并解析其输出的包装程序,并在另一端ssh
收集该输出。如果输出不可用,则说明出现了问题ssh
,或使用包装程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句