远程 SSH Gnu/Linux 服务器无法识别我的管道

远程 SSH Gnu/Linux 服务器无法识别我的管道

基本上我正在尝试运行以下命令:

sshpass -p "xxx" ssh [email protected] "tail -f /tmp/messages | grep ptp4l" | cat -n > output.txt

我正在尝试让 tmp/messages 持续写入本地文件,以便我们的一些技术人员可以持续监控其主设备的 IEEE 1588v2 偏移量,而无需了解有关他们正在访问的 Gnu/Linux 服务器的任何信息。

当我运行此命令时,我的文件中根本没有任何输出。

当我手动运行命令时:

tail -f /tmp/messages | grep ptp4l

一切都很好,我没有任何问题。我得到了我正在寻找的输出。

我错过了什么吗?不能通过引用的命令发送管道吗?

谢谢,斯蒂芬

答案1

这是经典的“写入管道是完全缓冲的”问题。

尝试强制您ssh在远程计算机上分配伪终端,-tt或者使用--line-buffered选项grep(如果它接受该选项)。

ssh ... -tt </dev/null 'tail -f /tmp/messages | grep ptp4l' | cat -n > output.txt

ssh ... 'tail -f /tmp/messages | grep --line-buffered ptp4l' | cat -n > output.txt

在远程计算机上分配 tty 时的重定向</dev/null是为了防止ssh混乱当地的tty(通过将其置于原始模式),这是开关的副作用-t。您可以使用任何不使用标准输入的 ssh 命令来执行此操作(如有必要,ssh 客户端将打开/dev/tty以读取其密码,但它不会使用标准输入)。

相关内容