2011-08-10 32 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;在另一邊偶然出現的可能性是可笑的微乎其微。 –