我在FreeBSD机器(xxx.yyy.zzz.net)上运行命令并获取输出
命令
sudo camcontrol devlist | grep -o 'ada[0-9]' | while read -r a ; do sudo camcontrol identify $a | grep rotating ; done
输出
media RPM non-rotating
media RPM non-rotating
media RPM non-rotating
我正在尝试使用另一台计算机上的ssh运行相同的命令
命令
ssh xxx.yyy.zzz.net sudo camcontrol devlist | grep -o 'ada[0-9]' | while read -r a ; do sudo camcontrol identify $a | grep rotating ; done
错误
sudo: camcontrol: command not found
在您的命令中,每一个|
都由本地外壳程序解释。最后一个参数ssh
是devlist
。ssh
被本地调用(这并不奇怪),但是first之后的所有内容也是如此|
。
您收到的错误来自sudo
以下代码段:do sudo camcontrol identify $a
。它在本地运行,显然camcontrol
在本地计算机上不可用。
您需要适当的转义或引用。在这种情况下,您可能希望将整个远程命令包含在单引号中:
ssh xxx.yyy.zzz.net 'sudo camcontrol devlist | grep -o "ada[0-9]" | while read -r a ; do sudo camcontrol identify $a | grep rotating ; done'
注意,我更改了您已有的单引号。(添加的)单引号不仅将整个字符串ssh
归为一团,而且得到了整个字符串。它们还阻止了细菌的局部扩展$a
。
如果sudo
要询问您的密码,它将需要一个伪终端。您可以使用-t
option强制伪终端分配ssh
(因此看起来像ssh -t xxx.yyy.zzz.net …
)。注意ssh -t
在远程侧分配伪终端。远程sudo
提示其stderr,但随后通过该伪终端“打印” stdout和stderr(就像它们通常打印到控制台一样),此时,您不能再将它们分开。合并的流将被捕获并传输到本地端,并进入stdout。如果没有-t
分别传输远程stdout和stderr,请转到本地端的stdout和stderr,它们最终会合并(如果重定向,也不会合并)到您看到的内容中。这意味着-t
您(在本地)无法将远程stderr与远程stdout区分开。如果您需要在本地进一步处理(重定向)输出并使用,-t
则来自的任何提示sudo
都会造成干扰。
另外,您可能想要双引号$a
(即使在第一个不使用的命令中也是如此ssh
)。请参阅为什么我的Shell脚本会在空白或其他特殊字符上造成窒息?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句