通过pssh和sshpass工具实现一对多的免密登陆+批量操作

需求:

一台服务器A上实现对多台机器(SUT,被测机)的批量执行命令,发送文件

使用系统,工具:

CentOS 7

pssh(yum install pssh安装):用于批量执行操作,前提是已经配置好了ssh免密登录

sshpass(yum install sshpass安装):用于ssh登陆时自动输入密码

思路:

服务器A上生成公钥,将公钥分发给所有SUT的test用户,使得所有SUT的test用户可以免密登陆

修改/etc/ssh/sshd_config配置文件,使得可以root用户登陆

服务器A将公钥分发给所有SUT的root用户,使得所有SUT的root用户可以免密登陆

发送服务器A指定目录下的文件到所有SUT

备注:之前也想过使用expect脚本,自动输入密码,来一个个传文件,但是感觉太慢了,主要还是想利用pssh的批量执行功能,但它前提是配置免密登录,所以脚本的主要功能是配置免密登陆,再之后的批量传输文件就很简单了

遇到的问题:

1.除了使用expect脚本和手动输入,如何使用命令生成公钥

  ssh-keygen -f "/root/.ssh/id_rsa" -N ""

2.sshpass自动登陆时,面对口令登陆除了使用expect脚本和手动输入,还有什么解决办法

  ssh取消口令认证

3.ssh免密登陆失败

  ssh原理

  ssh免密登陆失败原因

4.pssh的使用时,存放ip的文件内容格式为uesr@ip,这样登陆test和root用户需要2个配置文件,如何只需要一个配置文件

  使用-l参数指定用户,这样文件内容为ip即可

目录结构:

           

ssh.sh  test免密登陆+root免密登陆+发送文件
sshd_config.sh 修改ssh配置
ip.log       SUT  ip列表
SUT_File 目录,将其中文件发送到SUT

 代码实现:

   ssh.sh:

#!/bin/bash

#清空配置
rm -rf /root/.ssh/*

echo "---------------------------------------------"
echo "--------------------clear--------------------"
echo "---------------------------------------------"
sleep 1

#生成密钥
ssh-keygen -f "/root/.ssh/id_rsa" -N "" >/dev/null 2>&1

echo "--------------------file---------------------"
echo "---------------------------------------------"
dir=`ls  ~/.ssh/`
echo $dir


#test用户免密登陆
count=`cat ip.log |wc -l`

for((i=1;i<=$count;i++));
do

ip=`cat ip.log|awk 'NR=='$i' {print $1}'`

sshpass -p 111111 ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no test@$ip  >/dev/null 2>&1

done

#测试test用户是否登陆成功
echo "-----------------test login------------------"
echo "---------------------------------------------"
pssh -h ip.log -l test -i whoami


#更改/etc/ssh/sshd_config配置
echo "-------------change sshd_config--------------"
echo "---------------------------------------------"
pscp.pssh -h ip.log -l test sshd_config.sh /home/test/

pssh -h ip.log -l test "echo 111111 | sudo -S /home/test/sshd_config.sh " 


#重启sshd服务
echo "----------------restart sshd-----------------"
echo "---------------------------------------------"
pssh -h ip.log -l test "echo 111111 | sudo -S systemctl restart sshd" 

sleep 3

#root用户免密登陆&&#测试root用户是否登陆成功

for((j=1;j<=$count;j++));
do

ip2=`cat ip.log|awk 'NR=='$j' {print $1}'`

sshpass -p 111111 ssh-copy-id -i ~/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@$ip2  >/dev/null 2>&1

done


echo "-----------------root login------------------"
echo "---------------------------------------------"

pssh -h ip.log -l root -i whoami 

#发送文件
echo "-----------------send file-------------------"
echo "---------------------------------------------"

pscp.pssh -h ip.log -l root  -r SUT_File/* / 
pssh -h ip.log -l root -i "chmod 777 /* " >/dev/null 2>&1

  sshd_config.sh:

#!/bin/bash

if ( ! grep PermitRootLogin /etc/ssh/sshd_config | grep yes );
then echo "PermitRootLogin yes" >> /etc/ssh/sshd_config ;
fi

if ( ! grep StrictModes   /etc/ssh/sshd_config | grep no );
then echo "StrictModes no" >> /etc/ssh/sshd_config ;
fi

ip.log:SUT的ip列表

192.168.159.138
192.168.159.140
192.168.159.139

注意事项:

1.SUT需要设置密码。使用sudo passwd命令

2.ssh基于口令登陆(输入yes/no)可以使用-o StrictHostKeyChecking=no参数进行屏蔽

3.使用ssh-keygen生成密钥时,别乱改名字,不然容易出问题

4.报错:Too many authentication failures Authentication failed.

   解决:服务器A输入ssh-add -D

5.ssh登陆失败时,注意 /etc/ssh/sshd_config文件,检查如下内容:

   1.将PermitRootLogin no改为yes

   2.StrictModes yes改成StrictModes no

6.我的SUT上普通用户均为test,密码均为111111,这点需要自行修改

参考资料:

ssh原理

ssh免密登陆失败原因

ssh取消口令认证

 

 

 

对了,还可以把两个结合起来,使用sshpass -p passwd pssh -A -h ip_file -l  user  -i cmd,可以不用免密,搭配sshpass的免密即可,不过我需要操作root用户,因此需要修改配置文件,发送公钥的时候用pssh的话感觉还是麻烦点,所以还是用了for循环。

另附上这里的参考资料:

pssh系列命令详解

你可能感兴趣的:(通过pssh和sshpass工具实现一对多的免密登陆+批量操作)