[转帖]expect 实现 ssh免密登录的脚本

expect,实现,ssh,登录,脚本 · 浏览次数 : 0

小编点评

```bash #!/bin/bash # Author:cosann # Version:0.2 # Date:2022/7/27 # Description:批量部署SSH免密登录脚本 # 检查参数数量 if [ $# -ne 1 ]; then echo -e "Usage:$0 ip_list_file " exit 65 fi # 文件检测 if [ ! -f "$1" ]; then echo -e "$IP_List_File $1文件异常,请检查内容" exit 65 fi # 初始化变量 ip_address=$(awk '{print $1}' "$1_list_file") username=$(awk '{print $2}' "$1_list_file") password=$(awk '{print $3}' "$1_list_file") # 检查依赖组件 if [ `rpm -qa | grep "expect" &> /dev/null;echo $? -ne 0 ]; then echo -e "未安装必须组件Expect,开始执行安装,请稍等..." ( yum install -y expect &> /dev/null && echo -e ">Expect安装完成!\" ) || ( echo -e "部署必须组件Expect失败,请检查Yum配置" && exit 65 ) elif [ `rpm -qa | grep "openssl" &> /dev/null;echo $? -ne 0 ]; then ( yum install -y openssh &> /dev/null && echo -e ">Openssh安装完成!\" ) || ( echo -e "部署必须组件Openssh失败,请检查Yum配置" && exit 65 ) elif [ `rpm -qa | grep "openssh-clients" &> /dev/null;echo $? -ne 0 ]; then echo -e "未安装必须组件openssh-clients,请检查Yum配置" exit 65 fi # 生成SSH密钥复制脚本 echo -e " # 准备远程主机密钥复制 spawn ssh-copy-id -i '$HOME/.ssh/id_rsa.pub' ${username}@${ip_address} # 输入密码,并登录远端主机 expect \"*password*\" { send '$password'; } # 打印登录成功信息 expect \"*#\" { send 'echo \"##登录成功##\"'; } " > ssh_copy_script.txt # 批量运行SSH密钥复制脚本 cat ssh_copy_script.txt | while IFS= read -r -r line; do /usr/bin/expect<<-EOF spawn ssh ${username}@${ip_address} expect \"*]#\" send \"echo \"##登录成功##\"\\r\" expect \"*]#\" send \"exit\\r\"EOF done rm -f ssh_copy_script.txt done # 打印完成信息 echo -e "--------------------------------------------------------------------------------------" echo -e "--------------------------------------------------------------------------------------" echo -e "--------------------------------------------------------------------------------------" echo -e "###推送完成,尝试免密登录###" ```

正文

expect 实现 ssh免密登录的脚本

#!/bin/bash
#Author:cosann
#Version:0.2
#date:2022/7/27
#description:批量部署SSH免密登录脚本

E_ERROR=65

#传参检测
if [ $# -ne 1 ]
then 
    echo -e "Usage:$0 ip_list_file "
    exit E_ERROR
fi

#文件检测
if [ ! -f "$1" ]
then
    echo -e "IP_List_File $1文件异常,请检查内容"
    exit E_ERROR
fi 

#初始化
ip_list_file=$1
#从文本读取值初始化变量
ip_address=(`awk '{print $1}' $ip_list_file`)
username=(`awk '{print $2}' $ip_list_file`)
password=(`awk '{print $3}' $ip_list_file`)

#安装软件检测及部署环境配置
echo -e "》》》开始检测依赖的必须组件是否安装》》》\n"
if [ `rpm -qa | grep "expect" &> /dev/null;echo $?` -ne 0 ]
then
    echo -e "未安装必须组件Expect,开始执行安装,请稍等..."
    ( yum install -y expect &> /dev/null && echo -e ">Expect安装完成!" ) || ( echo -e "部署必须组件Expect失败,请检查Yum配置" && exit E_ERROR )
elif [ `rpm -qa | grep "openssl" &> /dev/null;echo $?` -ne 0 ]
then
    ( yum install -y openssh &> /dev/null && echo -e ">Openssh安装完成!" ) || ( echo -e "部署必须组件Openssh失败,请检查Yum配置" && exit E_ERROR )
elif [ `rpm -qa | grep "openssh-clients" &> /dev/null;echo $?` -ne 0 ]
then
    ( yum install -y openssh-clients &> /dev/null && echo -e ">Openssh-clients安装完成!" ) || ( echo -e "部署必须组件Openssh-clients失败,请检查Yum配置" && exit E_ERROR )
else
    echo -e ">必须组件Expect已安装"
    echo -e ">必须组件Openssh已安装"
    echo -e ">必须组件Openssh-clients已安装"
fi


#打印菜单
echo -e "\n===============================================" 
echo -e "该脚本可以实现批量部署和删除SSH免密配置"   
echo -e "Author:Cosann"
echo -e "Create time:2022/07/27"
echo -e "===============================================" 
    while :
    do
    echo -e ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 
    echo -e "1. 配置SHH免密登录"
    echo -e "2. 取消SHH免密配置"
    echo -e "3. 退出程序"
    
    #功能控制及实现
    read -p "请输入序号>>> " nu
    if [[ "$nu" == "3" ]]
    then
        #退出程序
        echo -e "\n###!!!感谢使用,再见!!!###"

        exit 0
    elif [[ "$nu" == "1" ]]
    then    
        echo "开始推送"
        #检测公钥文件是否存在,不存在则生成
        if [ ! -e "$HOME/.ssh/id_rsa.pub" ];then
            ssh-keygen -t rsa -P '' -f $HOME/.ssh/id_rsa
        else
            echo -e "》》》已创建公钥文件,开始向远端服务器推送公钥》》》"
        fi

        #循环控制
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
            #echo -e "${ip_address[$i]}\t${username[$i]}\t${password[$i]}"
            #自动化交互实现推送ssh公钥
            /usr/bin/expect<<-EOF
            spawn ssh-copy-id -i $HOME/.ssh/id_rsa.pub ${username[$i]}@${ip_address[$i]}
            expect {
            "*yes/no"    { send "yes\r";exp_continue }
            "*password"  { send "${password[$i]}\r" }
        }
        expect eof
EOF
        done
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "--------------------------------------------------------------------------------------"
        echo -e "###推送完成,尝试免密登录###"
        #推送公钥成功免密结果通知
        for (( i=0;i<$count;i++ ))
        do
            /usr/bin/expect<<-EOF
            spawn ssh ${username[$i]}@${ip_address[$i]}
            expect "*]#"
            send "echo "##登录成功##"\r"
            expect "*]#"
            send "exit\r"
EOF
        done
        echo -e "-------------------------------------------"
        echo -e "已完成SHH免密配置,请尝试SHH登录远端主机确认"

    elif [[ "$nu" == "2" ]]
    then
        #自动化交互实现删除配置免密的远程主机上的authorized_keys
        count=`grep -v '^$' $ip_list_file | wc -l `
        for (( i=0;i<$count;i++ ))
        do
        /usr/bin/expect<<-EOF
        spawn ssh ${username[$i]}@${ip_address[$i]}
        expect "*]#"    
        send "rm -f /root/.ssh/authorized_keys 2> /dev/null\r"
        expect "*]#"
        send "exit\r"
EOF
        done 
        echo -e "-------------------------------------------"
        echo -e "已取消SHH免密配置,请尝试SHH登录远端主机确认"

    else
        echo -e "\033[41;37m 非法输入,请检查输入!!! \033[0m"
    fi
done

————————————————
版权声明:本文为CSDN博主「isk--cosann」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43715659/article/details/126012465

文件格式为:
192.168.255.xx root  password

 

 

与[转帖]expect 实现 ssh免密登录的脚本相似的内容:

[转帖]expect 实现 ssh免密登录的脚本

expect 实现 ssh免密登录的脚本 #!/bin/bash #Author:cosann #Version:0.2 #date:2022/7/27 #description:批量部署SSH免密登录脚本 E_ERROR=65 #传参检测 if [ $# -ne 1 ] then echo -e

[转帖]Shell编程之免交互

目录 交互的概念与Linux中的运用Here Document 免交互tee命令重定向输出加标准输出支持变量替换多行注释Expect实例操作免交互预设值修改用户密码创建用户并设置密码实现 ssh 自动登录 交互的概念与Linux中的运用 交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制

[转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。 结合Shell Script实现自动和

[转帖]Shell脚本中利用expect实现非交互式

https://developer.aliyun.com/article/885723?spm=a2c6h.24874632.expert-profile.295.7c46cfe9h5DxWK 简介: expect非交互式 expect可以在脚本中完成一些交互式的操作,例如远程登录时要输入yes或者

[转帖]详解自动交互命令expect,免去手动输入!

https://zhuanlan.zhihu.com/p/192470248 #概述expect是一个用来实现自动交互功能的软件套件,是基于TCL的脚本编程工具语言,方便学习,功能强大 #扩展TCL:全拼为Tool Command Language ,是一种脚本语言,由John Ousterout创

[转帖]Nginx四层负载均衡详解

https://developer.aliyun.com/article/885599?spm=a2c6h.24874632.expert-profile.315.7c46cfe9h5DxWK 2022-04-14 322举报 简介: Nginx四层负载均衡就是实现通过访问某个ip的端口转发至对应的

[转帖]零信任策略下K8s安全监控最佳实践(K+)

https://developer.aliyun.com/article/1009607?spm=a2c6h.24874632.expert-profile.126.3b0b506fysVD76 简介: 本文重点将围绕监控防护展开,逐层递进地介绍如何在复杂的分布式容器化环境中借助可观测性平台,持续监

[转帖]07-rsync企业真实项目备份案例实战(需求收集--服务器配置---客户端配置---报警机制---数据校验---邮件告警)

https://developer.aliyun.com/article/885820?spm=a2c6h.24874632.expert-profile.279.7c46cfe9h5DxWK 简介: 2.需求描述 客户端需求: 1.客户端每天凌晨1点在服务器本地打包备份(系统配置文件、日志文件、其

[转帖]spawn....expect简介及EOF遇到的坑

spawn....expect简介及EOF遇到的坑 为什么使用spawn expect ....expectexpect命令命令演示在shell脚本中使用expect 为什么使用spawn expect … 很多时候,指令的执行是需要交互的,比如下面这个命令大家一定很熟悉: ssh-keygen -

[转帖]Linux中EOF和Expect命令详解

一、EOF说明 Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。 回顾一下< <的用法。当shell看到< <的时候,它就会知道下一个词是一个分界符。在