我在 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
在您的命令中,每一个
|
都由您的本地 shell 解释。最后一个参数ssh
看到的是devlist
。ssh
在本地调用(这不足为奇),但第一个|
.你得到的错误来自
sudo
这个片段:do sudo camcontrol identify $a
。它在本地运行,显然camcontrol
在本地机器上不可用。您需要适当的转义或引用。在这种情况下,您可能希望将整个远程命令包含在单引号中:
请注意,我更改了您已有的单引号。(添加的)单引号不仅将整个字符串分组所以
ssh
得到它; 它们还阻止了 的本地扩展$a
。如果
sudo
要询问您的密码,则需要一个伪终端。-t
您可以使用选项强制伪终端分配ssh
(看起来像ssh -t xxx.yyy.zzz.net …
)。注意ssh -t
在远程端分配伪终端。远程sudo
提示到它的 stderr,然后 stdout 和 stderr 被这个伪终端“打印”(就像它们通常被打印到控制台一样),此时你无法再区分它们;合并的流被捕获并传输到本地端,在那里它进入标准输出。如果没有-t
单独传输远程 stdout 和 stderr,请转到本地的 stdout 和 stderr,这些最终会合并(或不合并,如果重定向)到您看到的内容中。这意味着与-t
你不能(在本地)区分远程 stderr 和远程 stdout。如果您需要在本地进一步处理(重定向)输出并使用,-t
那么来自的任何提示sudo
都会产生干扰。你也可能想要双引号
$a
(即使在你的第一个不使用的命令中ssh
)。请参阅为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?