GVKun编程网logo

Shell编程面试题4_批量创建Linux用户并设置密码(linux批量创建用户和密码)

16

以上就是给各位分享Shell编程面试题4_批量创建Linux用户并设置密码,其中也会对linux批量创建用户和密码进行解释,同时本文还将给你拓展LinuxShell编程、LinuxShell编程自动化

以上就是给各位分享Shell编程面试题4_批量创建Linux用户并设置密码,其中也会对linux批量创建用户和密码进行解释,同时本文还将给你拓展Linux Shell编程、Linux Shell编程自动化运维实现——Shell循环、Linux Shell编程(3) - Shell 运算、Linux shell脚本 批量创建多个用户等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Shell编程面试题4_批量创建Linux用户并设置密码(linux批量创建用户和密码)

Shell编程面试题4_批量创建Linux用户并设置密码(linux批量创建用户和密码)

老男孩出的Shell编程企业面试题4:


批量创建10个系统帐号oldboy01-oldboy10并设置密码(密码为随机8位字符串)。


我的Shell脚本如下:

#!/bin/bash

for num in 01 02 03 04 05 06 07 08 09 10
do
        username=oldboy$num
        password=`head -c 500 /dev/urandom | md5sum | head -c 8`
        egrep "^$username" /etc/passwd >& /dev/null
        if [ $? -ne 0 ]
        then
                useradd $username
                echo $password | passwd $username --stdin &>/dev/null
                if [ $? -eq 0 ]
                then
                        echo "$username:$password"
                fi
        fi
done

运行结果如下:

[root@CentOS66 shellstudy]# ./creatuser.sh 
oldboy01:d7e86b4e3b
oldboy02:7fbc6033fc
oldboy03:aabd217934
oldboy04:bbe4b5a094
oldboy05:38041b6159
oldboy06:e51d10d669
oldboy07:c292390561
oldboy08:61badd5747
oldboy09:60eed14fda
oldboy10:a5d5a6c1f6

Linux Shell编程

Linux Shell编程

1、sed

 

2、awk

 

3、grep

 

4、shell变量

 

 

Linux Shell编程自动化运维实现——Shell循环

Linux Shell编程自动化运维实现——Shell循环

shell循环

for
语法结构
for    变量名      [ in 取值列表 ]
do
循环体
done

编写常规网络测试脚本

#!/bin/bash
#ping
ip=192.168.100.10
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ] ;then
	echo "$ip" |tee -a ip.txt
fi

因为测试对象多,所以使用循环。

#!/bin/bash
#ping

for i  in {
   2..254}
do

ip=192.168.100.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ] ;then
	echo "$ip" |tee -a ip.txt
fi

done

优化脚本(后台执行,清空脚本,wait间隔)

#!/bin/bash
#ping
>ip.txt		##清空记录文本

for i  in {
   2..254}
do
{
   
ip=192.168.100.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ] ;then
	echo "$ip" |tee -a ip.txt
fi
}&	##后台执行
done
wait	##等待前一个程序执行完毕。在执行下一个命令。
echo "finishi...."


通过用户列表文件创建用户
#!/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实现批量主机root密码的修改
要求1: 已经完成秘钥登录配置(ssh-keygen)
要求2:定义主机地址列表
要求3:并了解远程修改密码的方法

邀请用户输入新密码

#!/bin/bash
read -p "请用户输入新密码: "  password
#循环调用IP地址
for i in $(cat ip.txt)
do
{
   
#测试IP是否在线
ping -c1 -W1 $i &> /dev/null
#在线IP进行修改
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 >> meigai.txt
fi
} &
done
  • while until 循环次数不[一定]是固定的
  • while 语句结构(死循环/逐行处理文件)
while 条件测试
do
循环体
done
当条件测试成立(条件测试为真),执行循环体
#!/bin/bash
while :
do
let i++
sleep 1
echo $i
done
  • until语法结构
until 条件测试
do
循环体
done
当条件测试成立(条件测试为假视为成立),执行循环体
#!/bin/bash
until  [[ $i -eq 14 ]]
do
let i++
sleep 1
echo $i
done
  • expect

我们通过Shell可以实现简单的控制流功能,但对于需要交互的场合则必须通过人工操作,有时候我们可能会需要实现和交互程序如ssh服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

yum install     -y expect tcl tclx tcl-devel        安装

通过expect解决ssh交互问题

通过expect编写脚本

#!/usr/bin/expect
spawn ssh root@192.168.0.111

expect {
   
        "yes/no" {
    send "yes\r";exp_continue }
        "password:" {
    send "666666\r" };
}
interact

登录验证免交互

expect 期望哪些内容
password 就send发送 centos
yes/no 就send发送 yes ,\r 表示回车
interact 允许用户交互
spawn expect 内部命令,启动一个shell程序。
exp_continue,跳过循环,就继续下一条语句。

expect例子:公钥推送
准备工作:安装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
cat  ip.txt 观察在线主机

通过expect进行交互

#!/bin/bash
#创建一个IP地址文件。
>ip.txt
#使用for循环ping测试主机是否在线。
for i in {
   2..254}
do
        {
   
#请注意环境的IP地址,可能与示例中不同。
        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" }
}
#!/bin/bash
#创建一个IP地址文件。
>ip.txt
#检测expect是否安装,检测公钥是否创建。
rpm -q expect &> /dev/null
if [ $? -ne 0 ] ;then
        yum install -y expect
fi
if [ ! -f ~/.ssh/id_rsa ];then
        ssh-keygen -P "" -f ~/.ssh/id_rsa
fi
#使用for循环ping测试主机是否在线。之前插入安装和准备秘钥。

Linux Shell编程(3) - Shell 运算

Linux Shell编程(3) - Shell 运算

一、declare 命令

shell 变量是弱类型,且默认都是字符串型
declare 命令可以给变量设定或取消类型

1. 语法

declare [-/+][选项] [变量名]

2. 选项

-:给变量设定类型属性
+:取消变量的类型属性

-a:将变量声明为数组类型(array)
-i:将变量声明为整数类型(integer)

-x:将变量声明为环境变量
-r:将变量声明为证只读变量

-p:显示指定变量的被声明的类型

3. 把变量声明为数值型

declare -i [变量名]
[root~]# a=1
[root~]# b=2

[root~]# declare -i c=$a+$b
[root~]# echo $c
3

[root~]# declare -p c
declare -i c="3"

4. 声明数组变量

定义数组

数组名[n]=值

declare -a 数组名[n]=值

注意,n只能是数字

查看数组

  • ${数组名}:查看数组第一个元素,即array[0]的值
  • ${数组名[n]}:n为数字,查看数组指定下标的值
  • ${数组名[*]}:查看数组中所有的值

删除数组

  • 删除数组指定下标的值

unset 数组名[n]

  • 删除整个数组

unset 数组名

实例

  • 定义数组下标[2]和下标[3],没有定义下标[0]
[root~]# array[2]=2
[root~]# declare -a array[3]=3
  • 查看数组第一个元素,即array[0]的值,因为没有,所以输出为空
[root~]# echo ${array}
  • 查看数组下标[3]的值
[root~]# echo ${array[3]}
3
  • 查看数组中所有的值
[root~]# echo ${array[*]}
2 3
  • 定义数组下标[0]的值,并输出
[root~]# array[0]=0
[root~]# echo ${array}
0
[root~]# echo ${array[*]}
0 2 3
  • 删除数组下标[3]
[root~]# unset array[3]
[root~]# echo ${array[*]}
0 2
  • 删除整个数组
[root~]# unset array
[root~]# echo ${array[*]}

5. 声明环境变量

export 变量名=变量值

declare -x 变量名=变量值

6. 声明变量只读属性

具有只读属性的变量不能修改,不能删除,甚至不能取消只读属性!

实例

  • 声明变量只读属性
[root~]# declare -r var="I am a readonly variable"
  • 不能修改
[root~]# var=change
-bash: var: readonly variable
  • 不能删除
[root~]# unset var
-bash: unset: var: cannot unset: readonly variable
  • 不能取消只读属性
[root~]# declare +r var
-bash: declare: var: readonly variable

7. 查询变量的属性

查询所有变量的属性

declare -p

查询指定变量的属性

declare -p [变量名]

实例

[root~]# declare -p
declare -- BASH="/bin/bash"
...省略...
declare -ir UID="0"
declare -x USER="root"
declare -x USERNAME="root"

[root~]# declare -p BASH
declare -- BASH="/bin/bash"

[root~]# declare -p PATH
declare -x PATH="/sbin:/bin:/usr/sbin:/usr/bin"

二、数值运算的方法

1. declare -i sum=$num1+$num2

[root~]# num1=1
[root~]# num2=2
[root~]# declare -i sum=$num1+$num2
[root~]# echo $sum
3

2. expr

expr 用法

sum=$(expr $num1 + $num2)
[root~]# num1=1
[root~]# num2=2
[root~]# sum=$(expr $num1 + $num2)
[root~]# echo $sum
3
  • expr 运算符中间必须有空格,否则:
[root~]# sum=$(expr $num1+$num2)
[root~]# echo $sum
1+2

3. let

let 用法

let [变量名]=[运算式]
[root~]# let sum=$num1+$num2
[root~]# echo $sum
3
[root~]# let num=(1+2)*3/4+5
[root~]# echo $num
7

4. $((运算式))$[运算式] (常用)

$((运算式))

[root~]# a=1
[root~]# b=2
[root~]# c=$(($a+$b))
[root~]# echo $c
3
  • 运算符中间也可以加空格
[root~]# c=$(( $a + $b ))
[root~]# echo $c
3

$[运算式]

[root~]# c=$[$a+$b]
[root~]# echo $c
3
  • 运算符中间也可以加空格
[root~]# c=$[ $a + $b ]
[root~]# echo $c
3

5. 运算符优先级

运算符优先级从高到低排序

运算符 说明
- , + 单目负,单目正
! , ~ 逻辑非,按位取反或补码
* , /, % 乘,除,取余
+ , - 加,减
<< , >> 按位左移,按位右移
< , > , <= , >= 小于,大于,小于等于,大于等于
== , != 等于,不等于
& 按位与
^ 按位异或
| 按位或
&& 逻辑与
|| 逻辑或
= , += , -= , *= , /= , %= ,
&= , ^= , |= , <<= , >>=
赋值、运算且赋值
优先级相同的,从左到右运算。
有小括号的,先算小括号里面的。

实例

  • 加。减、乘、除、取余、小括号
[root~]# a=$(( 4 + 5 * 3 / 2 ))
[root~]# echo $a
11
[root~]# b=$(( (4 + 5) * 3 / 2 ))
[root~]# echo $b
13
[root~]# c=$(( (4 + 5) * 3 % 5 ))
[root~]# echo $c
2
[root~]# d=$(( (4 + 5) * 3 / (2 + 1) ))
[root~]# echo $d
9
  • 按位与
[root~]# e=$(( 1 & 0 ))
[root~]# echo $e
0
  • 按位或
[root~]# f=$(( 1 | 0 ))
[root~]# echo $f
1
  • 按位异或
[root~]# g=$(( 1 ^ 2 ))
[root~]# echo $g
3

三、变量测试

变量测试一般在脚本优化时使用。

格式复杂多样,语法简单。

1. 变量测试表

图片描述

2. 实例

以变量测试表第一行 {x=${y-n}} 为例

  • 变量y没有设置时,x=n
[root~]# unset y
[root~]# x=${y-1}
[root~]# echo $x
1
  • 变量y为空值时,x=空值
[root~]# y=''''
[root~]# x=${y-1}
[root~]# echo $x
  • 变量y有值时,x=$y
[root~]# y=2
[root~]# x=${y-1}
[root~]# echo $x
2

Linux shell脚本 批量创建多个用户

Linux shell脚本 批量创建多个用户

Linux shell脚本 批量创建多个用户

 

 

 

1 #!/bin/bash
2 groupadd charlesgroup
3 for username in charles1 charles2 charles3
4 do
5         useradd -G charlesgroup $username
6         echo "baitang" | passwd --stdin $username
7 done

 

如有问题,欢迎纠正!!!

如有转载,请标明源处:https://www.cnblogs.com/Charles-Yuan/p/9847053.html

 

我们今天的关于Shell编程面试题4_批量创建Linux用户并设置密码linux批量创建用户和密码的分享已经告一段落,感谢您的关注,如果您想了解更多关于Linux Shell编程、Linux Shell编程自动化运维实现——Shell循环、Linux Shell编程(3) - Shell 运算、Linux shell脚本 批量创建多个用户的相关信息,请在本站查询。

本文标签: