2009-12-09 86 views
5

我正在編寫一個Expect腳本,並且在處理shell提示時遇到問題(在Linux上)。我的預期腳本產生rlogin,遠程系統使用ksh。遠程系統上的提示包含當前目錄,然後是" > "(空間大於空間)。腳本片段可能是:如何在預期腳本中刷新輸入緩衝區?

send "some command here\r" 
expect " > " 

這適用於簡單的命令,但事情開始時,我發送命令超出終端的寬度(或者更精確地出問題,什麼ksh認爲是寬度終點站)。在這種情況下,ksh會在交互式命令行中進行一些奇怪的水平滾動,這似乎會重寫提示並在輸出中附加一個額外的「>」。當然,這會導致Expect腳本在執行命令後出現輸出中出現多個提示時(我的腳本包含多個send/expect對),會感到困惑並且不同步。

我試過將遠程系統上的PS1更改爲「prompt>」這類更具特色的東西,但是出現了類似的問題,這表明這不是解決問題的正確方法。

我在想什麼可能會有幫助的是腳本能夠告訴「我知道我現在正確地與遠程系統同步,所以現在刷新輸入緩衝區。」 expect聲明有-notransfer標誌,其中不會即使模式匹配,也會丟棄輸入緩衝區,所以我認爲我需要與此相反。

是否還有其他有用的技術可以用來使遠程shell的行爲更具可預測性?我知道Expect經歷了很多工作,以確保產生的會話出現與遠程系統交互,但我寧願一些更令人討厭的交互功能(例如水平滾動ksh)被關閉。

回答

7

如果你想扔掉所有輸出到目前爲止Expect是已經看到了,嘗試

expect -re $ 

這是$一個正則表達式匹配,這意味着輸入緩衝區的結尾,所以它只是跳過收到的一切都那麼遠。更多詳情,請致電Expect man page

+0

非常好,這似乎正是我所需要的。 – 2009-12-10 21:18:59

1

你可以嘗試「set -o multiline」或COLUMNS = 1000000(或其他適當的大值)。

+0

這個系統上的'ksh'似乎沒有'multiline'選項,但我發現如果我設置了+ emacs'(關閉emacs行編輯選項,這看起來像是默認在這裏),那麼水平滾動也被禁用。 – 2009-12-09 21:48:52

0

我在使用ksh和Expect時遇到了困難。我的解決方案是使用除登錄shell以外的 ksh。

如果您可以將遠程登錄更改爲非ksh(使用chsh命令或編輯/ etc/passwd),那麼您可以使用/ bin/sh作爲shell來嘗試此操作。

另一種方法是告訴KSH,終端是一個啞終端 - 不允許它進行任何特殊處理。

$ export TERM="" 

可能做的伎倆。

+0

不幸的是,在這種情況下,很多其他的東西都依賴於shell是ksh。我會嘗試取消設置'TERM',這是一個好主意。 – 2009-12-10 04:10:53