【BASH】回顧與知識點梳理 二十五
- 二十五. 特殊shell、PAM 模塊、訊息傳遞和大量建置賬號
- 25.1 特殊shell
- 特殊的 shell, /sbin/nologin
- 25.2 PAM模塊
- 25.3 Linux 主機上的用戶訊息傳遞
- 查詢使用者: w, who, last, lastlog
- 使用者對談: write, mesg, wall
- 使用者郵件信箱: mail
- 25.4 CentOS 7 環境下大量建置賬號的方法
- 一些賬號相關的檢查工具
- pwck/grpck
- pwconv
- pwunconv
- chpasswd
- 大量建置賬號模板(適用 passwd --stdin 選項)
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)
二十五. 特殊shell、PAM 模塊、訊息傳遞和大量建置賬號
25.1 特殊shell
我們前面一直談到的大多是一般身份用戶與系統管理員 (root) 的相關操作, 而且大多是討論關于可登入系統的賬號來說。那么換個角度想,如果我今天想要建立的, 是一個『僅能使用 mail server 相關郵件服務的賬號,而該賬號并不能登入 Linux 主機
』呢?如果不能給予該賬號一個密碼,那么該賬號就無法使用系統的各項資源,當然也包括 mail 的資源, 而如果給予一個密碼,那么該賬號就可能可以登入 Linux 主機啊!呵呵~傷腦筋吧~ 所以,底下讓我們來談一談這些有趣的話題啰!
特殊的 shell, /sbin/nologin
在一開頭的 passwd 文件結構里面我們就談過系統賬號這玩意兒,這玩意兒的 shell 就是使用/sbin/nologin
,重點在于系統賬號是不需要登入的!所以我們就給他這個無法登入的合法 shell。 使用了這個 shell 的用戶即使有了密碼,你想要登入時他也無法登入,因為會出現如下的訊息喔:
This account is currently not available.
我們所謂的『無法登入
』指的僅是:『這個使用者無法使用 bash 或其他 shell 來登入系統
』而已,并不是說這個賬號就無法使用其他的系統資源喔! 舉例來說,各個系統賬號,打印作業由lp
這個賬號在管理, WWW 服務由 apache
這個賬號在管理, 他們都可以進行系統程序的工作,但是『就是無法登入主機取得互動的 shell
』而已啦!^_^
換個角度來想,如果我的 Linux 主機提供的是郵件服務,所以說,在這部 Linux 主機上面的賬號,其實大部分都是用來收受主機的信件而已,并不需要登入主機的呢! 這個時候,我們就可以考慮讓單純使用 mail 的賬號以 /sbin/nologin 做為他們的 shell , 這樣,最起碼當我的主機被嘗試想要登入系統以取得 shell 環境時,可以拒絕該賬號呢!
另外,如果我想要讓某個具有 /sbin/nologin 的使用者知道,他們不能登入主機時, 其實我可以建立『/etc/nologin.txt 』這個文件, 并且在這個文件內說明不能登入的原因,那么下次當這個用戶想要登入系統時, 屏幕上出現的就會是 /etc/nologin.txt 這個文件的內容,而不是預設的內容了!
當使用者嘗試利用純 mail 賬號 (例如 myuser3) 時,利用 /etc/nologin.txt 告知用戶不要利用該賬號登入系統。
答:直接以 vim 編輯該文件,內容可以是這樣:
[root@study ~]# vim /etc/nologin.txt
This account is system account or mail account.
Please DO NOT use this account to login my Linux server.
想要測試時,可以使用 myuser3 (此賬號的 shell 是 /sbin/nologin) 來測試看看!
This account is system account or mail account.
Please DO NOT use this account to login my Linux server.
結果會發現與原本的默認訊息不一樣喔! ^_^
25.2 PAM模塊
此處參考 linux PAM模塊簡介
25.3 Linux 主機上的用戶訊息傳遞
談了這么多的賬號問題,總是該要談一談,那么如何針對系統上面的用戶進行查詢吧? 想幾個狀態,如果你在 Linux 上面操作時,剛好有其他的用戶也登入主機,你想要跟他對談,該如何是好? 你想要知道某個賬號的相關信息,該如何查閱?呼呼!底下我們就來聊一聊~
查詢使用者: w, who, last, lastlog
如何查詢一個用戶的相關數據呢?這還不簡單,我們之前就提過了 id, finger
等指令了,都可以讓您了解到一個用戶的相關信息啦!那么想要知道使用者到底啥時候登入呢? 最簡單可以使用last
檢查啊!
那如果你想要知道目前已登入在系統上面的用戶呢?可以透過 w 或 who 來查詢喔!如下范例所示:
[root@study ~]# w
01:49:18 up 25 days, 3:34, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dmtsai tty2 07Jul15 12days 0.03s 0.03s -bash
dmtsai pts/0 172.16.200.254 00:18 6.00s 0.31s 0.11s sshd: dmtsai [priv]
# 第一行顯示目前的時間、開機 (up) 多久,幾個用戶在系統上平均負載等;
# 第二行只是各個項目的說明,
# 第三行以后,每行代表一個使用者。如上所示,dmtsai 登入并取得終端機名 tty2 之意。
[root@study ~]# who
dmtsai tty2 2015-07-07 23:07
dmtsai pts/0 2015-07-22 00:18 (192.168.1.100)
另外,如果您想要知道每個賬號的最近登入的時間,則可以使用 lastlog 這個指令喔! lastlog 會去讀取 /var/log/lastlog 文件,結果將數據輸出如下表:
[root@study ~]# lastlog
Username Port From Latest
root pts/0 Wed Jul 22 00:26:08 +0800 2015
bin **Never logged in**
....(中間省略)....
dmtsai pts/1 192.168.1.100 Wed Jul 22 01:08:07 +0800 2015
vbird1 pts/0 Wed Jul 22 01:32:17 +0800 2015
pro3 **Never logged in**
....(以下省略)....
這樣就能夠知道每個賬號的最近登入的時間啰~
使用者對談: write, mesg, wall
那么我是否可以跟系統上面的用戶談天說地呢?當然可以啦!利用 write 這個指令即可。 write 可以直接將訊息傳給接收者啰!舉例來說,我們的 Linux 目前有 vbird1 與 root 兩個人在在線, 我的 root 要跟 vbird1 講話,可以這樣做:
[root@study ~]# write 使用者賬號 [用戶所在終端接口]
[root@study ~]# who
vbird1 tty3 2015-07-22 01:55 <==有看到 vbird1 在在線
root tty4 2015-07-22 01:56
[root@study ~]# write vbird1 pts/2
Hello, there:
Please don't do anything wrong... <==這兩行是 root 寫的信息!
# 結束時,請按下 [crtl]-d 來結束輸入。此時在 vbird1 的畫面中,會出現:
Message from root@study.centos.vbird on tty4 at 01:57 ...
Hello, there:
Please don't do anything wrong...
EOF
怪怪~立刻會有訊息響應給 vbird1 !不過…當時 vbird1 正在查資料,哇! 這些訊息會立刻打斷vbird1 原本的工作喔!所以,如果 vbird1 這個人不想要接受任何訊息,直接下達這個動作:
[vbird1@study ~]$ mesg n
[vbird1@study ~]$ mesg
is n
不過,這個 mesg 的功能對 root 傳送來的訊息沒有抵擋的能力!所以如果是 root 傳送訊息, vbird1 還是得要收下。 但是如果 root 的 mesg 是 n 的,那么 vbird1 寫給 root 的信息會變這樣:
[vbird1@study ~]$ write root
write: root has messages disabled
了解乎?如果想要解開的話,再次下達『 mesg y
』就好啦!想要知道目前的 mesg 狀態,直接下達『 mesg 』即可!瞭呼? 相對于 write 是僅針對一個使用者來傳『簡訊』,我們還可以『對所有系統上面的用戶傳送簡訊 (廣播)
』哩~ 如何下達?用wall
即可啊!他的語法也是很簡單的喔!
[root@study ~]# wall "I will shutdown my linux server..."
然后你就會發現所有的人都會收到這個簡訊呢!連發送者自己也會收到耶!
使用者郵件信箱: mail
使用 wall, write 畢竟要等到使用者在在線才能夠進行,有沒有其他方式來聯絡啊? 不是說每個Linux 主機上面的用戶都具有一個 mailbox 嗎? 我們可否寄信給使用者啊!呵呵!當然可以啊!我們可以寄、收 mailbox 內的信件呢! 一般來說, mailbox 都會放置在/var/spool/mail
里面,一個賬號一個 mailbox (文件)。 舉例來說,我的 vbird1 就具有 /var/spool/mail/vbird1 這個 mailbox 喔!
那么我該如何寄出信件呢?就直接使用 mail 這個指令即可!這個指令的用法很簡單的,直接這樣下達:『mail -s "郵件標題" username@localhost
』即可! 一般來說,如果是寄給本機上的使用者,基本上,連『 @localhost 』都不用寫啦! 舉例來說,我以 root 寄信給 vbird1 ,信件標題是『nice to meet you
』,則:
[root@study ~]# mail -s "nice to meet you" vbird1
Hello, D.M. Tsai
Nice to meet you in the network.
You are so nice. byebye!
. <==這里很重要喔,結束時,最后一行輸入小數點 . 即可!
EOT
[root@study ~]# <==出現提示字符,表示輸入完畢了!
如此一來,你就已經寄出一封信給 vbird1 這位使用者啰,而且,該信件標題為: nice to meet you,信件內容就如同上面提到的。不過,你或許會覺得 mail 這個程序不好用~ 因為在信件編寫的過程中,如果寫錯字而按下 Enter 進入次行,前一行的數據很難刪除ㄟ! 那怎么辦?沒關系啦!我們使用數據流重導向啊!呵呵!利用那個小于的符號 ( < ) 就可以達到取代鍵盤輸入的要求了。也就是說,你可以先用 vi 將信件內容編好, 然后再以 mail -s "nice to meet you" vbird1 < filename
來將文件內容傳輸即可。
請將你的家目錄下的環境變量文件 (~/.bashrc) 寄給自己!
答:mail -s “bashrc file content” dmtsai < ~/.bashrc透過管線命令直接將 ls -al ~ 的內容傳給 root 自己!
答:ls -al ~ | mail -s “myfile” root
剛剛上面提到的是關于『寄信』的問題,那么如果是要收信
呢?呵呵!同樣的使用 mail
啊! 假設我以 vbird1 的身份登入主機,然后輸入 mail 后,會得到什么?
[vbird1@study ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/vbird1": 1 message 1 new
>N 1 root Wed Jul 22 02:09 20/671 "nice to meet you"
& <==這里可以輸入很多的指令,如果要查閱,輸入 ? 即可!
在 mail 當中的提示字符是 &
符號喔,別搞錯了~輸入 mail 之后,我可以看到我有一封信件, 這封信件的前面那個>
代表目前處理的信件,而在大于符號的右邊那個 N 代表該封信件尚未讀過,如果我想要知道這個 mail 內部的指令有哪些,可以在 & 之后輸入『?
』,就可以看到如下的畫面:
& ?mail commands
type <message list> type messages
next goto and type next message
from <message list> give head lines of messages
headers print out active message headers
delete <message list> delete messages
undelete <message list> undelete messages
save <message list> folder append messages to folder and mark as saved
copy <message list> folder append messages to folder without marking them
write <message list> file append message texts to file, save attachments
preserve <message list> keep incoming messages in mailbox even if saved
Reply <message list> reply to message senders
reply <message list> reply to message senders and all recipients
mail addresses mail to specific recipients
file folder change to another folder
quit quit and apply changes to folder
xit quit and discard changes made to folder
! shell escape
cd <directory> chdir to directory or home if none given
list list names of all available commands
25.4 CentOS 7 環境下大量建置賬號的方法
系統上面如果有一堆賬號存在,你怎么判斷某些賬號是否存在一些問題?這時需要哪些軟件的協助處理比較好? 另外,如果你跟鳥哥一樣,在開學之初或期末之后,經常有需要大量建立賬號、刪除賬號的需求時,那么是否要使用 useradd 一行一行指令去建立? 此外,如果還有需要使用到下一章會介紹到的 quota (磁盤配額) 時,那是否還要額外使用其他機制來建立這些限制值?既然已經學過shell script 了, 當然寫支腳本讓它將所有的動作做完最輕松吧!所以啰,底下我們就來聊一聊,如何檢查賬號以及建立這個腳本要怎么進行比較好?
一些賬號相關的檢查工具
先來檢查看看用戶的家目錄、密碼等數據有沒有問題?這時會使用到的主要有 pwck
以及 pwconv / pwuconv
等,讓我們來了解一下先!
pwck/grpck
pwck
這個指令在檢查 /etc/passwd
這個賬號配置文件內的信息,與實際的家目錄是否存在等信息,還可以比對 /etc/passwd /etc/shadow 的信息
是否一致,另外,如果 /etc/passwd 內的數據字段錯誤時,會提示使用者修訂。 一般來說,我只是利用這個玩意兒來檢查我的輸入是否正確就是了。
[root@study ~]# pwck
user 'ftp': directory '/var/ftp' does not exist
user 'avahi-autoipd': directory '/var/lib/avahi-autoipd' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
pwck: no changes
瞧!上面僅是告知我,這些賬號并沒有家目錄,由于那些賬號絕大部分都是系統賬號,確實也不需要家目錄的,所以,那是『正常的錯誤!』呵呵!不理他。 _。 相對應的群組檢查可以使用 grpck
這個指令的啦!
pwconv
這個指令主要的目的是在『將 /etc/passwd 內的賬號與密碼,移動到 /etc/shadow 當中
!』早期的 Unix 系統當中并沒有 /etc/shadow 呢,所以,用戶的登入密碼早期是在 /etc/passwd 的第二欄,后來為了系統安全,才將密碼數據移動到 /etc/shadow 內的。使用 pwconv 后,可以:
- 比對 /etc/passwd 及 /etc/shadow ,若 /etc/passwd 內存在的賬號并沒有對應的 /etc/shadow 密碼時,則pwconv 會去 /etc/login.defs 取用相關的密碼數據,并建立該賬號的 /etc/shadow 數據;
- 若 /etc/passwd 內存在加密后的密碼數據時,則 pwconv 會將該密碼欄移動到 /etc/shadow 內,并將原本的/etc/passwd 內相對應的密碼欄變成 x !
一般來說,如果您正常使用 useradd 增加使用者時,使用 pwconv 并不會有任何的動作,因為/etc/passwd 與 /etc/shadow 并不會有上述兩點問題啊! ^_^。不過,如果手動設定賬號,這個 pwconv 就很重要啰!
pwunconv
相對于 pwconv , pwunconv 則是『將 /etc/shadow 內的密碼欄數據寫回 /etc/passwd 當中, 并且刪除 /etc/shadow 文件。
』這個指令說實在的,最好不要使用啦! 因為他會將你的 /etc/shadow 刪除喔!如果你忘記備份,又不會使用 pwconv 的話,粉嚴重呢!
chpasswd
chpasswd 是個挺有趣的指令,他可以『讀入未加密前的密碼,并且經過加密后, 將加密后的密碼寫入 /etc/shadow 當中。
』這個指令很常被使用在大量建置賬號的情況中喔! 他可以由 Standard input 讀入數據,每筆數據的格式是『 username:password
』。 舉例來說,我的系統當中有個用戶賬號為vbird3 ,我想要更新他的密碼 (update) , 假如他的密碼是 abcdefg 的話,那么我可以這樣做:
[root@study ~]# echo "vbird3:abcdefg" | chpasswd
神奇吧!這樣就可以更新了呢!在預設的情況中, chpasswd 會去讀取 /etc/login.defs 文件內的加密機制,我們 CentOS 7.x 用的是 SHA512, 因此 chpasswd 就預設會使用 SHA512 來加密!如果你想要使用不同的加密機制
,那就得要使用-c
以及 -e
等方式來處理了! 不過從 CentOS 5.x 開始之后,passwd
已經默認加入了 --stdin
的選項,因此這個 chpasswd 就變得英雄無用武之地了
! 不過,在其他非 Red Hat 衍生的 Linux 版本中,或許還是可以參考這個指令功能來大量建置賬號喔!
大量建置賬號模板(適用 passwd --stdin 選項)
由于 CentOS 7.x 的 passwd 已經提供了 --stdin 的功能,因此如果我們可以提供賬號密碼的話, 那么就能夠很簡單的建置起我們的賬號密碼了。底下鳥哥制作一個簡單的 script 來執行新增用戶的功能喔!
[root@study ~]# vim accountadd.sh
#!/bin/bash
# This shell script will create amount of linux login accounts for you.
# 1. check the "accountadd.txt" file exist? you must create that file manually.
# one account name one line in the "accountadd.txt" file.
# 2. use openssl to create users password.
# 3. User must change his password in his first login.
# 4. more options check the following url:
# http://linux.vbird.org/linux_basic/0410accountmanager.php#manual_amount
# 2015/07/22 VBird
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
# 0. userinput
usergroup="" # if your account need secondary group, add here.
pwmech="openssl" # "openssl" or "account" is needed.
homeperm="no" # if "yes" then I will modify home dir permission to 711
# 1. check the accountadd.txt file
action="${1}" # "create" is useradd and "delete" is userdel.
if [ ! -f accountadd.txt ]; then
echo "There is no accountadd.txt file, stop here."exit 1
fi
[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)
for username in ${usernames}
docase ${action} in"create")[ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""useradd ${usegrp} ${username} # 新增賬號[ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username}echo ${usepw} | passwd --stdin ${username} # 建立密碼chage -d 0 ${username} # 強制登入修改密碼[ "${homeperm}" == "yes" ] && chmod 711 /home/${username}echo "username=${username}, password=${usepw}" >> outputpw.txt;;"delete")echo "deleting ${username}"userdel -r ${username};;*)echo "Usage: $0 [create|delete]";;esac
done
接下來只要建立 accountadd.txt 這個文件即可!鳥哥建立這個文件里面共有 5 行,你可以自行建立該文件!內容每一行一個賬號。 而是否需要修改密碼?是否與賬號相同的信息等等,你可以自由選擇!若使用 openssl 自動猜密碼時,用戶的密碼請由 outputpw.txt 去撈~鳥哥最常作的方法,就是將該文件打印出來,用裁紙機一個賬號一條,交給同學即可!
[root@study ~]# vim accountadd.txt
std01
std02
std03
std04
std05
[root@study ~]# sh accountadd.sh create
Changing password for user std01.
passwd: all authentication tokens updated successfully.
....(后面省略)....
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)