我可以使用运行 SunOS 5.10 的机器(称为 solaris)。我还可以使用 RedHat 机器(称为 redhat)。
ssh -tt
如果从 solaris 运行到 solaris,似乎不会给我输出,但其他情况下可以按预期工作。从 redhat 运行到 solaris:
redhat$ </dev/null ssh -tt solaris echo ged
ged
Connection to solaris closed.
从 solaris 到 redhat:
solaris$ </dev/null ssh -tt redhat echo ged
tcgetattr: No such device or address
ged
Connection to redhat closed.
从 solaris 到 solaris:
solaris$ </dev/null ssh -tt solaris echo ged
Connection to solaris closed.
嗯...看起来好像命令没有运行或输出被删除了。从 solaris 到 solaris:
solaris$ rm -f /tmp/ged
solaris$ </dev/null ssh -tt solaris touch /tmp/ged
solaris$ ls -l /tmp/ged
-rw-r--r-- 1 tange other 0 Aug 8 07:02 /tmp/ged
因此命令显然已经运行;只是输出被删除了。
我如何获取 ssh 的输出?
背景
以上是 GNU Parallel 中的一个错误的本质,这也是为什么需要 </dev/null 和 -tt:
- </dev/null 是因为我们并行运行多个命令,因此它们无法获取当前 tty。
- 需要 -tt,因为否则 Ctrl-C 将无法远程工作。
更新
看来这是由于这个错误造成的:https://bugzilla.mindrot.org/show_bug.cgi?id=1199
一种解决方法似乎是从 Perl 获取 PTY 并使用它:
perl -MIO::Pty -e '$pty = new IO::Pty; print $t=$pty->ttyname(),"\n"; print `openssh-5.0p1/ssh -tt solaris.p echo foo < $t`'
不幸的是,IO:Pty 没有安装在 Solaris 5.10 上,它不仅是一个 Perl 包,而且还是一个 .xs 文件 - 因此它也需要一个 C 编译器;所以不是一个好的解决方案。
所以问题是:SunSSH 1.1 和 OpenSSH 5.0 能否解决这个问题 - 可能借助 Perl?