shell 實練(3)-賬戶建立/新增到組/for迴圈報錯解決
1、設計一個shell程式,新增一個新組為class1,然後新增屬於這個組的30個使用者,使用者名稱的形式為stdx,其中xx從01到30。
首先分析問題,程式執行應該這樣:
新增一個新組; groupadd class1
新建30個使用者,當然要用到迴圈; adduser stdXX (需要立即設定密碼及資訊) 或 useradd stdXX (你不需要立即設定密碼)
或者使用:echo XXXX (密碼) | passwd --stdin 使用者名稱 通過管道實現使用者輸入密碼的互動
再將新建的使用者新增到新組; usermod -G class1 stdXX
或直接 useradd stdXX -g class1
附code:
1 #!/bin/bash
2
3 groupadd class1
4 for (( i=1;i<10;i++ )) 考慮到30個使用者太多,所以取9個
5 do
6 useradd std$i -g class1
7 echo "this time i= $i"
8 done
9
檢視結果:
Loong:/home/yee# vim /etc/group
61 ftp:x:120:
62 class1:x:1001: 檔案中增加了組
Loong:/home/yee/shell# sh -x practise1.sh 執行過程
+ groupadd class1
+ (( i=1 ))
+ (( i<10 ))
+ useradd std1 -g class1
+ echo 'this time i= 1'
this time i= 1
+ (( i++ ))
+ (( i<10 ))
+ useradd std2 -g class1
+ echo 'this time i= 2'
this time i= 2
.............
+ (( i++ ))
+ (( i<10 ))
+ useradd std9 -g class1
+ echo 'this time i= 9'
this time i= 9
+ (( i++ ))
+ (( i<10 ))
Loong:/home/yee/shell# vim /etc/passwd
30 ftp:x:110:120:ftp daemon,,,:/srv/ftp:/bin/false
31 std1:x:1001:1001::/home/std1:/bin/sh
檔案中增加了9個使用者
32 std2:x:1002:1001::/home/std2:/bin/sh
33 std3:x:1003:1001::/home/std3:/bin/sh
34 std4:x:1004:1001::/home/std4:/bin/sh
35 std5:x:1005:1001::/home/std5:/bin/sh
36 std6:x:1006:1001::/home/std6:/bin/sh
37 std7:x:1007:1001::/home/std7:/bin/sh
38 std8:x:1008:1001::/home/std8:/bin/sh
39 std9:x:1009:1001::/home/std9:/bin/sh
編寫中遇到的問題:
編寫中寫了很多個迴圈的方式,但是總是報錯,最後才發現一個問題是這樣的,
錯誤為Syntax error: Bad for loop variable
Loong:/home/yee/shell# sh -x practise1.sh
+ groupadd class1
practise1.sh: 4: Syntax error: Bad for loop variable
解決辦法:sudo dpkg-reconfigure dash
在選擇項中選No
Loong:/home# sudo dpkg-reconfigure dash
[: 88: false: unexpected operator
正在刪除 “diversion of /bin/sh to /bin/sh.distrib by dash”
正在刪除 “diversion of /usr/share/man/man1/sh.1.gz to /usr/share/man/man1/sh.distrib.1.gz by dash”
從 ubuntu 6.10 開始,ubuntu 就將先前預設的bash shell 更換成了dash shell;其表現為/bin/sh 連結到了/bin/dash而不是傳統的/bin/bash。
ubuntu edgy是第一個將dash作為預設shell來發行的版本,這似乎是受了debian的影響。wiki裡面有官方的解釋,https://wiki.ubuntu.com/DashAsBinSh,主要原因是dash更小,執行更快,還與POSIX相容
網路答案:
#!/bin/sh
i=1
groupadd class1
while [ $i -le 30 ]
do
if [ $i -le 9 ] ;then
USERNAME=stu0${i}
else
USERNAME=stu${i}
fi
useradd $USERNAME
mkdir /home/$USERNAME 這個在自己的code中沒有做
chown -R $USERNAME /home/$USERNAME
chgrp -R class1 /home/$USERNAME
i=$(($i+1))
done
相關賬戶操作指南:
1、建使用者:
adduser phpq //新建phpq使用者passwd phpq //給phpq使用者設定密碼
2、建工作組 groupadd test //新建test工作組
3、新建使用者同時增加工作組 useradd -g test phpq //新建phpq使用者並增加到test工作組
注::-g 所屬組 -d 家目錄 -s 所用的SHELL
另附:useradd
1.作用
useradd命令用來建立使用者帳號和建立使用者的起始目錄,使用許可權是超級使用者。
2.格式
useradd [-d home] [-s shell] [-c comment] [-m [-k template]] [-f inactive] [-e expire ] [-p passwd] [-r] name
3.主要引數
-c:加上備註文字,備註文字儲存在passwd的備註欄中。
-d:指定使用者登入時的啟始目錄。
-D:變更預設值。
-e:指定賬號的有效期限,預設表示永久有效。
-f:指定在密碼過期後多少天即關閉該賬號。
-g:指定使用者所屬的群組。
-G:指定使用者所屬的附加群組。
-m:自動建立使用者的登入目錄。
-M:不要自動建立使用者的登入目錄。
-n:取消建立以使用者名稱稱為名的群組。
-r:建立系統賬號。
-s:指定使用者登入後所使用的shell。
-u:指定使用者ID號。
4.說明
useradd可用來建立使用者賬號,它和adduser命令是相同的。賬號建好之後,再用passwd設定賬號的密碼。使用useradd命令所建立的賬號,實際上是儲存在/etc/passwd文字檔案中。
5.應用例項
建立一個新使用者賬戶,並設定ID:
#useradd caojh -u 544
需要說明的是,設定ID值時儘量要大於500,以免衝突。因為Linux安裝後會建立一些特殊使用者,一般0到499之間的值留給bin、mail這樣的系統賬號。
4、給已有的使用者增加工作組 usermod -G groupname username
或者:gpasswd -a user group
5、臨時關閉:在/etc/shadow檔案中屬於該使用者的行的第二個欄位(密碼)前面加上*就可以了。想恢復該使用者,去掉*即可。
或者使用如下命令關閉使用者賬號: passwd peter –l
重新釋放: passwd peter –u
6、永久性刪除使用者賬號 userdel peter
groupdel peter
usermod –G peter peter (強制刪除該使用者的主目錄和主目錄下的所有檔案和子目錄)
7、從組中刪除使用者
編輯/etc/group 找到GROUP1那一行,刪除 A
或者用命令 gpasswd -d A GROUP
8、顯示使用者資訊id user
cat /etc/passwd
9、檢視當前使用者組
id -gn
id -a 使用者名稱
/etc/group檔案包含所有組
/etc/group檔案是使用者組的配置檔案,內容包括使用者和使用者組,並且能顯示出使用者是歸屬哪個使用者組或哪幾個使用者組,因為一個使用者可以歸屬一個或多個不同的使用者組;同一使用者組的使用者之間具有相似的特徵。比如我們把某一使用者加入到root使用者組,那麼這個使用者就可以瀏覽root使用者家目錄的檔案,如果root使用者把某個檔案的讀寫執行許可權開放,root使用者組的所有使用者都可以修改此檔案,如果是可執行的檔案(比如指令碼),root使用者組的使用者也是可以執行的;
使用者組的特性在系統管理中為系統管理員提供了極大的方便,但安全性也是值得關注的,如某個使用者下有對系統管理有最重要的內容,最好讓使用者擁有獨立的使用者組,或者是把使用者下的檔案的許可權設定為完全私有;另外root使用者組一般不要輕易把普通使用者加入進去,
/etc/group的內容包括使用者組(Group)、使用者組口令、GID及該使用者組所包含的使用者(User),每個使用者組一條記錄;格式如下:group_name:passwd:GID:user_list
/etc/shadow和/etc/passwd系統存在的所有使用者名稱