案例三、批量添加多個用戶

批量創建用戶的需求在生產環境中用的不多,但是面試題中經常會看到。

要求:

1)批量增加100個用戶

2)用戶名爲user_01-user_100

3)給所有用戶都設定一個隨機密碼,密碼長度12位,需要包含大小寫字母以及數字

4)並把用戶的密碼保存到/data/user_passwd文件中

5)這100個用戶同屬於users組


知識點一:系統用戶管理

1)增加用戶

useradd user1

這樣會增加user1這個用戶,如果不指定它所屬組,則會創建和用戶名同名的一個組。要想指定組,那麼該組首先已經存在,增加組的命令是:

groupadd grp1

增加用戶的時候再指定組:

useradd -g grp1 user2

除了指定組,還可以指定uid,-u選項:

useradd -u 1100 user3

指定用戶的家目錄:

useradd -d /data/123 user4

指定用戶的shell:

useradd -s /sbin/nologin user5

2)刪除用戶

最簡單的方法:

userdel user5

連家目錄及郵件目錄一起刪除,加上-r選項,如;

userdel -r user5

3)更改用戶屬性

命令是usermod,用法和useradd幾乎一樣,命令的選項及代表的含義都是相同的。如,更改用戶uid:

usermod -u 1109 user3

更改用戶家目錄:

usermod -d /home/user4 user4

更改所屬組:

usermod -g grp2 user2

-G選項,指定用戶的擴展組,可以有多個:

usermod -G grp1,grp2 user1


知識點二:seq命令

seq命令的最簡單用法:

# seq 1 5
1
2
3
4
5

seq可以打印一個序列出來,通常在shell腳本中把它作爲遍歷的對象。如:

# for i in `seq 1 5`; do echo "the number is $i"; done
the number is 1
the number is 2
the number is 3
the number is 4
the number is 5


seq後面有兩位數,第一個是起始數字,第二個是結束數字,規範寫法應該在中間加上步長數值,表示每次增加多少,如果不寫步長,默認就是1,來看下面的例子:

# seq 1 2 10
1
3
5
7
9

也可以寫倒序,上面步長是2,下面步長爲-3:

# seq 10 -3 1
10
7
4
1


另外還有一個常用選項-w,如下:

# seq -w 05 10
05
06
07
08
09
10

本案例中,要求我們增加的用戶名並不是簡單的user1,user2,user3...;user_01,user_02,user_03...;所以在使用for循環遍歷的時候,需要加上-w。


知識點三:隨機字符串

給用戶設置密碼,有一個命令叫做mkpasswd,安裝的Linux默認是沒有這個命令的,需要安裝一個expect軟件包。

直接運行mkpasswd命令會生成一個9位的隨機字符串,包含大小寫字母、數字以及特殊符號,例如:

# mkpasswd
e54aLhaS~

還可以給它增加一些選項,生成自定義的隨機字符串,如:

# mkpasswd -l 12 -c 2 -d 5 -s 0
5jo7zq48Jo1G

-l:指定密碼長度;

-c:指定密碼中小寫字母最少的位數,默認是2位;

-C:指定密碼中大寫字母最少的位數,默認是2位;

-d:指定密碼中數字最少的位數,默認是2位;

-s:指定密碼中特殊字符最少的位數,默認是1位。


知識點四:給用戶設定或修改密碼

系統添加完用戶後,默認用戶是沒有設置密碼的,所以就無法登錄。

給用戶設定密碼的命令是passwd,後面跟用戶名,如果省略掉用戶名就是給用戶自己設定或更改密碼。passwd命令修改密碼需要和用戶交互,如下:


# passwd user1
更改用戶user1的密碼。
新的 密碼:
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經成功更新。

這種形式在shell腳本中是不可取的,因爲沒人爲我們輸入密碼,解決這個問題有2個方案。

1)模擬用戶輸入兩次密碼

echo -e "your-passwd\nyour-passwd\n" |passwd

說明:echo -e可以把\n識別爲回車,這樣就相當於連續輸入了兩次“your-passwd”字符串。

2)使用passwd命令的--stdin選項

echo "your-passwd" |passwd --stdin

--stdin可以從標準輸入讀取令牌(只有根用戶才能進行此操作)。


本案例參考腳本

#!/bin/bash
##批量添加100個用戶,user_01-user_100
##作者:
##日期:
##版本:v0.1

#檢查是否有mkpasswd命令
#如果沒有該命令,需要安裝expect包
if ! which mkpasswd &> /dev/null
then
    echo "沒有mkpasswd命令安裝該命令:"
    yum install -y expect
fi

#判斷/data/user_passwd文件是否存在
#若存在,應該先刪除
[ -f /data/user_passwd ] && rm -f /data/user_passwd

#因爲100是三位數,所以只能遍歷到99
for n in `seq -w 1 99`
do
  pass=`mkpasswd -l 12 -c 5 -d 5 -s 0`

  echo "添加用戶user_$n"
  useradd -g users user_$n

  echo "給用戶user_$n設定密碼"
  echo $pass |passwd --stdin user_$n

#將對應的用戶及密碼存到文件中
  echo "user_$n $pass" >>/data/user_passwd
done

  pass=`mkpasswd -l 12 -c 5 -d 5 -s 0`
  echo "添加用戶user_100"
  useradd -g users user_100
  echo "給用戶user_100設定密碼"
  echo $pass |passwd --stdin user_100
  echo "user_100 $pass" >>/data/user_passwd

說明:

[ -f /data/user_passwd ] && rm -f /data/user_passwd這條命令,相當於:

if [ -f /data/user_passwd ]
then
   rm -f /data/user_passwd
fi

shell腳本中的&&和||,往往替代if判斷。

小建議:加一個判斷用戶是否存在的邏輯,這樣就完美了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章