批量創建用戶的需求在生產環境中用的不多,但是面試題中經常會看到。
要求:
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判斷。
小建議:加一個判斷用戶是否存在的邏輯,這樣就完美了。