Shell脚本一键配置ssh免密登陆

Posted 电子取证及可信应用协创中心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本一键配置ssh免密登陆相关的知识,希望对你有一定的参考价值。

     好久没正二八经的更新了,因为小编最近在忙着学习蛤Shell脚本一键配置ssh免密登陆,学业繁重!今天忙里偷闲,给大家写一篇如何配置主机之间进行ssh免密通信的文章。Shell脚本一键配置ssh免密登陆

     至于为什么要配置主机之间免密登陆,大家可能也有这种感觉,就是如果管理多个服务器的时候,如果几个服务器之间需要相互通信,比如scp,一会连这个需要输入密码,一会连那个输入密码,输入来,输入去,一会头都搞大了!!!或者有时还有切换终端,好麻烦啊!!

Shell脚本一键配置ssh免密登陆

     正巧,最近小编手里有几个同学的阿里云试用的服务器,一会搞搞数据库啊,一会相互之间传个文件,这总不能总是输入密码吧?于是,还是简单一点,干脆配置一个ssh免密算了!!!初步查阅资料,发现配置的过程还有点繁琐,为了方便,写个脚本,一键自动化执行吧!

     好了,废话不多说,直接上脚本!

配置环境

linux主机host1:10.0.0.137

linux主机host2:10.0.0.138

配置脚本共有5个,各个脚本功能如下

1、1_ssh_copy_host2.sh,复制host1生成的密钥信息到host2

#!/usr/bin/expect#这个脚本的交互是用到expect,所以解释器是expect,需要安装#yum -y install expect#本脚本是 将host1上设置的公钥上传到 host2结点set host1h "10.0.0.137" set host2h "10.0.0.138" set host1 "root" set host2 "root" set password1 "1234" set password2 "1234" set timeout -1#首先ssh-copy上传密钥到 host2spawn ssh-copy-id -o "StrictHostKeyChecking no" $host2@$host2hexpect "*password:"send "$password2\r"expect eof


2、2_scp_set_hosts_host2.sh,scp设置host2的文件到host2,并且设置host2的hostname及hosts信息

#!/usr/bin/expect#本脚本 首先登陆host2 上,在host2去抓取host1上的文件传到host2 上,并执行命令,设置hosts等set host1h "10.0.0.137" set host2h "10.0.0.138" set host1 "root" set host2 "root" set password1 "1234" set password2 "1234" set timeout -1#需要ssh 到host2,不可以直接连接到host2,因为host2的hosts等没有设置spawn ssh  $host2@$host2hexpect "#*"## 因为是在host2上 去抓取host1上的文件到host2上来,所以需要回答密码send "scp $host1@$host1h:/root/host2_set_hosts.sh /root/host2_set_hosts.sh\r"#需要回到yes/noexpect "(yes/no)?"send "yes\r"expect "*password:"send "$password1\r"# 接收指令,执行下面命令,修改host等,修改完毕后hostname变为host2,可以在host1上直接ssh host2expect "#*"send "chmod 777 /root/host2_set_hosts.sh\r"expect "#*"send "/usr/bin/bash /root/host2_set_hosts.sh\r"expect "#*"send "exit;\r"expect eofexit

3、3_first_ssh_host2.sh、设置完成后第一ssh连接host2,回答yes/no?

#!/usr/bin/expect# 本脚本的功能是 实现第一次登陆host2 的验证 ,以后可以直接密码登陆set timeout -1# 下面进行重新连接,第二个配置文件已经配置完成 ssh host2,进行免密后第一次登陆,本次输入验证信息后,不需要再次输入spawn ssh host2#初次需要输入密码expect "(yes/no)?"send "yes\r"expect "#*"send "exit\r"expect eof

4、host2_set_hosts.sh,用来设置host2的hostname及hosts信息

#!/usr/bin/bash#修改hostnamehostnamectl set-hostname host2#配置主机名sed -i '$a NETWORKING=yes' /etc/sysconfig/networksed -i '$a HOSTNAME=host2' /etc/sysconfig/network#配置hosts文件sed -i 's/^/#/' /etc/hostssed -i '$a10.0.0.137 host1' /etc/hostssed -i '$a10.0.0.138 host2 ' /etc/hosts

5、start.sh、配置host1的hosts信息,hostname信息,以及生成ssh公钥和私钥信息等

#!/usr/bin/bash# 交互工具需要使用expect来交互完成 先安装yum -y install expect#设置host1的hostnamehostnamectl set-hostname host1#配置主机名sed -i '$a NETWORKING=yes' /etc/sysconfig/networksed -i '$a HOSTNAME=host1' /etc/sysconfig/network#配置hosts文件sed -i 's/^/#/' /etc/hostssed -i '$a10.0.0.137 host1' /etc/hostssed -i '$a10.0.0.138 host2 ' /etc/hosts#首先在host1上生成密钥ssh-keygen -t dsa -P '' -f /root/.ssh/id_dsa#调用expect解释器执行的shell去进行配置ssh免密交互chmod 777 /root/1_ssh_copy_host2.shchmod 777 /root/2_scp_set_hosts_host2.shchmod 777 /root/3_first_ssh_host2.sh/root/1_ssh_copy_host2.sh/root/2_scp_set_hosts_host2.sh/root/3_first_ssh_host2.sh

Now!Run the start.sh

让我们来看看结果???不再需要输入密码,成功!


以上是关于Shell脚本一键配置ssh免密登陆的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本自动化配置SSH免密登录和取消SSH免密配置脚本

ssh localhost 配置免密登陆仍需要密码的解决方法

Shell脚本实现ssh免密登录及批量配置管理

Shell脚本实现SSH免密登录及批量配置管理

Shell脚本实现SSH免密登录及批量配置管理

ansible自动安装并配置ssh免密环境shell脚本