我正在使用 Expect 來自動執行 VoIP 通話以進行品質測量。
我的腳本正在呼叫另一個 VoIP 用戶端指定的次數。在處理呼叫之前,tcpdump 應嗅探所有資料包。當 tcpdump 佔用終端時,之後將無法產生 VoIP 用戶端。我的腳本基本上是這樣的:
set count [lindex $argv 0] //amount of calls that the VoIP should do
spawn tcpdump -i eth2 -s 0 -w dump1.pcap &
for {set i 1} {$i <= $count} {incr i 1} {
spawn ./pjsua --config-file=config.txt //starting VoIP client
expect "Make call: "
send "sip:[email protected]\r" //starting the VoIP call
sleep 30
send "h\r" //stopping the call
send "q\r" //closing the VoIP client
close //closing the spawned process
}
interact
我認為 tcpdump 生成背後的 & 運算子在後台生成它。但是我收到錯誤訊息:
send: spawn id exp7 not open
while executing
"send "\r""
invoked from within
"for {set i 1} {$i <= $count} {incr i 1} {
spawn ./pjsua --config-file=config.txt"
如何使用 tcpdump 在背景擷取封包,同時啟動其他進程並進行 VoIP 通話?
答案1
您可以刪除與號 (&):spawn
始終以這種方式進行操作。每個產生的管道都有一個識別碼儲存在 $spawn_id 全域中。您需要在每次生成後將其保存到單獨的變數中,以便能夠使用-i
下面的expect
和send
運算符中的標誌來引用每個變數。請參閱這些運算符的描述下的相關範例 預計(1)。
答案2
我透過使用 $spawn_id 變數引用進程解決了我的問題。我的程式碼在相關行中如下所示:
spawn sudo tcpdump -i eth2 -s 0 -w $date/$dumpname
set tcpID $spawn_id
[...]
spawn ./pjsua --config-file=config
[...]
set pjID $spawn_id
send -i $pjID "\r"
[...]
close
close -i $tcpID