测试中经常会遇到批量创建用户的案例
需求:批量创建10个系统帐号hwb01-hwb10并设置密码(密码为随机数,要求字符和数字等混合)
- 脚本如下:
#!/bin/bash
#############################################################
# File Name: add_user.sh
#############################################################
Passwd_File=/tmp/`uuidgen`.txt
>$Passwd_File
chmod 400 $Passwd_File
for i in hwb{01..10}
do
userdel -r "$i" &>/dev/null
id $i &>/dev/null
if [ $? -ne 0 ]
then
useradd $i
PassWd=`uuidgen`
echo $PassWd |passwd --stdin $i &>/dev/null
echo "用户名:$i 密码:$PassWd" >>$Passwd_File
echo -e "\033[32m $i 用户创建成功!\033[0m"
else
echo "$i 用户已存在"
fi
if [ "$i" == "hwb10" ]
then
echo "用户密码请查看文件 $Passwd_File"
fi
done
-
执行结果如下:
ps:批量创建用户并设置随机密码(不使用shell循环)
--方法一
echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& echo \1 >>/tmp/passwd.txt \&\& echo $RANDOM |md5sum |cut -c 1-5>>/tmp/passwd.txt \&\& echo `tail -1 /tmp/passwd.txt`|passwd --stdin \1#g'|bash
--方法二
echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo $pass |passwd --stdin \1 \&\& echo \1 $pass>>/tmp/user_passwd.txt#g'|bash
--方法三
echo user{1..20}|xargs -n1|sed -r 's#(.*)#useradd \1 \&\& pass=`echo $RANDOM |md5sum |cut -c 1-5` \&\& echo \1:$pass>>/tmp/user_passwd.txt \&\& chpasswd</tmp/user_passwd.txt#g'|bash
筛选符合长度的单词的案例
需求:利用bash for循环打印下面这句话中字母数不大于6的单词
- 脚本如下:
#!/bin/bash
#############################################################
# File Name: changdu.sh
#############################################################
Word='I am hwb Welcome to my toutiao https://mp.toutiao.com/profile_v3/index'
for i in $Word
do
#[ ${#i} -le 6 ] && echo $i #子串方法
a=`echo $i |wc -L`
if [ $a -le 6 ]
then
echo $i
fi
done
-
执行结果如下:
shell脚本之自动登录
场景说明:
平时在控制台输入指令如:sudo、ssh、ftp或者修改admin权限的文件时候都会要求输入password,但是在she'll脚本运行过程中该如何交互实现自动输入密码呢?
- 一下总结三种方式解决
- 重定向
用重定向方法实现交互的前提是指令需要有参数来指定密码输入方式,如ftp就有-i参数来指定使用标准输入来输入密码 .
shell用重定向作为标准输入的用法是:cmd<<delimiter ,shell 会将分界符delimiter之后直到下一个同样的分界符之前的内容作为输入。
实现ftp自动登录并运行ls指令的用法如下:其中root为用户名,123456为密码
ftp -i -n 192.168.1.90 <<EOF
user root 123456
ls
EOF
- 管道
跟重定向一样,指令同样要有参数来指定密码输入方式,如sudo的-S参数,passwd的-stdin参数
所以实现sudo自动输入密码的脚本如下:其中123456为密码
echo '123456' | sudo -S cp file1 /etc/hosts
实现自动修改密码的脚本写法如下:
echo 'password' | passwd -stdin username
- expect
上面介绍的两种方法前提条件是指令有参数来设定密码输入方式,像ssh指令就没有这样的参数,第三种交互方式就派上用场了。
expect就是用来做交互用的,基本任何交互登录的场合都能使用,但是需要安装expect包
yum install expect
用法如下:
#!/bin/expect
set timeout 30
spawn git pull
expect "Username for 'https://e.coding.net':"
send "xxxx@qq.com\n"
expect "Password for 'https://xxxx@qq.com@e.coding.net':"
send "123456\r"
interact
注意:expect跟bash类似,使用时要先登录到expect,所以首行要指定使用expect
在运行脚本时候要expect file,不能sh file了
解释:
上面语句第一句是设定超时时间为30s,spawn是expect的语句,执行命令前都要加这句
expect "password:"这句意思是交互获取是否返回password:关键字,因为在执行ssh时会返回输入password的提示:root@192.168.1.90's password:
send就是将密码123456发送过去
interact代表执行完留在远程控制台,不加这句执行完后返回本地控制台
- ssh脚本集成expect 语法,用于jenkins远程执行脚本,自动git更新源码输入账号密码(不通过jenkins配置)
[root@192 frontend-ui]# cat start.sh
# ! /bin/bash
PASS=xxx@qq.com
GIT=123456
expect << EOF
spawn git pull
expect "Username for 'https://e.coding.net':"
send "${PASS}\n"
expect "Password for 'https://xxx@qq.com@e.coding.net':"
send "${GIT}\r"
expect eof;
EOF
source /etc/profile
cd /opt/webapps/ship/frontend-ui
pwd
npm run build
cd /usr/local/nginx/html
rm -rf dist
cd /opt/webapps/ship/frontend-ui
mv dist/ /usr/local/nginx/html
BUILD_ID=dontKillMe
echo "data-view-ui : success"
- 交互式命令
# ! /bin/bash
PASS=xxx
GIT=123456
expect << EOF
spawn git pull
expect "Username for 'https://e.coding.net':"
send "${PASS}\n"
expect "Password for 'https://xxx@qq.com@e.coding.net':"
send "${GIT}\r"
expect eof;
EOF
source /etc/profile
cd /opt/webapps/ship/frontend-ui
pwd
npm run build
cd /usr/local/nginx/html
rm -rf dist
cd /opt/webapps/ship/frontend-ui
mv dist/ /usr/local/nginx/html
BUILD_ID=dontKillMe
echo "data-view-ui : success"