0

我试图阻止 tcpdump 命令在远程终端上运行。如果我 telnet 到终端,启动 tcpdump,然后发送 ^c,tcpdump 会停止而没有问题。但是,如果我 telnet 到同一个终端,启动 tcpdump,然后退出 telnet 会话,当我重新连接到同一个 telnet 会话时,我无法通过 ^c 停止 tcpdump。当我这样做而不是停止 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 "] "
4

2 回答 2

1

Ctrl+C使用 Expect 将 a 发送到下级进程,请执行以下操作:

send "\x03"

Ctrl+@=0、Ctrl+A=1、Ctrl+B=2、Ctrl+C=3 等)

正确处理Ctrl+C取决于虚拟终端引擎拦截它并将字符转换为发送信号的请求。这在终端处于熟化模式时发生。你可能已经把终端煮熟了——毕竟这是默认的——但如果这不起作用,那是首先要检查的事情。

于 2013-10-19T20:46:25.803 回答
1

在我看来,tcpdump在第一个 telnet 会话断开连接后,该进程已进入后台。

当您通过第二个 telnet 会话连接时,您可能需要做的是找到使用的进程 ID ps,然后通过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 5as 命令,仅作为示例):

$ sleep 5 &
[1]     29344
$

只是我的2c。

于 2013-10-22T16:41:15.447 回答