自动登录跳板机的shell脚本 expect ssh

批量SSH登录
本文介绍了一种使用Shell脚本结合Expect实现对多台服务器进行自动化的SSH登录方法,解决了传统方式下需逐一输入密码的问题,提高了远程操作效率。

需求

有n台服务器,只需要执行一个命令即可自动登录,而不需要再手动输入密码。

网上的方法

网上很多 expect 的教程,但是里面只是写死了一两个服务器而已,因为他们使用的头部是 #!/usr/bin/expect,里面不能加入shell 的运行命令。如果是n台或者多台服务器,这种方式是执行不了的。所以需要能让shell命令和 expect命令共同运行才行。

解决方法

使用一个shell脚本,里面列出所有的服务器的登录信息,然后再进行expect执行。

#!/bin/bash
ibm1=("root" "XXXX" "33" "password1" "10.10.1.1")
ibm2=("root" "XXXX" "33" "password2" "10.10.1.2")
ibm3=("root" "XXXX" "33" "password3" "10.10.1.3")
ibm4=("root" "XX2XX" "33" "password4" "10.10.1.4")
ibm5=("root" "XXXX" "2222" "password5" "10.10.1.5")
aly1=("root" "XXXXX" "22" "password6" "11.2.3.1" "testoc")
aly2=("root" "XXXX" "22" "password7" "11.2.3.4" "gitlab")

servers=(ibm1[@] ibm2[@] ibm3[@] ibm4[@] ibm5[@] aly1[@] aly2[@])
ct=${#servers[@]}
echo "请输入公网IP 或标识:"
read ip

realip=
for ((i=0;i<$ct;i++))
do
    serv=${!servers[i]}
    echo $serv | awk '{print $2$6}' | grep $ip &>/dev/null
    if [ $? == 0 ] ; then
        realip=($serv)
        break
    fi
done

if [ ! -z "$realip" ]; then
    echo "start login ${realip[1]} ${realip[5]}..."
    expect -c "
        set timeout -1
        spawn ssh -p ${realip[2]} ${realip[0]}@${realip[1]}
        expect {
            \"*(yes/no)*\" { send \"yes\r\" }
            \"password\" { send \"${realip[3]}\r\"; interact }
        }
    "
else
    echo "Not Found.\n"
fi

注意事项

1)expect 等待为什么特别长
在里面必须加入一段 set timeout -1

2)为什么总是在等待,第一次登录的时候会有 提示要不要加入ssh-key。
这个时候写法必须是这样

        expect {
            \"*(yes/no)*\" { send \"yes\r\" }
            \"password\" { send \"${realip[3]}\r\"; interact }
        }

网上的如下写法是错误的:

expect "password:"
send "xxxxx\r"
interact

这样只会让一只在等待,可以直接在终端运行 expect 进行测试即可知道。 ( by coconets#163.com)

Shell脚本中,可以通过Expect脚本自动化地通过SSH连接到堡垒(也称为跳板)并执行命令。Expect是一个用于自动化控制交互式应用程序的命令解释器,比如telnet、ftp、passwd、fsck、rlogin、ssh或者甚至是系统上的命令行。 以下是使用Expect脚本通过SSH连接到堡垒并执行命令的基本步骤: 1. 安装Expect。在大多数Linux发行版中,可以通过包管理器安装Expect,例如在Ubuntu中可以使用`sudo apt-get install expect`命令安装。 2. 创建一个Expect脚本,使用`spawn`命令启动SSH会话,然后使用`expect`命令等待特定的字符串(通常是密码提示),接着使用`send`命令发送密码。 3. 在Shell脚本中调用Expect脚本。 下面是一个简单的示例: ```bash #!/usr/bin/expect # 调用SSH命令连接到堡垒 spawn ssh 用户名@堡垒地址 # 等待密码提示 expect "password:" # 发送密码(注意:为了避免密码显示在历史记录中,应当使用send_user) send_user "你的密码\n" # 交互模式,让脚本继续交互式操作 interact ``` 将上述脚本保存为`ssh_to_bastion.exp`,然后通过Shell脚本调用它: ```bash #!/bin/bash expect ssh_to_bastion.exp ``` 确保将`用户名`、`堡垒地址`和`你的密码`替换为实际的值,并根据实际情况调整脚本。 使用Expect脚本自动SSH登录时需要注意安全性,因为脚本中会包含明文密码。出于安全考虑,建议使用密钥认证来替代密码认证,或者使用更安全的凭证管理方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值