环境:centos7
一.安装ansible
yum install -y epel-release yum install -y ansible
二.命令
while read -r line; do ip=$(echo "$line" | awk '{print $1}'); passwd=$(echo "$line" | awk '{print $2}'); ansible $ip -m shell -a "echo $passwd| passwd --stdin root"; done < test.txt cat test.txt 192.168.70.61 654321 192.168.70.62 1qaz@WSX 192.168.70.63 !QAZ@WSX
命令解释:
-
while read -r line; do :循环读取test.txt 文件中的每一行,并将其保存到$line 变量中。 -
ip=$(echo "$line" | awk '{print $1}') :使用awk 命令从$line 变量中提取出第一个字段,即远程主机的 IP 地址,并将其保存到$ip 变量中。 -
passwd=$(echo "$line" | awk '{print $2}') :同上,从$line 变量中提取出第二个字段,即要设置的新密码,并将其保存到$passwd 变量中。 -
ansible $ip -m shell -a "echo $passwd| passwd --stdin root" :使用 Ansible 工具连接远程主机$ip ,并执行echo $passwd| passwd --stdin root 命令,将$passwd 变量中保存的新密码设置为远程主机的 root 用户密码。 -
done < test.txt :完成循环,结束脚本
三.可以优化的地方
70.61可以跳转到61和63(单向的免密)
解释免密的配置文件
[root@rabbit1-61 .ssh]# ls authorized_keys id_rsa id_rsa.pub known_hosts
前提了解:所谓的免密,从单方向连接来说(从A主机ssh连接到B主机),本地主机A使用ssh-keygen生成公私钥,使用ssh-copy-id B时,也就是将A主机的公钥传递给B,当A ssh到B主机过程时,那么A就会带着自己的私钥去配对之前传递到B主机上面的A的公钥,如果公私钥配对成功,就能够ssh成功。
authorized_keys:存放的是其它远程主机的公钥(用于配对远程主机的私钥)
id_rsa:存放的是本主机的私钥
id_rsa.pub:存放的是本主机的公钥
know_hosts:文件记录了你连接过的远程主机的公钥信息。如果远程主机的公钥发生变化,SSH 客户端会给出警告。
四.脚本
#!/bin/bash function find_valid_ips() { echo "Finding IPs with passwordless SSH access..." while read -r line; do ip=$(echo "$line" | awk '{print $1}') passwd=$(echo "$line" | awk '{print $2}') # Test passwordless SSH access using SSH public key authentication if ssh -o BatchMode=yes -o ConnectTimeout=2 $ip "echo 'Connection successful!'" &>/dev/null; then echo "$ip" >> valid_ip.txt echo "可以修改密码的ip: $ip" else echo "Invalid IP: $ip" fi done < test.txt echo "Valid IPs have been written to valid_ip.txt." } function modify_passwords() { echo "Do you want to modify passwords for valid IPs? (y/n)" read user_input if [[ "$user_input" =~ ^[Yy](es)?$ ]]; then echo "Modifying passwords for valid IPs..." while read -r ip; do passwd=$(grep "$ip" test.txt | awk '{print $2}') # Modify password using ansible ansible $ip -m shell -a "echo $passwd | passwd --stdin root" done < valid_ip.txt echo "Password modification complete." else echo "Exiting script without modifying passwords." fi } >valid_ip.txt # 筛选出有效的ip到valid_ip.txt find_valid_ips # 修改密码 modify_passwords
脚本注意点:
1.test.txt中存放的是ip和密码
[root@rabbit1-61 ansible]# cat test.txt 192.168.70.62 1qaz@WSX 192.168.70.63 !QAZ@WSX
2.脚本需要安装ansible,使用ansible时,需要在/etc/ansible,目录下的hosts文件中,添加ip。例如:
[modify] 192.168.70.62