批量建立用戶的需求在生產環境中用的很少,可是面試題中常常會看到。面試
要求:shell
1)批量增長100個用戶bash
2)用戶名爲user_01-user_100ide
3)給全部用戶都設定一個隨機密碼,密碼長度12位,須要包含大小寫字母以及數字ui
4)並把用戶的密碼保存到/data/user_passwd文件中spa
5)這100個用戶同屬於users組對象
知識點一:系統用戶管理字符串
1)增長用戶it
useradd user1
這樣會增長user1這個用戶,若是不指定它所屬組,則會建立和用戶名同名的一個組。要想指定組,那麼該組首先已經存在,增長組的命令是:for循環
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判斷。
小建議:加一個判斷用戶是否存在的邏輯,這樣就完美了。