ssh秘钥登录

root5个月前运维&自动化43

流程大致
root用户下:

在本地客户端生成ssh密钥对

ssh-keygen -t rsa

一路三个回车就行了,想设置密语的也可以

生成这样就行了

46C39186-6D60-4448-A30B-F25B97E44DFC.png

把公钥分发给要登录的机器(即服务端)

ssh-copy-id -i .ssh/id_rsa.pub 192.168.1.187

然后去服务端查看文件是否到了

然后把id_rsa.pub公钥加入authorized_keys中,在给上权限(之前有权限的就不用修改了)

cat .ssh/id_rsa.pub >> .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

这个时候如果在本地客户端执行 ssh 192.168.1.187 无法成功的话

这时需要修改目标机器的ssh配置文件(我遇到这个情况了)

修改配置信息如下 :  vi  /etc/ssh/sshd_config

#禁用root账户登录,如果是用root用户登录请开启 
PermitRootLogin yes 

# 是否让 sshd 去检查用户家目录或相关档案的权限数据,
 
# 这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。
 
# 例如使用者的 ~.ssh/ 权限设错时,某些特殊情况下会不许用户登入 
StrictModes no 

# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。 
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内 
RSAAuthentication yes 
PubkeyAuthentication yes 
AuthorizedKeysFile .ssh/authorized_keys

设置完重启一下ssh服务就可以了

/bin/systemctl restart  sshd.service
或者
service sshd restart

参考链接1 参考链接2


接下来开始加点难度

自动连接,expect的使用方法和解释(用户名和密码登录)

vim 1.sh

#!/bin/bash
expect(){
/usr/bin/expect <<-EOF
spawn ssh root$192.168.1.197
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "chen123\r" }
}
interact
expect eof
EOF
}

第一行的解释器不再是/bin/bash,而不是/usr/bin/expect

spawn是“产生”的意思,就是产生一个会话,会话的就是通过root @192.168.80.7发起的。

"yes/no"是关键词,这个非常的重要,你还记得我们通过交互式连接远程主机是会提示你是否要继续连接,这个yes/no就是从那个结尾复制过来的,这样expect程序就可以定位到在什么地方帮助我们输入原本我们要输入的内容,那么要输入什么内容呢?当然是要输入yes,所以我们在“yes/no”后面加了一个中括号,括号里面内容就是发送yes\r(\r是回车的意思),注意,中括号两端都是有空格的,那么那个exp_continue是什么意思呢?就是为了防止万一没有让我们输入"yes/no"时我们来要继续连接。好了,那么下面的password也是关键词,后面就是发送的密码。最后一点是那个interact的意思是当连接成功之后就停留在服务器端先不要断开的意思


非交互式登录系统 expect代替我们发送公钥与远程主机

[root@linuxprobe ~]# vim 1.sh
#!/bin/bash
SERVER_ADDR=192.168.1.187
SERVER_PAWD=123456
expect () {                         #在这里面定义了一个函数expect,作用是用来把已经生成好的公钥推送到服务器
/usr/bin/expect <<-EOF
spawn ssh-copy-id $SERVER_ADDR
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "$SERVER_PAWD\r" }
}
expect eof
EOF
}                                     #函数在此结束
test -f ~/.ssh/id_rsa                #测试密钥是否存在?存在为0,不存在为1.
if [ $? -ne 0 ];then             #如果不存在,就创建
    ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null 
    expect                            #然后推送到服务器
    echo "keygen alreadly send!"
else
    expect                             #如果密钥文件存在,就直接推送
    echo "keygen alreadley send2"
fi

解释:

在脚本的开头我们定义了两个变量,一个变量是服务器的地址,另一个变量的服务器的密码

之后我们我们定义一个函数,这个函数其实就是调用了expect来帮助我们完成交互。

最后,我们通过一个id判断当前家目录有没有密钥文件,如果没有话,我们就创建,并且调用expect函数代替我们交互;如果有的话,就不用创建了,直接代替我们交互就可以了。

注意1:

ssh-keygen里面,-P“”的意思是空密码,-f是指定文件名,ssh-keygen不使用这两个选项时是交互的,使用了这两个选项就不用再交互了,也不用expect的帮忙,有的同学可能注意到了后面的文件是.ssh/id_rsa,为什么是这个路径呢?id_rsa是私钥,生成私钥会一块生成公钥的,所以我们在这里指定私钥就可以了。

注意2:

ssh-copy-id也是可以使用user@192.168.1.187的,上文当中没有写,默认就是当前用户了。

再加大一点难度,怎样批量给多台服务器推送公钥呢?在上面我们给一台服务器推送脚本会了,给多台服务器推送脚本也不难在上面的脚本里面再加一个for循环就可以了,下面我们就来实现一下。假设我们已经知道和服务器的IP列表和各个密码,然后再给这台服务器推送公钥,IP列表和密码在此:

cat serverhost.txt

192.168.1.188 123456                #服务器的地址和密码都是用空格隔开的
192.168.1.189 123456

vim send_key.sh

#!/bin/bash
expect () {   #同上,一开始就定义了一个expect的函数
/usr/bin/expect <<-EOF
spawn ssh-copy-id root@$ADDR
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send $PASSWD\r }
}
expect eof
EOF
}           #函数在此结束
SERVERHOST=/tmp/serverhost.txt
for ADDR in `cut -d" " -f1 $SERVERHOST`;do  #这一cut把所有的ip全都列出来了
PASSWD=$(grep $ADDR $SERVERHOST | cut -d" " -f2)
test -f ~/.ssh/id_rsa
if [ $? -ne 0 ];then
ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
expect
echo "key already send!"
else
expect
echo "key already send!!"
fi
done


就可以批量分发密钥 

  参考连接3




相关文章

Ubuntu搭建zabbix(apach/nginx)填坑篇

Ubuntu搭建zabbix(apach/nginx)填坑篇

apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring php7.0-mysql安装Zabbix所需的几个PHP模块wget http://r...

CentOS7.6部署Nginx+Zabbix监控系统

CentOS7.6部署Nginx+Zabbix监控系统2020.03.30  TsengYia ---- http://tsengyia.blog.chinaunix.net/&n...

Zabbix配置自动发现,实现批量添加主机

Zabbix配置自动发现,实现批量添加主机

一、需求  zabbix 服务器可以手动加入zabbix-agent客户端,对于少量的机器,这没有什么。但到了线上,我们有大量的服务器需要监控时,如果再一个个的手动加的话,工作量势必会增加很多。这时,...

解决zabbix 嵌入到frame时不被允许

系统嵌入zabbix界面时间遇见不被允许插入frame中因为header头设置了X-Frame-Options 前端界面显示为:Refused to display 'http://...

zabbix服务无法访问mysql或界面显示zabbix_server no data

部署zabbix突然出现no data 的情况通过查看日志发现zabbix_server 无法访问数据库。导致数据无法获取到。进入zabbix的安装界面(/setup)重新配置数据库仍然发现没有办法连...

zabbix 监控脚本中执行docker命令没有权限

在zabbix_agnet中执行监本时,提示Got permission denied while trying to connect&nb...