編輯:我已經通過引用Exploring Expect書來解決它。但請不要猶豫,添加我的答案或提出其他建議,但!當我被允許時(從現在起2天),我會將其標記爲回答。如何在TCL Expect中的多個過程之間共享衍生的SSH過程?
我環顧四周,很遺憾,我無法在本網站上使用SSH期望過多。我對Expect相對來說比較陌生,但我一直在用Exploring Expect這本書教我自己。
我的問題是:如何爲多個tcl程序使用單個衍生的SSH進程?我現在的解決方法是在程序1結束時關閉SSH連接,並在程序2中重新生成一個新的SSH連接。
示例:(該示例簡化了很多步驟,僅包含必要的組件我的問題...我的整個計劃是200線,截至目前)
;# Proc definition for procedure1
proc procedure1 {user host pw} {
spawn /usr/bin/ssh [email protected]$host
expect "Password:"
send "$pw\r"
expect "#" ;# This is my device's prompt
;# From here it does a bunch of stuff... sends commands to the SSH
;# session, captures output, builds arrays and lists, etc
send "exit" ;# Disconnects the SSH session
return $mylist ;# returns a list of numbers to be used in procedure 2
}
;# Proc definition for procedure2
proc procedure2 {resultofproc1 user host pw} {
spawn /usr/bin/ssh [email protected]$host
expect "Password:"
send "$pw\r"
expect "#" ;# This is my device's prompt
;# Proc 2 now continues on in the same device using the results (a
;# list) from proc1.
return
}
;# Procedure call for first procedure:
set resultofproc1 "[procedure1 $user $host $pw]"
;# Procedure call for second procedure:
procedure2 $resultofproc1 $user $host $pw
,而不是關閉在程序1月底的SSH連接,並在重新開放的過程2開頭的SSH連接,我怎麼能發送命令從procedure2到在procedure1中打開的SSH連接?很明顯,我將不得不刪除發送出口,以保持連接打開。假設這是可能的...這是一個很好的做法,還是我最好分離程序之間的連接?如果是這樣,你可以修改我的代碼示例來演示如何?
從我收集的,我認爲它與spawn_id變量..但我不知道如何在我的代碼中實現。我目前正在閱讀探索期望書中的第10章「處理多個進程」。如果我可以自行解決,我會報告回來。
感謝您的協助!
我已經查看了這些答案在計算器:
Tcl Expect Keep SSH Spawn open
Expect Procedure for SSH Login
Using procedure for spawing SSH doesn't work properly with expect
感謝whjm!我將更多地關注upvar與全球變量的想法。 – David00
手冊中提取的內容意味着你只需要在'open_conn'進程中使用'global spawn_id',你可以從所有其他helper procs中移除'upvar'命令。他們將自動從全局範圍獲取spawn_id。這個例外是在'main' proc中,你明確引用了var:那裏,你可以使用'$ :: spawn_id'從全局範圍中獲取它。 –
@glennjackman - 我同意'全球'是足夠的,更容易對大多數情況下。處理多個spawn或編寫庫代碼時,'upvar'更好。 – pynexj