18.通过密钥免密访问目标服务器,脚本运行过程中不需要额外交互

通过密钥免密访问目标服务器,脚本运行过程中不需要额外交互,只需第一次需要输入密码,后面访问服务器只需ssh root@192.168.84.129就可直接免密登录

#!/usr/bin/expect -f

#检查参数个数(支持 <用户名> <目标IP> <密码>)

if {$argc != 3} {

复制代码
puts "Usage: [file tail $argv0] <username> <target_ip> <password>"

exit 1

}

#解析参数

set username [lindex $argv 0]

set target_ip [lindex $argv 1]

set password [lindex $argv 2]

#定义密钥路径

set key_path "$env(HOME)/.ssh/id_rsa"

set pub_key "$key_path.pub"

#生成SSH密钥(无则自动创建,不覆盖已有密钥)

if {! [file exists key_path\] \|\| ! \[file exists pub_key]} {

复制代码
puts "未找到SSH密钥,正在生成..."

spawn ssh-keygen -t rsa -b 4096 -f $key_path -N ""

expect {

    "Overwrite (y/n)?" { 

        # 若密钥已存在(意外情况),不覆盖,直接退出

        puts "密钥已存在,无需重新生成"

        exit 0

    }

    eof

}

puts "密钥生成完成:$key_path"

}

#自动拷贝公钥到目标服务器

puts "正在将公钥拷贝到 username@username@username@target_ip..."

spawn ssh-copy-id -i $pub_key username@{username}@username@{target_ip}

expect {

复制代码
# 首次连接时确认主机指纹

"*Are you sure you want to continue connecting (yes/no)?" {

    send "yes\r"

    exp_continue

}

# 输入密码

"*password:" {

    send "$password\r"

}

# 处理公钥已存在的情况

"*already exist on the remote system.*" {

    puts "公钥已存在于目标服务器,无需重复拷贝"

    exit 0

}

# 处理权限拒绝(常见于root用户登录限制)

"*Permission denied*" {

    puts "错误:权限拒绝,可能是用户名/密码错误或目标服务器限制root登录"

    exit 1

}

eof

}

#验证拷贝结果

expect {

复制代码
"*Number of key(s) added: 1*" {

    puts "公钥拷贝成功!现在可免密登录:ssh $username@$target_ip"

}

default {

    puts "公钥拷贝失败,请检查目标服务器连接和密码是否正确"

    exit 1

}

}

相关推荐
Flash.kkl2 分钟前
TCP套接字
服务器·网络·tcp/ip
REDcker10 分钟前
CentOS 与主流 Linux 发行版历史与版本综述
linux·centos·numpy
劳埃德福杰10 分钟前
【Kylin银河麒麟】文件系统磁盘空间满导致无法进入操作系统
运维·服务器·电脑·笔记本电脑·kylin
逻辑峰19 分钟前
ReadStat在Linux的安装和使用
linux·运维·服务器
Lsir10110_30 分钟前
【Linux】序列化与反序列化——网络计算器的实现
linux·运维·网络
脆皮的饭桶1 小时前
给负载均衡做高可用的工具Keepalived
运维·服务器·负载均衡
袁小皮皮不皮1 小时前
【HCIA】第三章TCP/IP协议栈中其他主要协议
运维·服务器·网络·网络协议·tcp/ip
阿梦Anmory1 小时前
保姆级教程:Flask应用实现后台常驻运行(Linux服务器)
linux·服务器·flask
夏日听雨眠1 小时前
Linux学习1
linux·服务器·学习
小生不才yz1 小时前
【Makefile 专家之路 | 函数篇】10. 逻辑增强:逻辑函数(if/and/or)与环境断言(info/error)
linux