root@devil-PC:~# cat read_list
IP=10.0.0.1 Port=22 User=root Password=123456
IP=10.0.0.2 Port=22 User=root Password=123456
IP=10.0.0.3 Port=22 User=root Password=123456
IP=10.0.0.4 Port=22 User=root Password=123456
1、使用read命令按行读取
#采用此种方法可以按行写入文本文件再source一下即可使用其中的变量了,执行第二行的时候直接清空前一行的内容即可,比如echo "test words" > test_file
#方法1
i=0
while read read_line; do
let i=i+1
echo "这是第${i}行数据:"${read_line}
done < read_list
#执行结果
root@devil-PC:~# while read read_line; do
> let i=i+1
> echo "这是第${i}行数据:"${read_line}
> done < read_list
这是第1行数据:IP=10.0.0.1 Port=22 User=root Password=123456
这是第2行数据:IP=10.0.0.2 Port=22 User=root Password=123456
这是第3行数据:IP=10.0.0.3 Port=22 User=root Password=123456
这是第4行数据:IP=10.0.0.4 Port=22 User=root Password=123456
#方法2
i=0
cat read_list | while read read_line; do
let i=i+1
echo "这是第${i}行数据:"${read_line}
done
#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# cat read_list | while read read_line; do
> let i=i+1
> echo "这是第${i}行数据:"${read_line}
> done
这是第1行数据:IP=10.0.0.1 Port=22 User=root Password=123456
这是第2行数据:IP=10.0.0.2 Port=22 User=root Password=123456
这是第3行数据:IP=10.0.0.3 Port=22 User=root Password=123456
这是第4行数据:IP=10.0.0.4 Port=22 User=root Password=123456
2、使用for按行读取数据
#for循环读取数据的时候空格,换行符等也是会被识别成下一行数据,所以需要设置IFS
i=0
IFS_old=${IFS}
IFS=$'\n'
for read_line in $(cat read_list); do
let i=i+1
echo "这是第${i}行数据:${read_line}"
done
IFS=${IFS_old}
#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# IFS_old=${IFS}
root@devil-PC:~# IFS=$'\n'
root@devil-PC:~# for read_line in $(cat read_list); do
> let i=i+1
> echo "这是第${i}行数据:${read_line}"
> done
这是第1行数据:IP=10.0.0.1 Port=22 User=root Password=123456
这是第2行数据:IP=10.0.0.2 Port=22 User=root Password=123456
这是第3行数据:IP=10.0.0.3 Port=22 User=root Password=123456
这是第4行数据:IP=10.0.0.4 Port=22 User=root Password=123456
root@devil-PC:~# IFS=${IFS_old}
3、使用read读取变量
#采用此种方法时,读入的文件是以空格为单位,然后依次读入对应的值并依次赋值给read后面的变量
#也就是说,此种方法可以直接将读入的文件中的内容编写成10.0.0.1 22 root 123456这种形式,这样就能把对应的内容赋值给对应的变量了
#方法1
i=0
cat read_list | while read IP Port User Password; do
let i=i+1
echo "这是第${i}行的第1个变量" ${IP}
echo "这是第${i}行的第2个变量" ${Port}
echo "这是第${i}行的第3个变量" ${User}
echo "这是第${i}行的第4个变量" ${Password}
echo -e "\n"
done
#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# cat read_list | while read IP Port User Password; do
> let i=i+1
> echo "这是第${i}行的第1个变量" ${IP}
> echo "这是第${i}行的第2个变量" ${Port}
> echo "这是第${i}行的第3个变量" ${User}
> echo "这是第${i}行的第4个变量" ${Password}
> echo -e "\n"
> done
这是第1行的第1个变量 IP=10.0.0.1
这是第1行的第2个变量 Port=22
这是第1行的第3个变量 User=root
这是第1行的第4个变量 Password=123456
这是第2行的第1个变量 IP=10.0.0.2
这是第2行的第2个变量 Port=22
这是第2行的第3个变量 User=root
这是第2行的第4个变量 Password=123456
这是第3行的第1个变量 IP=10.0.0.3
这是第3行的第2个变量 Port=22
这是第3行的第3个变量 User=root
这是第3行的第4个变量 Password=123456
这是第4行的第1个变量 IP=10.0.0.4
这是第4行的第2个变量 Port=22
这是第4行的第3个变量 User=root
这是第4行的第4个变量 Password=123456
#方法2
while read IP Port User Password; do
let i=i+1
echo "这是第${i}行的第1个变量" ${IP}
echo "这是第${i}行的第2个变量" ${Port}
echo "这是第${i}行的第3个变量" ${User}
echo "这是第${i}行的第4个变量" ${Password}
echo -e "\n"
done < read_list
#执行结果
root@devil-PC:~# i=0
root@devil-PC:~# while read IP Port User Password; do
> let i=i+1
> echo "这是第${i}行的第1个变量" ${IP}
> echo "这是第${i}行的第2个变量" ${Port}
> echo "这是第${i}行的第3个变量" ${User}
> echo "这是第${i}行的第4个变量" ${Password}
> echo -e "\n"
> done < read_list
这是第1行的第1个变量 IP=10.0.0.1
这是第1行的第2个变量 Port=22
这是第1行的第3个变量 User=root
这是第1行的第4个变量 Password=123456
这是第2行的第1个变量 IP=10.0.0.2
这是第2行的第2个变量 Port=22
这是第2行的第3个变量 User=root
这是第2行的第4个变量 Password=123456
这是第3行的第1个变量 IP=10.0.0.3
这是第3行的第2个变量 Port=22
这是第3行的第3个变量 User=root
这是第3行的第4个变量 Password=123456
这是第4行的第1个变量 IP=10.0.0.4
这是第4行的第2个变量 Port=22
这是第4行的第3个变量 User=root
这是第4行的第4个变量 Password=123456
4、测试用例
#批量配置免密登录
#!/bin/bash
#set -x
if [ ! -x /usr/bin/sshpass ];then
[ -x /usr/bin/apt ] && sudo apt install sshpass -y
[ -x /usr/bin/yum ] && sudo yum install sshpass -y
fi
function auto_config () {
if [ ! -f server_list ];then
echo "未找到server_list文件,请创建"
echo "格式,按行编写:IP=x.x.x.x Port=xxx User=xxx Password=xxxx"
echo "脚本即将退出"
sleep 3
exit 1
fi
while read server_info
do
echo "${server_info}" > server_info
source server_info
sshpass -p ${Password} ssh-copy-id -p ${Port} -i ~/.ssh/id_rsa.pub ${User}@${IP} -o "StrictHostKeyChecking no" >> /dev/null
done < server_list
}
auto_config
rm -f server_info