编辑:我已经通过引用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