在一台服务器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 |
#!/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
#!/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
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系列命令详解