内容纲要
for
- 语法结构
#!bin/bash
for i in {1..10}
#for i in $(seq 1 10)
#for i in `seq 10`
do
echo "$i"
done
- ping测试主机
#!/bin/bash
>ip.txt
>downip.txt
for i in {2..254}
do
{
ip=192.168.152.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo "$ip" | tee -a ip.txt
else
echo "$ip" >> downip.txt
fi
} &
done
wait
echo "在线主机测试完毕。"
- 通过用户列表文件创建用户
用户可以使用参数的形式,自定义用户名文件。
如果用户没有输入用户名文件,提示用户输入
如果用户输入的不是文件,提示用户更正。
启动循环创建用户
如果用户已经存在,提示存在
如果用户不存在,则创建成功,提示成功
#!/bin/bash
#name
#time
pass=123
#判断脚本是否有参数
if [ $# -eq 0 ] ;then
echo "usage:$0 filename "
exit 1
fi
#判断用户输入的是否是文件
if [ ! -f $1 ];then
echo "error filename"
exit 2
fi
#设置循环,读取文件,创建用户
for user in `cat $1`
do
id $user &> /dev/null
#如果用户不存在,则创建用户,否则提示已经存在。
if [ $? -eq 0 ];then
echo "user $user already exists"
else
useradd $user
echo "$pass" | passwd --stdin $user &> /dev/null
#判断用户是否创建成功,并提示
if [ $? -eq 0 ] ; then
echo "$user is created."
fi
fi
done
- 使用for实现批量
1 邀请用户输入密码
2 循环调用IP地址
3 执行远程修改(ssh 192.168.122.20 “touch ~/ddd.txt”)
4 记录执行结果
#!/bin/bash
read -p "请输入服务器的新密码:" password
for i in $(cat ip.txt)
do
{
ping -c1 -W1 $i &> /dev/null
if [ $? -eq 0 ]
then
ssh $i "echo $password | passwd --stdin root"
if [ $? -eq 0 ]
then
echo $i >> ok.txt
else
echo $i >> fail.txt
fi
else
echo $i >>no.txt
fi
} &
done
while until
while语法结构:
while :
do
let i++
sleep 1
echo $i
done
until语法结构:
#!/bin/bash
until [[ $i -eq 14 ]]
do
let i++
sleep 1
echo $i
done
expect
交互式执行
需求:通过expect解决ssh交互问题
#!/usr/bin/expect
# spawn 启动需要交互的程序
spawn ssh root@192.168.152.133
expect {
"yes/no" {send "yes\r";exp_continue}
"password:" {send "123456"};
}
interact
需求:expect实战:公钥推送
- 通过shell循环判断在线主机
#!/bin/bash
#创建一个IP地址文件。
>ip.txt
#使用for循环ping测试主机是否在线。
for i in {2..254}
do
{
#学员请注意练习环境的IP地址,可能与示例中不同。
ip=192.168.0.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip" >> ip.txt
fi
}&
done
- 通过expect进行交互
#!/bin/bash
#创建一个IP地址文件。
>ip.txt
#使用for循环ping测试主机是否在线。
for i in {2..254}
do
{
ip=192.168.122.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ]
then
echo "$ip" >> ip.txt /usr/bin/expect <<-EOF
set timeout 10
spawn ssh-copy-id $ip
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "centos\r" }
}
expect eof
EOF
fi
}&
done
wait
echo "finishi..."
#!/usr/bin/expect
set timeout 10
spawn ssh-copy-id 192.168.122.152
expect {
"yes/no" { send "yes\r"; exp_continue }
"password:" { send "centos\r" }
}
for一般用于有循环次数的循环中,while和until用于不想让循环退出的循环中