7.6 passwd:修改用戶密碼
passwd命令可以修改用戶密碼及密碼過期時間等內容,是工作中很常用的命令。普通用戶和超級用戶都可以運行passwd命令,但普通用戶只能更改自身的用戶密碼,超級用戶root則可以設置或修改所有用戶的密碼。
-k 為密碼已經過期的用戶更新有效期
-l 鎖定用戶,被鎖定的用戶將不能登錄。僅root用戶有權使用該選項
-stdin 從標准輸入讀取密碼字符串深
-u 解除對用戶的鎖定。僅root用戶有權使用該選項
-d 刪除用戶的密碼,使密碼為空。僅root用戶有權使用該選項
-e 使用戶密碼立即過期,將在用戶下次登錄時強制要求用戶修改密碼。僅root用戶有權使用該選項
-n 設置修改密碼的最短天數。僅root用戶有權使用該選項
-x 設置修改密碼的最長天數。僅root用戶有權使用該選項
-w 設置用戶在密碼過期前收到警告信息的天數。僅root用戶有權使用該選項
-i 設置密碼過期多少天后禁用賬戶。僅root用戶有權使用該選項
-S 顯示用戶密碼相關的簡單描述。僅root用戶有權使用該選項
除了上述說明,還要強調以下兩點。
root用戶可以修改任何用戶的密碼,普通用戶只能修改自身的密碼。
root用戶修改密碼時,如果不符合系統密碼規則,則給出警告信息,但密碼設置仍然生效。普通用戶修改密碼時,如果使用弱密碼,則給出告警信息,且修改無效。
修改用戶密碼的例子。
[root@cs6 ~]# passwd Changing password for user root. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully. [root@cs6 ~]# passwd lewen Changing password for user lewen. New password: BAD PASSWORD: it is too simplistic/systematic BAD PASSWORD: is too simple Retype new password: passwd: all authentication tokens updated successfully. [root@cs6 ~]# su lewen [lewen@cs6 root]$ passwd Changing password for user lewen. Changing password for lewen. (current) UNIX password: New password: BAD PASSWORD: it is too simplistic/systematic #<==如果密碼太短則不允許設置(root用戶修改密碼只是警告) New password: BAD PASSWORD: it is too simplistic/systematic New password:
顯示賬號密碼信息的例子。
[root@cs6 ~]# passwd -S root root PS 2019-05-11 0 99999 7 -1 (Password set, SHA512 crypt.)
一條命令設置密碼(生產使用技巧)。
[root@cs6 ~]# echo '123456'|passwd --stdin lewen Changing password for user lewen. passwd: all authentication tokens updated successfully.
要求lewen用戶7天內不能更改密碼,60天以后必須修改密碼,過期前10天通知用戶,過期后30天后禁止用戶登錄。
[root@cs6 ~]# passwd -n 7 -x 60 -w 10 -i 30 lewen Adjusting aging data for user lewen. passwd: Success [root@cs6 ~]# passwd -S lewen lewen PS 2019-05-11 7 60 10 30 (Password set, SHA512 crypt.) [root@cs6 ~]# chage -l lewen Last password change : May 11, 2019 Password expires : Jul 10, 2019 Password inactive : Aug 09, 2019 Account expires : never Minimum number of days between password change : 7 Maximum number of days between password change : 60 Number of days of warning before password expires : 10
生產案例:批量創建10個用戶stu01-stu10,並且設置8位隨機密碼
范例7-15:批量創建10個用戶stu01-stu10,並且設置8位隨機密碼,要求不能使用Shell的循環(例如:for、while等),只能用Linux命令及管道來實現。
第一步:生成符合題意的10個用戶名。
[root@cs6 ~]# echo stu{01..10} stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10
第二步:使用tr命令將上述10個用戶名豎行顯示。
[root@cs6 ~]# echo stu{01..10}|tr " " "\n" #或者用xargs -n 1 stu01 stu02 stu03 stu04 stu05 stu06 stu07 stu08 stu09 stu10
第三步:在每一行的前面加上useradd命令,即可拼出添加用戶的所有命令。
[root@cs6 ~]# echo stu{01..10}|tr " " "\n"|sed -r 's#(.*)#useradd \1#g' useradd stu01 useradd stu02 useradd stu03 useradd stu04 useradd stu05 useradd stu06 useradd stu07 useradd stu08 useradd stu09 useradd stu10
上面三步是完整的命令,第四步開始實際上是不同的命令,因此用分號分隔。
第四步:定義8位隨機數變量。
[root@cs6 ~]# pass=$((RANDOM+88888888)) [root@cs6 ~]# echo $pass 88905344
第五步:以第一二步作為結果使用sed -r 's#(.*)#最終命令#g'。
[root@cs6 ~]# echo stu{01..10}|tr " " "\n"|sed -r 's#(.*)#useradd \1;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin \1;echo -e "\1 `echo "$pass"`">>/tmp/lewen.log#g' useradd stu01;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu01;echo -e "stu01 `echo "$pass"`">>/tmp/lewen.log useradd stu02;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu02;echo -e "stu02 `echo "$pass"`">>/tmp/lewen.log useradd stu03;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu03;echo -e "stu03 `echo "$pass"`">>/tmp/lewen.log useradd stu04;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu04;echo -e "stu04 `echo "$pass"`">>/tmp/lewen.log useradd stu05;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu05;echo -e "stu05 `echo "$pass"`">>/tmp/lewen.log useradd stu06;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu06;echo -e "stu06 `echo "$pass"`">>/tmp/lewen.log useradd stu07;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu07;echo -e "stu07 `echo "$pass"`">>/tmp/lewen.log useradd stu08;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu08;echo -e "stu08 `echo "$pass"`">>/tmp/lewen.log useradd stu09;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu09;echo -e "stu09 `echo "$pass"`">>/tmp/lewen.log useradd stu10;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin stu10;echo -e "stu10 `echo "$pass"`">>/tmp/lewen.log [root@cs6 ~]# echo stu{01..10}|tr " " "\n"|sed -r 's#(.*)#useradd \1;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin \1;echo -e "\1 `echo "$pass"`">>/tmp/lewen.log#g'|bash
拼接后的命令拆解解析
useradd stu10; 添加用戶 pass=$((RANDOM+10000000)); 密碼隨機數定義 echo "$pass"|passwd --stdin stul0; 非交互式設置密碼 echo -e "stu10 `echo "$pass"`" >>/tmp/lewen.log 將密碼生成到文件里並記錄
第六步:將得出的10條語句通過管道交給bash命令來執行。
[root@cs6 ~]# echo stu{01..10}|tr " " "\n"|sed -r 's#(.*)#useradd \1;pass=$((RANDOM+88888888));echo "$pass"|passwd --stdin \1;echo -e "\1 `echo "$pass"`">>/tmp/lewen.log#g'|bash useradd: warning: the home directory already exists. Not copying any file from skel directory into it. Creating mailbox file: File exists Changing password for user stu01. passwd: all authentication tokens updated successfully. ......