2011-08-10 30 views
1

此前,我使用Tk/Expect和plink(PuTTY)来自动执行远程shell操作。但是,如果不同的shell有不同的提示,或者提示字符出现在非提示shell输出(!)中,Expect有时会失败。如何判断远程tty是否在等待输入?

我想知道是否有办法确定远程shell是否在等待输入通过plink或一些第三方库。如果有必要,我可以在套接字层编程。

回答

2

不,没有办法可靠地检测到你正在工作的级别的shell提示符。一些替代方案可能是:

  • 始终运行,它将打印一些识别的输出命令,当他们完成 - e.g,doSomething ; echo uniqueStringThatMeansThatWeAreDone - 然后搜索该字符串。
  • 使您的自动化脚本将提示设置为它在登录时会识别的内容。如果您不知道您使用的是什么外壳,只需要exec即可。
  • 使用一个可以直接执行命令的SSH库,而不是试图编写一个shell脚本。我不熟悉什么是Tcl中可用,但Perl有Net::SSH::Perl,这将让你做这样的事情:

    my $ssh = Net::SSH::Perl->new("remotehost"); 
    $ssh->login("user", "pass"); 
    my $output = $ssh->cmd("doSomething"); 
    
+0

谢谢您的回答。我将研究如何实现Net :: SSH :: Perl,而不是重新发明轮子,但这是我感兴趣的知识。 –

+0

您可能不想尝试重新创建Net :: SSH :: Perl你自己 - 这是一个在Perl中完成SSH客户端的完整实现。不容易。 :) – duskwuff

+0

将提示设置为新的UUID;在另一边偶然出现的可能性是可笑的微乎其微。 –