我正在尝试配置mutt
绑定以将电子邮件传输到调用中,ssh
以使用使用显示一些输出的脚本来处理远程计算机上的邮件less
。然而,这不起作用,因为less
只给我整个输出而没有分页。
试图缩小范围,我本质上试图模仿的是:
seq 1 100 | less
但less
在远程机器上运行。 (由于我在 mutt 中调用脚本的用例,该seq 1 100
部分(代表电子邮件)无法在远程计算机上运行,该less
部分(代表 less 的脚本)也无法在本地计算机上运行。)
如果我做:
seq 1 100 | ssh -t REMOTE_MACHINE less
我收到警告“不会分配伪终端,因为标准输入不是终端。”并less
直接显示输出,不进行任何分页。
如果我做:
seq 1 100 | ssh -t -t REMOTE_MACHINE less
less
失败并显示“缺少文件名(“less --help”寻求帮助)”,所以我猜它的输入丢失了。
我也尝试添加zsh -ic
,但没有效果。什么是正确的ssh
调用,以便less
远程主机可以读取其标准输入并像往常一样进行分页?
编辑以尝试回答下面吉尔斯的评论:less
如果将上面示例中的调用替换为实际脚本,也会出现此问题。如果我创建一个包含以下内容的可执行文件script.sh
:
#!/bin/bash
exec less
我把它放在我家里的本地和远程机器上,然后进行以下操作:
seq 1 100 | ~/script.sh
但以下情况则不然(有-t
或-t -t
没有):
seq 1 100 | ssh REMOTE_MACHINE less
答案1
您可以将命令作为参数传递并用于-t
强制伪终端分配。
例如,如果seq
命令需要在远程服务器上运行:
ssh $REMOTE_HOST -t 'seq 1 100 | less'
如果seq
命令需要在本地计算机上运行,那么您可以使用类似的使用内联字符串的命令<<<
(当然引用变得有点困难):
ssh $REMOTE_HOST -t "less <<< \"$(seq 1 100)\""