2013-10-18 26 views
0

我試圖停止在遠程終端上運行tcpdump命令。如果我telnet到終端,啓動tcpdump,然後發送一個^ c,tcpdump停止沒有問題。但是,如果我telnet到同一個終端,啓動tcpdump,然後退出telnet會話,當我重新連接到同一個telnet會話時,我無法通過^ c停止tcpdump。當我這樣做而不是停止tcpdump時,似乎它只是退出telnet會話並且tcpdump繼續在遠程終端上運行。我在下面提供了我的腳本。任何幫助是極大的讚賞。如何使用期望從一個新的telnet會話遠程停止tcpdump

#!/usr/local/bin/expect -f 

exp_internal 1 
set timeout 30 

spawn /bin/bash 
expect "] " 

send "telnet 192.168.62.133 10006\r" 
expect "Escape character is '^]'." 
send "\r" 
expect "# " 

set now [clock format [clock seconds] -format {%d_%b_%Y_%H%M%S}] 
set command "tcpdump -vv -i trf400 ip proto 89 -s 65535 -w /tmp/test_term420_${now}.pcp " 

send "$command\r" 
expect "tcpdump: listening on" 

# This works correctly. tcpdump quits and I am returned to the expected prompt 
send "\x03" 
expect "# " 



send "$command\r" 
expect "tcpdump: listening on" 

# Exit telnet session 
send -- "\x1d" 
expect "telnet> " 
send -- "q\r" 
expect "] " 

# Reconnect to telnet session 
send "telnet 192.168.62.133 10006\r" 
expect "Escape character is '^]'." 
send "\r" 

# This does not work as intended. The ^c quits the telnet session instead of stopping tcpdump 
send "\x03" 

expect "] " 
send "ls\r" 
expect "] " 

回答

1

要發送Ctrl + C鍵與期待一個從屬過程,這樣做:

send "\x03" 

按Ctrl + @ = 0,Ctrl + A鍵 = 1,Ctrl鍵+ B = 2,Ctrl + C鍵 = 3,等等)

正確處理的Ctrl + C取決於虛擬終端引擎攔截它並將字符轉換爲發送信號的請求。當終端處於烹飪模式時,僅發生。你可能已經熟悉了終端 - 畢竟是默認的 - 但如果這不起作用,那麼首先要檢查。

+0

嗨Donal,謝謝你的幫助,但你的解決方案沒有奏效。我編輯了我的問題,使其更清楚。當在同一個telnet會話中啓動tcpdump時,發送^ c確實有效。但是,當我連接到已經運行tcpdump的遠程telnet會話時,它仍然不起作用。而不是像預期的那樣停止tcpdump,似乎發送^ c退出telnet會話並將我返回到本地計算機。這使我更加困惑。如果你能提供任何更好的見解。 –

1

這聽起來在tcpdump進程已經掉到了第一個telnet會話斷開後的後臺。

也許當您通過第二個telnet會話連接時需要做的事情是使用ps找到進程ID,然後通過kill命令發出信號?

或者更好的是,(在「&」結尾)推出它在後臺擺在首位:

tcpdump -vv -i trf400 ip proto 89 -s 65535 -w /tmp/test_term420_${now}.pcp & 

和外殼會給你的tcpdump進程的PID返回前提示...您可以通過expect -re以及稍後重新連接時讀取它,發出kill -HUP <pid>(或-INT或其他)。

你應該得到類似以下內容(使用sleep 5爲命令,只是作爲一個例子):

$ sleep 5 & 
[1]  29344 
$ 

只是我2C。

+0

謝謝James的建議!在後臺運行tcpdump是一個很好的解決方法,是我目前解決問題的方法。但是我仍然想知道爲什麼當telnet斷開並重新連接時,發送ctrl + C不起作用。當我手動telnet時,很明顯tcpdump仍然在前臺運行,因爲我沒有收到提示,而且我也能夠手動將ctrl + C移出tcpdump。在我的文章中我沒有提到的是,我實際上是通過串行電纜連接到終端所連接的控制檯服務器上的端口。也許這在某種程度上導致了一個問題。 –

+0

很高興知道它有幫助。我聽到你......我也很好奇爲什麼不同的行爲。我會繼續思考它,如果我能想到任何事情,它會回來。 – James