期望值 - 中断程序 - Ctrl+C

13

我正在运行以下脚本以在远程服务器上开始抓包并下载文件。目前,我必须使用Ctrl+C暂停它并手动退出。

我该如何替换交互式操作并定义一个触发器来停止tcpdump或捕获Ctrl+C并将其传递到远程服务器内部?

spawn ssh "$user_ssh\@$ssh_server"

expect {
        "*password"     { send "$pass\n";   exp_continue}
        "root\@*"       { }
        timeout  { puts "time out expecting password or bash"; exit 1 }
    }

send "sudo tcpdump -i $intf -s0 -w $file -v\n";
interact

spawn scp "$user_ssh\@$ssh_server:$file" .

expect "password:"
send "$pass_ssh\n";
expect "100\%"
1个回答

23

要发送 Ctrl+C,请执行以下操作:

send \x03

处理一个进入的Ctrl+C,请执行以下操作:

trap {your handler script here} SIGINT

可能会 想要让处理程序(可以是多行)将信号传递给内部进程...

trap {
    send \x03
    send_user "You pressed Ctrl+C\n"
} SIGINT

但要注意!当用户在文本模式程序中按下Ctrl+C时(在大多数图形界面中,这是复制操作),他们通常希望它很快消失,因此您应该注意确保在信号到达后不要花费太长时间清理所有内容。


能否仅将该陷阱条件应用于特定部分? 例如...在此示例中,仅在“发送”sudo tcpdump -i $intf -s0 -w $file -v\n";"行中有用。 - husvar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接