无法通过SSH运行命令

内存

我在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
卡米尔·马乔洛夫斯基(Kamil Maciorowski)

在您的命令中,每一个|都由本地外壳程序解释。最后一个参数sshdevlistssh被本地调用(这并不奇怪),但是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要询问您的密码,它将需要一个伪终端。您可以使用-toption强制伪终端分配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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章