2013-10-18 25 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