能否将通用expect函数导入其他expect脚本实现登录逻辑复用?
实现方法
完全可以通过Expect内置的source命令实现公共逻辑复用,该命令会将指定外部脚本的内容直接插入到当前执行位置,和你设想的导入效果完全一致。
具体实现步骤
1. 编写公共登录脚本login.exp
你可以直接复用你写的基础逻辑,也可以补充异常处理让逻辑更健壮:
# login.exp 公共登录逻辑 expect { timeout { puts "登录超时,程序退出" exit 1 } # 处理首次连接的SSH主机指纹确认提示 "yes/no" { send -- "yes\r" exp_continue } "assword:" { send -- "$pass\r" } } # 可选:增加登录成功校验,避免后续操作提前执行 expect { timeout { puts "未匹配到命令提示符,登录失败" exit 1 } # 正则匹配常见的Linux普通用户/root用户提示符 -re {([#>$] )|(login as: )} }
2. 改造业务调用脚本foo.exp
只需要把你设想的####include login.exp替换为source命令即可:
#!/usr/bin/expect set host [lindex $argv 0] set user [lindex $argv 1] set pass [lindex $argv 2] spawn ssh $user@$host set timeout 5 # 导入公共登录脚本 # 如果担心执行路径影响,可以用绝对路径,比如 source /opt/script/common/login.exp source ./login.exp # 后续自定义业务逻辑 expect { // DO OTHER EXPECT STUFF }
注意事项
- 公共脚本中用到的所有变量(比如示例中的
$pass、全局timeout配置),必须在source命令执行前就完成定义,否则会触发变量未定义错误 - 如果需要跨目录执行调用脚本,可以通过内置变量获取脚本所在目录,避免相对路径失效:
# 获取当前调用脚本所在的目录 set script_dir [file dirname [info script]] # 导入同目录下的公共脚本 source $script_dir/login.exp
内容的提问来源于stack exchange,提问作者dranobob
相关产品推荐
相关产品推荐

