#!/usr/bin/expect -f
# 载入服务器列表
set file [open "~/sh/Server/servers.conf"]
set servers [split [read $file] "\n"]
close $file
# 显示服务器列表
puts "Available servers:"
# 使用正则表达式去匹配每一行的格式
foreach server $servers {
if {[regexp {^(\d+)\)\s+([^\s:]+):\s+([^\s@]+)@([^\s:]+):(\d+):(\w+)(:(.*))?} $server -> number name user host port method details]} {
puts "$number) $name"
}
}
# 让用户做出选择
send_user "Select a server to connect to \[number\]: "
flush stdout
set choice [gets stdin]
# 查找用户选择的服务器
set chosen_server_info ""
set login_method ""
set password ""
foreach server $servers {
# 正则表达式匹配每条服务器配置,并且pwd字段是可选的
if {[regexp {^(\d+)\) ([^\s:]+):\s+([^@]+)@([^:]+):(\d+):(\w+)(?::([^:]+))?} $server -> number name user host port method pwd]} {
# 如果输入的选择与列表中的编号相匹配
if {$number eq $choice} {
set chosen_server_info "$user@$host"
set chosen_port $port
set login_method $method
set password $pwd
break
}
}
}
# 如果没有找到服务器,输出错误信息并退出脚本
if {$chosen_server_info eq ""} {
puts "Server choice not found. Exiting."
exit
}
# 根据登录方法执行登录操作
switch -- $login_method {
"key" {
# 使用SSH密钥登录
puts "Connecting to $chosen_server_info using SSH key..."
# 这里应该是您用来连接服务器使用SSH密钥的命令
spawn ssh -o ServerAliveInterval=60 $chosen_server_info -p $port
interact
}
"pwd" {
# 使用密码登录
puts "Connecting to $chosen_server_info on port $chosen_port using password..."
spawn ssh -o "StrictHostKeyChecking=no" -p $chosen_port $chosen_server_info
expect "password:"
send "$password\r"
interact
}
"ask" {
# 当需要时询问密码
send_user "Enter password for $chosen_server_info: "
flush stdout
set password [gets stdin]
puts "Connecting to $chosen_server_info..."
# 这里应该是您用来连接服务器且需要输入密码的命令,并使用`$password`变量
# exec echo $password | sshpass -f - ssh -o "StrictHostKeyChecking no" $chosen_server_info
spawn ssh -o "StrictHostKeyChecking=no" -p $chosen_port $chosen_server_info
expect "password:"
send "$password\r"
interact
}
default {
puts "Unknown login method: $login_method"
}
}
# 连接到服务器(假设是ssh命令)
# 您可能需要根据提供的登录方法和密码来构造不同的SSH命令或使用不同的程序
# 例如,如果使用SSH密钥,则可能需要指定密钥文件的路径
# 如果使用密码,可能需要通过某种方式(如sshpass或expect)来自动输入密码
# 交互模式,允许用户与SSH会话交云
Server.conf
1) server_name: user@ip:port:method[:pwd]
示例
1) OpenWrt: root@192.168.1.1:22:pwd:password
2) aliyun: root@192.168.1.1:22:key
实现效果