You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将通用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:39:03