怎么办港澳证多久才能拿到到Hi语音里面数字很好的ID号码?

打飞机 去美国
HI3520D 音频
本来音频模块不属于我的,但为了团队,为了更好的工作,更重要的是为了自己,看看吧,可我之前对音频处理这一块几乎没接触过,一片空白,怎么办呢,没办法,我只有把手册从头到尾关于音频的好好的整理了一下,由于CSDN特性即难插图片,所以省略了图表说明,希望对从事Hi35XX系列的同志们有所帮助。。。。。
我这干的是苦力活,即把手册整理(copy)了一下,万事都是这样子开始的。。。。。。。
模块包括音频输入、音频输出、音频编码、音频解码四个子模块。音频输入和输出模块通过对芯片设备的控制实现相应的音频输入输出功能;音频编码和解码模块则提供对、、、格式的音频编解码功能。
一、重要概念
音频输入输出接口(),用于和片外芯片连接,完成音乐(语音)的播放及录制。芯片提供个接口,芯片提供个接口,依次标示为、、。每个接口都能同时提供音频输入和音频输出功能(但由于芯片管脚的限制,各个支持的情况是不一样的)。
能同时提供音频输入和输出功能,能提供音频输入功能;相对
而言,增加了的输出功能和的输入功能,但这两者是复用关系,即只能选择其中一种功能,并且芯片管脚也是复用的。
软件将音频输入和输出功能分别用和两个模块来管理,和又按照序号来区分不同的接口。例如的输入接口称为设备,的输出接口称为设备,的输入接口称为设备,如图所示。
音频接口时序
接口支持标准的接口时序模式(只处理音频),并提供灵活的配置以支持与多种对接。详细的时序支持情况请参考《编解码处理器用户指南》。
用户需要对协议以及对接的时序支持情况有足够了解,这里只简单介绍下接口时序的几个特性:
按照标准协议,总是先传送(高位),后传送(低位),即按照从高位到低位的顺序传输串行数据。
支持扩展的多路接收的接口时序,对接的时序支持情况、时钟、位宽等配置必须与的配置保持一致,否则可能采集不到正确的数据。
支持主模式和从模式,主模式即提供时钟,从模式即提供时钟;主模式时提供的时钟供输入和输出共同使用,而从模式时的输入输出可以分别由外围提供时钟。
标准的协议只有左右声道这两个通道的概念,同时能够支持多路复用的接收模式,最大支持通道的数据接收。本身并不关心具体的通道分布,通道由软件来管理;根据输入和输出的不同,分为通道和通道,通道又隶属于设备,例如下可支持多个通道、、…、,具体支持的通道个数由用户根据对接时序要求来做相应的配置。
、通道排列
必须理解对接通道和、通道的对应关系,才能从正确的通道获取数据。
在一个帧同步时钟内,最大能接收的音频串行数据;如图(图片太大,不便输出)所示,通道的排列顺序与取数据的顺序一致,即从高位到低位排列;实际取的数据多少由配置的通道路数和采样精度决定。
音频帧结构体
音频采样精度
音频声道模式。
实际音频帧数据
音频帧时间戳。以μ为单位
音频帧序号
音频帧长度。以为单位。
(音频帧长度)指单个声道的数据长度。
单声道数据直接存放,采样点数为,长度为;立体声数据按左右声道分开存放,先存放采样点为、长度为的左声道数据,然后存放采样点为,长度为的右声道数据。
频输入()主要实现配置及启用音频输入设备、获取音频帧数据等功能。
设置获取设备属性
音频输入设备的属性决定了输入数据的格式,输入设备属性包括工作模式、采样率、采样精度、大小、每帧的采样点数、扩展标志、时钟选择和通道数目。
输入输出目前支持主模式和从模式。
采样率指一秒中内的采样点数,采样率越高表明失真度越小,处理的数据量也就随之增加。主模式下支持~的采样率,一般来说语音使用采样率,音频使用或以上的采样率;在从模式下,采样率由芯片决定。
采样精度指某个通道的采样点数据宽度,同时决定整个设备的通道分布。采样位宽可以设置为、和。
大小以帧为单位,每帧的采样点数和采样精度决定帧长,大小设置当前能容纳帧的个数。
扩展标志表明在采样精度的条件下是否需要对数据进行到带符号扩展,扩展后获取的数据就为,以满足编码器需求。在设置非采样精度的情况下,此标志是无效的。
通道数目指当前设备的功能支持的最大通道数目,需与对接的的配置保持一致;支持路、路、路和路。
提供时钟(即从模式)时,如果能提供独立的和功能信号(即),那么将此项配置为,否则配置为。
在设置属性之前需要保证处于非启用状态,如果处于启用状态则需要首先禁用设备。
同一下的和设备的主从模式、时钟选择应该一致,否则设置属性时会返回错误。
在从模式下,采样率的设置不起作用。
必须和配合起来才能正常工作,用户必须清楚采集的数据分布和通道的关系才能从正确的通道取得数据。
获取的属性为前一次配置的属性。
如果从来没有配置过属性,则返回属性未配置的错误。
定义音频输入输出设备属性结构体
音频采样率(从模式下,此参数不起作用)
音频采样精度(从模式下,此参数必须和音频的采样精度匹配)。
音频输入输出工作模式。
音频声道模式。
到扩展标志(精度时有效)。
缓存帧数目
每帧的采样点个数。
支持的最大通道数目。
时钟选择。
定义音频采样率
定义音频采样精度
采样精度为位宽
定义音频输入输出设备工作模式
从模式(标准协议)
从模式(非标准协议)
定义音频声道模式
启用禁用设备
必须在启用前配置设备属性,否则返回属性未配置错误。
如果设备已经处于运行状态,则直接返回成功
如果设备已经处于非运行状态,则直接返回成功。
禁用设备前必须先禁用该设备下已启用的所有通道。
启用禁用通道
启用通道前,必须先启用其所属的设备,否则返回设备未启动的错误码。
启用禁用指定及的回声抵消功能
启用回声抵消前必须先启用相对应的设备。
成功启用回声抵消需要具备一定条件:单声道模式,采样率为,采样精度为,帧长为或个采样点,且和帧长必须相同。以上条件和都必须满足(但实际上本接口只检查的属性)。
多次启用相同、的回声抵消,则返回成功。
启用禁用重采样
在启用通道之后,绑定通道之前,调用此接口启用重采样功能。
如果启用重采样功能,则在通道输出音频原始数据之前,内部将会先执行重采样处理,处理完后的数据再输出给绑定的或。
音频重采样属性包含以下项:
:输入音频帧的每帧采样点个数。
:输入音频帧的采样率。
:重采样类型,支持到倍、到倍的重采样,例如降采样到或降采样到。
重采样处理后音频帧的每帧采样点数目会发生变化,调用接口时,音频公共属性中的项应该配置为重采样之前的值,本接口中重采样属性中的项也配置为重采样之前的值。例如从到重采样,重采样完成后输出给或的每帧采样点个数将会是重采样前的四分之一,如果期望输出的采样点数为,那么公共属性中的项则应配置为,重采样属性中的项也配置成相同值。
不允许重复启用重采样功能,即在再次启用之前需要先将其禁用。
不再使用重采样功能的话,应该调用此接口将其禁用。
定义音频重采样属性配置结构体
输入的每帧采样点个数
输入的采样率
重采样类型
获取音频输入通道号对应的设备文件句柄
音频输出不考虑输出,所以,也懒得总结
音频输出()主要实现启用音频输出设备、发送音频帧到输出通道等功能。
3.视频编码
音频编码主要实现创建编码通道、发送音频帧编码及获取编码码流等功能。
创建销毁音频编码通道
协议类型指定该通道的编码协议,目前支持、、和和,具体内容如表所示。
表中列举的编解码协议只支持线性音频数据处理,如果输入的是采样精度的数据,内部会将其扩展为;另外,使用时,建议将扩展标志置为,使得数据由自动扩展到。
海思语音帧结构如表所示。
音频编码的部分属性需要与输入的音频数据属性相匹配,例如采样率、帧长(每帧采样点数目)等。
大小以帧为单位,取值范围是。
在通道闲置时才能使用此接口,如果通道已经被创建,则返回通道已经创建的错误。
先创建完编码通道,再调用此接口,否则返回通道未创建。
如果正在获取释放码流或者发送帧时销毁该通道,则会返回失败。
定义音频编码通道属性结构体
音频编码协议类型为一个枚举类型
音频编码缓存大小以帧为单位
具体协议属性指针
定义编解码协议类型
绑定编码通道与输入通道
获取释放音频编码码流
必须创建通道后才可能获取码流,否则直接返回失败,如果在获取码流过程中销毁通道则会立刻返回失败。
支持阻塞或非阻塞方式获取码流,并且支持标准的系统调用。
当阻塞方式获取码流时,如果音频数据空则此接口调用会被阻塞,直至中有新的数据或销毁通道。
直接获取原始音频数据的方法创建一路通道,编码协议类型设置为,绑定通道后,从此通道获取的音频数据即原始数据。
码流最好能够在使用完之后立即释放,如果不及时释放,会导致编码过程阻塞等待码流释放。
释放的码流必须是从该通道获取的码流,不得对码流信息结构体进行任何修改,否则会导致码流不能释放,使此码流丢失,甚至导致程序异常。
释放码流时必须保证通道已经被创建,否则直接返回失败,如果在释放码流过程中销毁通道则会立刻返回失败。
定义音频码流结构体
音频码流数据指针
音频码流长度。以为单位。
音频码流时间戳。
音频码流序号。
音频解码主要实现创建解码通道、发送音频码流解码及获取解码后音频帧等功能。
创建销毁音频解码通道
协议类型指定了该通道的解码协议,目前支持、、和和。各种音频编解码协议的详细说明请参见“音频编码”。)
音频解码的部分属性需要与输出设备属性相匹配,例如采样率、帧长(每帧采样点数目)等。
大小以帧为单位,取值范围是。
在通道未创建前(或销毁后)才能使用此接口,如果通道已经被创建,则返回通道已经创建。
定义解码通道属性结构体
音频解码协议类型
音频解码缓存大小
具体协议属性指针
定义解码方式
模式解码。
模式用于用户确认当前码流包为一帧数据编码结果的情况下,解码器会直接进行对其解码,如果不是一帧,解码器会出错。这种模式的效率比较高,在使用模块编码的码流包如果没有破坏,均可以使用此方式解码。
模式用于用户不能确认当前码流包是不是一帧数据的情况下,解码器需要对码流进行判断并缓存,此工作方式的效率低下,一般用于读文件码流送解码或者不确定码流包边界的情况。当然由于语音编码码流长度固定,很容易确定在码流中的帧边界,推荐使用模式解码。
向音频解码通道发送码流
创建解码通道时可以指定解码方式为方式或方式。
发送数据时必须保证通道已经被创建,否则直接返回失败,如果在送数据过程中销毁通道则会立刻返回失败。
支持阻塞或非阻塞方式发送码流。
当阻塞方式发送码流时,如果音频数据满则此接口调用会被阻塞,直至取走音频数据或销毁通道。
确保发送给通道的码流数据的正确性,否则可能引起解码器异常退出。
定义音频码流结构体
音频码流数据指针
音频码流长度。以为单位
音频码流时间戳
音频码流序号
清除通道中当前的音频数据缓存
要求解码通道已经被创建,如果通道未被创建则返回通道不存在错误码。
使用本接口时,不建议使用流式解码。使用流式解码进行清除缓存操作时,用户需要确保清除完缓存后,发送给解码器的数据必须是完整的一帧码流,否则可能导致解码器不能正常工作。
无论是否使用流式解码,都要确保送数据解码的操作和清除缓存的操作之间的同步。
没有更多推荐了,為取得較佳瀏覽結果,請愛用
瀏覽本網頁
最近更新日期:
本文已不再維護,更新文章請參考
  1.3 : 、
  2.1 : ,
  2.2 :,
  2.3 :,
  2.4 :
  5.1 :,
Linux 的帳號與群組
管理員的工作中,相當重要的一環就是『管理帳號』啦!因為整個系統都是你在管理的,
並且所有的一般用戶的申請,都必須要透過你的協助才行!所以你就必須要瞭解一下如何管理好一個網站的帳號管理啦!
在管理 Linux 主機的帳號時,我們必須先來瞭解一下 Linux 到底是如何辨別每一個使用者的!
使用者識別: UID 與 GID
雖然我們登入 Linux 主機的時候,輸入的是我們的帳號,但是,其實 Linux
主機並不會直接認識你的『帳號名稱』的,他僅認識 ID 啊~ID 就是一組號碼啦~
主機對於數字比較有概念的,帳號只是為了讓人們容易記憶而已。
而您的 ID 與帳號的對應就在 /etc/passwd 當中哩。
如果你曾經以 tarball 安裝過軟體的話,那麼應該不難發現,在解壓縮之後的檔案,
檔案擁有者竟然是『不明的數字』?奇怪吧?這沒什麼好奇怪的,因為 Linux
說實在話,他真的只認識代表你身份的號碼而已!
那麼到底有幾種 ID 呢?還記得我們在『』
那一篇文章的時候有提到每一個檔案都具有『擁有人與擁有群組』的屬性嗎?
沒錯啦~每個登入的使用者至少都會取得兩個 ID ,一個是使用者 ID (User ID ,簡稱 UID)、
一個是群組 ID (Group ID ,簡稱 GID)。
那麼檔案如何判別他的擁有者與群組呢?其實就是利用 UID 與 GID 啦!
每一個檔案都會有所謂的擁有者 ID 與擁有群組 ID ,亦即是 UID
與 GID ,然後系統會依據 /etc/passwd 的內容,去將該檔案的擁有者與群組名稱,
使用帳號的形式來秀出來!我們可以作個小實驗,你可以以
root 的身份 vi /etc/passwd ,然後將你的一般身份的使用者的 ID 隨便改一個號碼,
然後再到你的一般身份的目錄下看看原先該帳號擁有的檔案,你會發現該檔案的擁有人變成了
『數字了』呵呵!這樣可以理解了嗎?
[root@linux ~]# vi /etc/passwd
.....(前面省略).....
dmtsai:x:501:501::/home/dmtsai:/bin/bash
&==將原本的 501:501 改成
[root@linux ~]# ls -ld /home/
drwxr-xr-x
501 dmtsai 4096 Aug 30 10:37 dmtsai
# 瞧!這裡就能夠知道,其實檔案記錄的是 UID 啦~
你一定要瞭解的是,上面的例子僅是在說明 UID 與帳號的對應性,
在一部正常運作的 Linux 主機環境下,上面的動作不可隨便進行,
這是因為系統上已經有很多的資料在運行了,隨意修改系統上某些帳號的 UID
很可能會導致某些程序無法進行,這將導致系統無法順利運作的結果。
因為權限的問題啊!所以,瞭解了之後,請趕快回到 /etc/passwd 裡面,將數字改回來喔!
如何登入 Linux 取得 UID/GID
好了,那麼我們再來談一談,到底我們是怎樣登入 Linux 主機的呢?其實也不難啦!當我們在主機前面或者是以
telnet 或者 ssh 登入主機時,系統會出現一個 login 的畫面讓你輸入帳號,這個時候當你輸入帳號與密碼之後,
Linux 會:
先找尋 /etc/passwd 裡面是否有這個帳號?如果沒有則跳出,如果有的話則將該帳號對應的
UID ( User ID )與 GID ( Group ID )讀出來,另外,該帳號的家目錄與 shell
設定也一併讀出;
再來則是核對密碼表啦!這時 Linux 會進入 /etc/shadow
裡面找出對應的帳號與 UID,然後核對一下你剛剛輸入的密碼與裡頭的密碼是否相符?
如果一切都 OK 的話,就進入 Shell 控管的階段囉!
大致上的情況就像這樣,所以呢,當你要登入你的 Linux 主機的時候,那個 /etc/passwd
與 /etc/shadow 就必須要讓系統讀取啦,(這也是很多攻擊者會將特殊帳號寫到
/etc/passwd 裡頭去的緣故!)所以呢,如果你要備份 Linux 的系統的帳號的話,
那麼這兩個檔案就一定需要備份才行呦!
使用者帳號:/etc/passwd,
/etc/shadow
由上面的說明您大概已經知道,嘿嘿!帳號管理最重要的兩個檔案就是『 /etc/passwd
與 /etc/shadow 』了!這兩個檔案可以說是 Linux 裡頭最重要的檔案之一了!
如果沒有這兩個檔案的話,呵呵!您可是無法登入 Linux 的呦!所以,底下我們先針對這兩個檔案來進行說明。
當然囉,更詳細的資料您可以自行 man 5 passwd 及 man 5 shadow 的啦~
/etc/passwd
這個檔案的構造是這樣的:每一行都代表一個帳號,
有幾行就代表有幾個帳號在你的系統中!不過需要特別留意的是,
裡頭很多帳號本來就是系統中必須要的,我們可以簡稱他為系統帳號,
例如 bin, daemon, adm, nobody 等等,這些帳號是系統正常運作時所需要的,請不要隨意的殺掉他呢!
這個檔案的內容有點像這樣:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
我們先來看一下每個 Linux 系統都會有的第一行,就是 root 這個系統管理員那一行好了,
你可以明顯的看出來,每一行使用『:』分隔開,共有七個咚咚,分別是:
帳號名稱:就是帳號名稱啦!對應 UID 用的!例如
root 就是預設的系統管理員的帳號名稱;
密碼:早期的 Unix 系統的密碼是放在這個檔案中的,
但是因為這個檔案的特性是所有的程序都能夠讀取,所以,這樣一來很容易造成資料的被竊取,
因此後來就將這個欄位的密碼資料給他改放到 /etc/shadow 中了,關於 /etc/shadow
這一部份等一下再說。而這裡你會看到一個 x ,呵呵!別擔心,這表示密碼已經被移動到
shadow 這個加密過後的檔案囉;
UID:這個就是使用者識別碼 (ID) 囉!通常 Linux 對於
UID 有幾個限制需要說給您瞭解一下:
id 範圍該 ID 使用者特性
0當 UID 是 0 時,代表這個帳號是『系統管理員』!所以當你要作另一個系統管理員帳號時,
你可以將該帳號的 UID 改成 0 即可;這也就是說,一部系統上面的系統管理員不見得只有 root 喔!
不過,不很建議有多個帳號的 UID 是 0 啦~
1~499保留給系統使用的 ID,其實 1~65534 之間的帳號並沒有不同,
也就是除了 0 之外,其他的 UID 並沒有不一樣,預設 500
以下給系統作為保留帳號只是一個習慣。這樣的好處是,以有名的 DNS 伺服器的啟動服務『 named
』為例,這個程式的預設所有人 named 的帳號 UID 是 25 ,當有其他的帳號同樣是 25
時,很可能會造成系統的一些小問題!為了杜絕這樣的問題,建議保留 500 以前的 UID 給系統吧!
不過,一般來說, 1~99 會保留給系統預設的帳號,另外 100~499 則保留給一些服務來使用。
500~65535給一般使用者用的。事實上,目前的 linux 核心 (2.6.x 版)已經可以支援到
(2^32-1) 這麼大的 UID 號碼喔!
上面這樣說明可以瞭解了嗎?是的, UID 為 0 的時候,就是 root 呦!所以請特別留意一下你的
/etc/passwd 檔案!
GID:這個與 /etc/group 有關!其實 /etc/group
的觀念與 /etc/passwd 差不多,只是他是用來規範 group 的而已!
使用者資訊說明欄:這個欄位基本上並沒有什麼重要用途,
只是用來解釋這個帳號的意義而已!不過,如果您提供使用 finger 的功能時,
這個欄位可以提供很多的訊息呢!底下的 chfn 可以解釋一下囉!
家目錄:這是使用者的家目錄,以上面為例, root 的家目錄在
/root ,所以當 root 登入之後,就會立刻跑到 /root 裡頭啦!呵呵!
如果你有個帳號的使用空間特別的大,你想要將該帳號的家目錄移動到其他的硬碟去,
沒有錯!可以在這裡進行修改呦!預設的使用者家目錄在 /home/yourIDname
Shell:所謂的 shell
是用來溝通人類下達的指令與硬體之間真正動作的界面!我們通常使用 /bin/bash
這個 shell 來進行指令的下達!嘿嘿!發現了吧?我們在
章節裡面提到很多次,登入 Linux 時為何預設是 bash 呢?就是這裡設定的啦~
這裡比較需要注意的是,有一個 shell 可以用來替代成讓帳號無法登入的指令!那就是
/sbin/nologin 這個東西!這也可以用來製作純 pop 郵件帳號者的資料呢!
/etc/shadow
上面約略提到,由於每個程序都需要取得 uid 與 gid 來判斷權限的問題,所以,
/etc/passwd 的權限必須要設定成為 -rw-r--r-- 這樣的權限,在這樣的情況下,
使用者的密碼不就任何人都可以看到嗎?即使這個檔案內的密碼欄是加密的,
壞心腸的朋友也可能利用暴力破解法去 try and error 找出您的密碼資料......
因為這樣的關係,所以後來發展出將密碼移動到 /etc/shadow 這個檔案分隔開來的技術,
而且還加入很多的密碼限制參數在 /etc/shadow 裡頭呢!我們先來瞭解一下這個檔案的構造吧!
我的 /etc/shadow 檔案有點像這樣:
root:$1$i9Ejldjfjio389u9sjl$jljsoi45QE/:99:7:::
bin:*:99:7:::
daemon:*:99:7:::
adm:*:99:7:::
基本上, shadow 同樣以『:』作為分隔符號,如果數一數,會發現共有九個欄位啊,
這九個欄位的用途是這樣的:
帳號名稱:由於密碼也需要與帳號對應啊~因此,
這個檔案的第一欄就是帳號,必須要與 /etc/passwd 相同才行!
密碼:這個才是真正的密碼,而且是
經過編碼過的密碼啦!
你只會看到有一些特殊符號的字母就是了!需要特別留意的是,
雖然這些加密過的密碼很難被解出來,但是『很難』不等於『不會』,所以,
這個檔案的預設屬性是『-rw-------』或者是『-r--------』,亦即只有 root
才可以讀寫就是了!你得隨時注意,不要不小心更動了這個檔案的屬性呢!另外,
如果是在密碼欄的第一個字元為『 * 』或者是『 ! 』,表示這個帳號並不會被用來登入的意思。
所以萬一哪一天你的某個使用者不乖時,可以先在這個檔案中,將他的密碼欄位的最前面多加一個
* !嘿嘿!他就無法使用該帳號囉!直到他變乖了,再給他啟用啊!
最近更動密碼的日期:這個欄位記錄了『更動密碼的那一天』的日期,
不過,很奇怪呀!在我的例子中怎麼會是 12959 呢?呵呵,這個是因為計算 Linux
日期的時間是以 1970 年 1 月 1 日作為 1 ,而 1971 年 1 月 1 日則為 366 啦!
所以這個日期是累加的呢!得注意一下這個資料呦!那麼最近的 2005 年 1 月 1 日就是 12784
啦,瞭解了嗎?
密碼不可被更動的天數:
第四個欄位記錄了這個帳號的密碼需要經過幾天才可以被變更!如果是 0 的話,
表示密碼隨時可以更動的意思。這的限制是為了怕密碼被某些人一改再改而設計的!如果設定為
20 天的話,那麼當你設定了密碼之後, 20 天之內都無法改變這個密碼呦!
密碼需要重新變更的天數:
由於害怕密碼被某些『有心人士』竊取而危害到整個系統的安全,所以有了這個欄位的設計。
你必須要在這個時間之內重新設定你的密碼,否則這個帳號將會暫時失效。
而如果像上面的 99999 的話,那就表示,呵呵,密碼不需要重新輸入啦!
不過,如果是為了安全性,最好可以設定一段時間之後,嚴格要求使用者變更密碼呢!
密碼需要變更期限前的警告期限:當帳號的密碼失效期限快要到的時候,
就是上面那個『必須變更密碼』的那個時間時,
系統會依據這個欄位的設定,發出『警告』言論給這個帳號,提醒他『再過 n
天你的密碼就要失效了,請盡快重新設定你的密碼呦!』,如上面的例子,則是密碼到期之前的
7 天之內,系統會警告該用戶。
密碼過期的恕限時間:如果用戶過了警告期限沒有重新輸入密碼,
使得密碼失效了,也就是說,你在『必須變更密碼的期限前,並沒有變更你的密碼!』
那麼該組密碼就稱為『失效的密碼』囉~怎麼辦?沒關係,還有這個欄位的天數設計啊~
意思就是說,當密碼失效後,你還可以用這個密碼在 n 天內進行登入的意思。
而如果在這個天數後還是沒有變更密碼,呵呵!那麼您的帳號就失效了!無法登入!
帳號失效日期:這個日期跟第三個欄位一樣,都是使用 1970
年以來的總日數設定。這個欄位表示:
這個帳號在此欄位規定的日期之後,將無法再使用。
這個欄位會被使用通常應該是在『收費服務』的系統中,
你可以規定一個日期讓該帳號不能再使用啦!
保留:最後一個欄位是保留的,看以後有沒有新功能加入。
舉個例子來說好了,假如我的 dmtsai 這個使用者的密碼欄如下所示:
dmtsai:$1$8zdAKdfC$XDa8eSus2I7nQL7UjRsIy/::7:2:13125:
這表示什麼呢?要注意的是, 13025 是
,所以, dmtsai 這個使用者他的密碼相關意義是:
最近一次更動密碼的日期是
能夠修改密碼的時間是 5 天以後,也就是
以前 dmtsai 不能修改自己的密碼;
如果使用者還是嘗試要更動自己的密碼,系統就會出現這樣的訊息:
You must wait longer to change your password
passwd: Authentication token manipulation error
使用者必須要在
之間的 60 天限制內去修改自己的密碼,若
之後還是沒有變更密碼時,該帳號就會宣告失效;
如果使用者一直沒有更改密碼,那麼在
之前的 7 天內,系統會警告 dmtsai
應該修改密碼的相關資訊;例如當 dmtsai 登入時,系統會主動提示如下的資訊:
Warning: your password will expire in 5 days
如果該帳號一直到
都沒有更改密碼,由於還有兩天的恕限時間,因此, dmtsai
還是可以在
以前繼續登入;
如果使用者在
以前變更過密碼,那麼那個 13025 的日期就會跟著改變,因此,
所有的限制日期也會跟著相對變動喔!^_^
無論使用者如何動作,到了 13125 ,大約是
左右,該帳號就失效了~
透過這樣的說明,您應該會比較容易理解了吧?! ^_^
常常聽到:我的密碼忘記或者被更動了?怎麼辦?
有的時候會發生這樣的情況,就是說,你的 root 密碼忘記了!要怎麼辦?重新安裝嗎?另外,
有的時候是被入侵了, root 的密碼被更動過,該如何是好?
這個時候就必須要使用到 /etc/shadow 這個資料了!我們剛剛知道密碼是存在這個檔案中的,
所以只要你能夠以各種可行的方法開機進入 Linux ,例如單人維護模式,或者是以 live CD (KNOPPIX)
來進入 Linux 系統。之後,將硬碟順利掛載,然後進入 /etc/shadow 這個檔案中,將 root
的密碼這一欄全部清空!然後再登入 Linux 一次,這個時候 root 將不需要密碼
(有的時候需要輸入空白字元) 就可以登入了!這個時候請趕快以 passwd 設定 root 密碼即可。
關於群組:
有效與初始群組、groups, newgrp
認識了帳號相關的兩個檔案 /etc/passwd 與 /etc/shadow 之後,您或許還是會覺得奇怪,
那麼群組的設定檔在哪裡?還有,在 /etc/passwd 的第四欄不是所謂的 GID 嗎?那又是啥?
呵呵~此時就需要瞭解 /etc/group 與 /etc/gshadow 囉~
/etc/group
這個檔案就是在記錄 GID 與群組名稱的對應了~我的 /etc/group 內容有點像這樣:
root:x:0:root
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
也是以冒號『:』作為欄位的分隔符號,共分為四欄,每一欄位的意義是:
群組名稱:就是群組名稱啦!
群組密碼:通常不需要設定,因為我們很少使用到群組登入!
不過,同樣的,密碼也是被紀錄在 /etc/gshadow 當中囉!
GID:就是群組的 ID 啊~
支援的帳號名稱:加入這個群組裡面的所有的帳號,
我們知道,一個使用者是可以加入多個群組的。舉例來說,如果我想要讓 dmtsai
也加入 root 這個群組,那麼在第一行的最後面加上『,dmtsai』,注意不要有空格,
使成為『 root:x:0:root,dmtsai』就可以囉~
比較重要的特色在於第四欄啦,因為每個使用者都可以擁有多個支援的群組,
這就好比在學校唸書的時候,我們可以加入多個社團一樣! ^_^。
不過這裡您或許會覺得奇怪的,那就是:『假如我同時加入多個群組,
那麼我在作業的時候,到底是以那個群組為準?』底下我們就來談一談這個『有效群組』的概念。
有效群組(effective
group)與初始群組(initial group)
還記得每個使用者在他的 /etc/passwd 裡面的第四欄有所謂的 GID 吧?那個 GID 就是所謂的『初始群組 (
initial group ) 』了!也就是說,當使用者一登入系統,立刻就擁有這個群組的相關權限的意思。
舉例來說,我們上面提到 dmtsai 這個使用者的 /etc/passwd 與 /etc/group 還有 /etc/gshadow
相關的內容如下:
[root@linux ~]# grep dmtsai /etc/passwd /etc/group /etc/gshadow
/etc/passwd:dmtsai:x:501:501::/home/dmtsai:/bin/bash
/etc/group:users:x:100:dmtsai
/etc/group:dmtsai:x:501:
/etc/gshadow:users:::dmtsai
/etc/gshadow:dmtsai:!::
仔細看到上面這個表格,在 /etc/passwd 裡面,dmtsai 這個使用者所屬的群組為 GID=501 ,
也就是 /etc/group 裡頭 dmtsai 那個群組啦~因為這是 initial group ,所以,
使用者一登入就會主動取得,不需要在 /etc/group 的第四個欄位寫入該帳號的!
但是非 initial group 的其他群組可就不同了。舉上面這個例子來說,我將 dmtsai 加入 users
這個群組當中,由於 users 這個群組並非是 dmtsai 的初始群組,因此,
我必須要在 /etc/group 這個檔案中,找到 users 那一行,並且將 dmtsai 這個帳號加入第四欄,
這樣 dmtsai 才能夠支援 users 這個群組啊。
那麼在這個例子當中,因為我的 dmtsai 這個帳號同時支援 dmtsai 與 users 這兩個群組,
因此,在讀取/寫入/執行檔案時,針對群組部分,只要是 users 與 dmtsai 這兩個群組擁有的功能,
我 dmtsai 這個使用者都能夠擁有喔!這樣瞭呼?不過,這是針對已經存在的檔案而言,
如果今天我要建立一個新的檔案或者是新的目錄,請問一下,新檔案的群組是 dmtsai 還是 users ?
呵呵!這就得要檢查一下當時的有效群組了 (effective group)。
如果我以 dmtsai 這個使用者的身份登入後,該如何知道我所有支援的群組呢?
很簡單啊,直接輸入 groups 就可以了!注意喔,是 groups 有加 s 呢!結果像這樣:
[dmtsai@linux ~]$ groups
dmtsai users
在這個輸出的訊息中,我知道我同時屬於 dmtsai 及 users 這個兩個群組,而且,
第一個輸出的群組即為有效群組 (effective group) 了。
也就是說,我的有效群組為 dmtsai 啦~此時,如果我以 touch 去建立一個新檔,例如:
touch test ,那麼這個檔案的擁有者為 dmtsai ,而且群組也是 dmtsai 的啦。
這樣是否可以瞭解什麼是有效群組了?
那麼如何變更有效群組呢?這個有兩個方法,不論是那個方法,都是以 newgrp 達成的!
以上面這個例子來說,因為我的 dmtsai 使用者同時擁有 dmtsai 與 users 兩個群組,因此,
dmtsai 當然可以隨時切換 dmtsai/users 成為有效群組囉。所以,我可以下達:
[dmtsai@linux ~]$ newgrp users
[dmtsai@linux ~]$ groups
users dmtsai
此時,我的有效群組就成為 users 了。當然,要能夠順利切換有效群組的話,還需要
/etc/gshadow 的輔助才行~這個等一下我們會說明的。好了,那麼如果你開始在 /home/dmtsai
這個家目錄底下嘗試建立一個檔案,例如『 touch test2 』好了,會發生什麼狀態呢?
呵呵!那個檔案的群組竟然變成 users 了!這樣更清楚有效群組的意義了吧?!
我們額外的來討論一下 newgrp 這個指令,這個指令可以變更目前使用者的有效群組,
而且是另外以一個 shell 來提供登入的喔,所以,以上面的例子來說,
dmtsai 這個使用者目前是以另一個 shell 登入的,而且新的 shell 給予 dmtsai 有效 GID 為
users 就是了。當直接執行『 newgrp groupname 』時,使用者的有效群組會成為 groupname ,
此時雖然使用者的環境設定(例如環境變數等等其他資料)不會有影響,但是使用者的『權限』將會重新被計算。
舉例來說, dmtsai 此時建立的新檔案群組是 users 了~
鳥哥的這個例子當中,要注意的是, dmtsai 這個使用者本來就屬於 users 與 dmtsai 這兩個群組,
所以他可以直接使用 newgrp 來切換有效群組,而要離開新的有效群組時,輸入『 exit 』即可。
假設我的 Linux 系統當中還有另一個群組,名稱為 vbird,那麼 dmtsai 是否可以登入 vbird 這個群組?
在某些前提下是可以的:
vbird 這個群組在 /etc/gshadow 的密碼欄為合法的(不具有 ! 開頭!);
dmtsai 必須讓 root 或群組管理員 (group administrator) 加入到 vbird 群組中。
這兩個大前提缺一不可喔!好了,假設我已經使用 gpasswd 建立了 vbird 這個群組的密碼,
而 dmtsai 也被加入群組成員當中了,那麼當 dmtsai 輸入 『newgrp vbird』時,
嘿嘿! dmtsai 這個使用者的有效群組就能夠變成 vbird 囉~
/etc/gshadow
剛剛講了很多關於『有效群組』的概念,另外,也提到 newgrp 這個指令的用法,
但是,如果 /etc/gshadow 這個設定沒有搞懂得話,那麼 newgrp 是無法動作的呢!
我的 /etc/gshadow 的內容有點像這樣:
root:::root
bin:::root,bin,daemon
daemon:::root,bin,daemon
sys:::root,bin,adm
同樣還是使用冒號『:』來作為欄位的分隔字元,而且你會發現,這個檔案幾乎與 /etc/group
一模一樣啊!是這樣沒錯~不過,要注意的大概就是第二個欄位吧~第二個欄位是密碼欄,
如果密碼欄上面是『!』時,表示該群組不能使用密碼來登入呢!
至於第四個欄位也就是支援的帳號名稱囉~
密碼欄,同樣的,開頭為 ! 表示無法登入;
群組管理員的帳號 (相關資訊在後續介紹)
該群組的所屬帳號 (與 /etc/group 內容相同!)
不過,就以系統的操作來說,事實上,這個 /etc/gshadow 的密碼提供,最大的功能是在於『
讓那些不在群組中的成員,臨時加入該群組用的。 』
實際上使用的情況是很少的~而如果真的要操作這樣的環境,那就得要熟悉 newgrp 的用法囉!
而且還要提供某個群組的密碼出來,真是不好管理。所以,若真的想要讓某個使用者利用該群組的功能時,
還是直接將對方加入群組的支援就好了!省得麻煩~
好啦!既然要管理帳號,當然是由新增與移除使用者開始的囉~底下我們就分別來談一談如何新增、
移除與更改使用者的相關資訊吧~
新增與移除使用者:
useradd, 相關設定檔, passwd, usermod, userdel
要如何在 Linux 的系統新增一個使用者啊?呵呵~真是太簡單了~直接利用 useradd 這個指令即可!
他的指令下達方法如下:
[root@linux ~]# useradd [-u UID] [-g initial_group] [-G other_group] \
-[Mm] [-c 說明欄] [-d home] [-s shell] username
:後面接的是 UID ,是一組數字。直接指定一個特定的 UID 給這個帳號;
:後面接的那個群組名稱就是我們上面提到的 initial group 啦~
該 group ID (GID) 會被放置到 /etc/passwd 的第四個欄位內。
:後面接的群組名稱則是這個帳號還可以支援的群組。
這個參數會修改 /etc/group 內的相關資料喔!
:強制!不要建立使用者家目錄
:強制!要建立使用者家目錄!
:這個就是 /etc/passwd 的第五欄的說明內容啦~可以隨便我們設定的啦~
:指定某個目錄成為家目錄,而不要使用預設值;
:建立一個系統的帳號,這個帳號的 UID 會有限制 (/etc/login.defs)
:後面接一個 shell ,預設是 /bin/bash 的啦~
範例一:完全參考預設值建立一個使用者,名稱為 vbird1
[root@linux ~]# useradd vbird1
[root@linux ~]# ls -l /home
drwxr-xr-x
3 vbird1 vbird1 4096 Aug 30 17:33 vbird1
[root@linux ~]# grep vbird1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird1:x:502:502::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:99:7:::
/etc/group:vbird1:x:502:
# 做這個範例只是想要讓您瞭解,其實系統已經規範好了一些新增使用者時的參數了!
# 因此,當我們使用 useradd 時,系統會主動的去修改 /etc/passwd 與 /etc/shadow,
# 而這兩個檔案內的相關欄位參考值,則會以一些設定檔的內容來規範喔!
# 同時也要注意到,使用 useradd 新增使用者時,這個使用者的 /etc/shadow
# 密碼欄會是不可登入的 (以 !! 為開頭),因此還需要使用 passwd
# 來給予 vbird1 密碼後,才算新增完畢!
範例二:我知道我的系統當中有個群組名稱為 users ,且 UID 700 並不存在,
請用這兩個參數給予 vbird2 建立一個帳號!
[root@linux ~]# useradd -u 700 -g users vbird2
[root@linux ~]# ls -l /home
drwxr-xr-x
3 vbird2 users
4096 Aug 30 17:43 vbird2
[root@linux ~]# grep vbird2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird2:x:700:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:99:7:::
# 看一下,UID 與 initial group 確實改變成我們需要的了!
範例三:建立一個系統帳號,名稱為 vbird3
[root@linux ~]# useradd -r vbird3
[root@linux ~]# grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:101:102::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:13025::::::
/etc/group:vbird3:x:102:
# 很重要喔!您會發現, UID 竟然是 101 ,而 GID 怎麼會是 102,
# 並且與 /etc/group 有對應的關係喔!有沒有加 -r 差很多ㄟ!
我的天吶!這個指令更動的檔案怎麼怎麼多啊?對啊!你才知道啊~
這也是為啥我們說帳號管理是很複雜的啦~而且他參考的設定檔才更多哩!
這個指令至少可能會更動到的地方有:
/etc/passwd/etc/shadow/etc/group/etc/gshadow/home/username
那請教一下,您有沒有想過,以上述的第一個範例一好了,為何 useradd vbird1
他會主動在 /home/vbird1 建立起使用者的家目錄?家目錄內有什麼資料且來自哪裡?
為何預設使用的是 /bin/bash 這個 shell ?呵呵!這就得要說明一下 useradd
所使用的參考檔案囉!
相關設定檔
我們使用 useradd 去新增使用者時,一些在 /etc/passwd 當中的值會去參考『
/etc/default/useradd 』
,這個檔案的內容有點像這樣:
&==預設的群組
HOME=/home
&==預設的家目錄所在目錄
INACTIVE=-1
&==在 /etc/shadow 內的第 7 欄
&==在 /etc/shadow 內的第 8 欄
SHELL=/bin/bash
&==預設的 shell
SKEL=/etc/skel
&==使用者家目錄的內容資料參考目錄
關於群組的建立機制:
當我們直接使用 useradd 來新增帳號時,在預設的情況下,相關的資訊都是參考
/etc/default/useradd 這個檔案內容的設定的。不過,對於使用者群組的建立機制中,
則有兩種不一樣的機制存在的:
以 FC4 為代表,新建使用者時,若無指定 initial group ,
則系統會主動建立一個與帳號相同的群組名稱,以該群組作為使用者的 initial group;
以 SuSE 9 為代表,新建使用者時,預設不會建立新群組,而以 /etc/default/useradd
內的 GROUP 設定值作為使用者的 initial group 。
這應該是很容易理解才是~如果看不懂,請回去前一小節查閱一下 /etc/passwd, /etc/shadow
的相關內容架構。
關於使用者家目錄的參考:/etc/skel/*
在這個檔案當中,比較奇怪的是 SKEL 這個玩意兒了,他是啥?
其實,這個咚咚就是使用者家目錄的參考目錄囉~舉我們的範例一為例,我利用 useradd vbird1
時,他在 /home/vbird1 這個使用者家目錄內的各項資料,都是由 /etc/skel
所複製過去的~所以呢,未來如果我想要讓新增使用者時,該使用者的環境變數 ~/.bashrc
就設定妥當的話,您可以到 /etc/skel/.bashrc 去編輯一下,也可以建立
/etc/skel/public_html 這個目錄,那麼未來新增使用者後,在他的家目錄下就會有 public_html
那個目錄了!這樣瞭呼?
關於使用者 UID/GID 的設定:
另外,與密碼還有 UID/GID 有關的設定檔則是在 /etc/login.defs 裡面,
這個檔案有點像這樣:
/var/spool/mail &==使用者預設郵件信箱放置目錄
PASS_MAX_DAYS
&==/etc/shadow 內的第 5 欄
PASS_MIN_DAYS
&==/etc/shadow 內的第 4 欄
PASS_MIN_LEN
&==密碼最短的字元長度,建議可以改到 6 以上
PASS_WARN_AGE
&==/etc/shadow 內的第 6 欄
500 &==使用者最小的 UID,意即小於 500 的 UID 為系統保留
60000 &==使用者能夠用的最大 UID
500 &==使用者自訂群組的最小 GID,小於 500 為系統保留
60000 &==使用者自訂群組的最大 GID
CREATE_HOME
yes &==在不加 -M 及 -m 時,是否主動建立使用者家目錄?
看到這個檔案後,您應該曉得的是,為何新建的使用者的 UID 都會大於 500 了吧?
而且某些版本的 distributions (例如 SuSE server 9) 則是將 UID_MIN 設定為 1000 ,
所以,他的一般身份使用者的 UID 就會從 1000 起跳囉~這樣瞭解嗎?!
那如果我現在新增一個使用者,這個使用者的 UID 會是多少?答案是:『
如果 /etc/passwd 裡面的帳號所屬的 UID 沒有大於
/etc/login.defs 裡頭的 UID_MIN (在本例中是 500)時,則以 UID 500 來作為一個新帳號的 UID。
如果 /etc/passwd 已有大於 500 以上的 UID 時,則取 /etc/passwd 內最大的那個 UID + 1
作為新設帳號的 UID。』而如果我是想要建立系統用的帳號,所以使用 useradd -r sysaccount
這個 -r 的參數時,就會找『比 500 小的最大的那個 UID + 1 』就是了。 ^_^
關於家目錄預設是否建立:
另外也要注意那個 CREATE_HOME 的設定值,這個設定值也很重要。一般來說,在 FC4 的環境下,
我們使用 useradd useraccount 時,預設是會主動的建立家目錄的,除非使用 -M 這個參數~
至於 SuSE server 9 這個版本來說,嘿嘿!他預設是不建立家目錄的,除非使用 -m 這個參數呢!
因此,在這裡鳥哥也要建議您,如果肯定要建立家目錄的話,不論在那個版本,
你最好還是加上 -m 這個參數來強制建立家目錄吧! ^_^
那麼您就能知道囉, useradd 這支程式在建立 Linux 上的帳號時,至少會參考:
/etc/default/useradd
/etc/login.defs
/etc/skel/*
這些檔案,不過,最重要的其實是建立 /etc/passwd, /etc/shadow, /etc/group, /etc/gshadow
還有使用者家目錄就是了~所以,如果您瞭解整個系統運作的狀態,
也是可以手動直接修改這幾個檔案就是了。
剛剛我們講到了,使用 useradd 建立了帳號之後,在預設的情況下,該帳號是暫時被封鎖的,
也就是說,該帳號是無法登入的,你可以去瞧一瞧 /etc/shadow 內的第二個欄位就曉得囉~
那該如何是好?怕什麼?直接給他設定新密碼就好了嘛!對吧~設定密碼就使用 passwd 囉!
[root@linux ~]# passwd [useraccount]
範例一:如果 root 要幫 dmtsai 修改密碼時?
[root@linux ~]# passwd dmtsai
Changing password for user dmtsai.
New UNIX password:
&==這裡直接輸入新的密碼,螢幕不會有任何反應
BAD PASSWORD: it is based on a dictionary word
&==密碼太簡單時的錯誤!
Retype new UNIX password:
&==再輸入一次同樣的密碼
passwd: all authentication tokens updated successfully.
&==竟然還是成功修改了!
範例二: dmtsai 這個使用者想要修改自己的密碼時
[dmtsai@linux ~]$ passwd
Changing password for user dmtsai.
Changing password for dmtsai
(current) UNIX password: &==這裡輸入『原有的舊密碼』
New password: &==這裡輸入新密碼
BAD PASSWORD: it is based on your username &==密碼的規範是很嚴格的
New password:
BAD PASSWORD: it is based on your username
New password:
BAD PASSWORD: it is based on a dictionary word
passwd: Authentication token manipulation error
先來談一談上面的兩個範例。要注意的是, passwd 這個指令由於使用者的身份而有兩種用法,
如果是 root ,由於 root 具有至高無上的權力,所以 root 可以利用 passwd [username]
來幫使用者修改他們的密碼!因此,『如果使用者的密碼不見了,
root 是可以幫他們進行密碼的修改,而不需要知道舊密碼。』另外,也只有 root
可以隨便設定密碼,即使該密碼並不符合系統的密碼驗證要求~ @_@。例如上面的範例一,
我幫 dmtsai 建立的密碼太簡單,所以其實系統是『警告』過 root 的。
但在重複輸入兩次密碼後,嘿嘿!您還是會看到 successfully 這個成功的字樣呢!
那麼如果是一般身份使用者,或者是 root 想要修改自己的密碼時,直接輸入『 passwd 』,
就能夠修改自己的密碼了。一般身份使用者輸入的密碼會經過系統的驗證,
驗證的機制除了 /etc/login.defs 裡頭規定的最小密碼字元數之外,還會受到
/etc/pam.d/passwd 這個 PAM 模組的檢驗呢!一般來說,您輸入的密碼最好要符合底下的要求:
密碼不能與帳號相同;
密碼盡量不要選用字典裡面會出現的字串;
密碼需要超過 8 個字元;
如果無法經過驗證,那麼該密碼就不被接受,當然還是只能使用舊密碼囉!
此外,僅能接受三次密碼輸入,如果輸入的密碼都不被接受,那只好....重新執行一次 passwd 啊!而,
經過這個 passwd [username] 的動作後,您的帳號就會有密碼囉,此時,
如果察看一下 /etc/shadow ,你就會知道密碼內容被改過囉~ ^_^
所謂這『人有失手,馬有亂蹄』,您說是吧?所以囉,當然有的時候會『不小心』在 useradd
的時候加入了錯誤的設定資料。或者是,在使用 useradd 後,發現某些地方還可以進行細部修改。
此時,當然我們可以直接到 /etc/passwd 或 /etc/shadow 去修改相對應欄位的資料,
不過,Linux 也有提供相關的指令讓大家來進行帳號相關資料的微調呢~那就是 usermod 囉~
[root@linux ~]# usermod [-cdegGlsuLU] username
:後面接帳號的說明,即 /etc/passwd 第五欄的說明欄,可以加入一些帳號的說明。
:後面接帳號的家目錄,即修改 /etc/passwd 的第六欄;
:後面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 內的第八個欄位資料啦!
:後面接 group name,修改 /etc/passwd 的第四個欄位,亦即是 GID 的欄位!
:後面接 group name,修改這個使用者能夠支援的群組,修改的是 /etc/group 囉~
:後面接帳號名稱。亦即是修改帳號名稱, /etc/passwd 的第一欄!
:後面接 Shell 的實際檔案,例如 /bin/bash 或 /bin/csh 等等。
:後面接 UID 數字啦!即 /etc/passwd 第三欄的資料;
:暫時將使用者的密碼凍結,讓他無法登入。其實僅改 /etc/shadow 的密碼欄。
:將 /etc/shadow 密碼欄的 ! 拿掉,解凍啦!
範例一:修改使用者 dmtsai 的說明欄,加上『VBird's test』的說明。
[root@linux ~]# usermod -c "VBird's test" dmtsai
[root@linux ~]# grep dmtsai /etc/passwd
dmtsai:x:501:501:VBird's test:/home/dmtsai:/bin/bash
範例二:使用者 dmtsai 密碼在
[root@linux ~]# usermod -e "" dmtsai
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:99:7::13149:
範例三:暫時凍結 dmtsai 的密碼!
[root@linux ~]# usermod -L dmtsai
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:!$1$24ISJM4K$bbdijdreoieaVaBMAHsm6.:99:7::13149:
# 注意到,密碼欄(第二欄)多了一個 ! 號!那個驚嘆號會讓密碼無效喔!
[root@linux ~]# usermod -U dmtsai
&==這樣就解開了!
範例四:萬一 dmtsai 這個傢伙被建立時忘記建立家目錄,該如何是好?
[root@linux ~]# usermod -d /home/dmtsai2 -m dmtsai
# 如果僅是 -d /home/dmtsai2 表示僅修改 /etc/passwd 第六欄的內容而已,
# 如果加上 -m 這個參數,則表示新建一個家目錄的意思!
# 另外,如果原本的家目錄是 /home/dmtsai ,那 -d /home/dmtsai2 -m
# 會將原本的 /home/dmtsai 更名為 /home/dmtsai2 喔!
usermod 是系統管理員 root 用來管理帳號身份的相關資料的,不過,這個 usermod
程式的功能其實也被很多其他的指令所取代喔!例如 chfn 與 chsh 等等的~
不過,無論如何,您還是可以用 usermod 來微調使用者帳號的相關資料啦!
這個功能就太簡單了~目的在刪除使用者啦~與他相關的檔案有:
/etc/passwd/etc/shadow/home/username
整個指令的語法是:
[root@linux ~]# userdel [-r] username
:連同使用者的家目錄也一起刪除
範例一:刪除 vbird2 ,連同家目錄一起刪除
[root@linux ~]# userdel -r vbird2
這個指令下達的時候要小心了!通常我們要移除一個帳號的時候,你可以手動的將
/etc/passwd 與 /etc/shadow 裡頭的該帳號取消即可!一般而言,如果該帳號只是『
暫時不啟用』的話,那麼將 /etc/shadow
裡頭最後倒數一個欄位設定為 0 就可以讓該帳號無法使用,但是所有跟該帳號相關的資料都會留下來!
使用 userdel 的時機通常是『
你真的確定不要讓該用戶在主機上面使用任何資料了!』
另外,其實使用者如果在系統上面操作過一陣子了,那麼該使用者其實在系統內可能會含有其他檔案的。
舉例來說,他的郵件信箱 (mail box) 或者是例行性命令 (crontab) 之類的檔案。
所以,如果想要完整的將某個帳號完整的移除,最好可以在下達 userdel -r username 之前,
先以『 find / -user username 』查出整個系統內屬於 username 的檔案,
然後再加以刪除吧!
使用者功能:chfn, chsh
不論是 useradd/usermod/userdel ,都是系統管理員所能夠使用的指令,
如果我是一般身份使用者,那麼我是否除了密碼之外,就無法更改其他的資料呢?
當然不是啦!這裡我們介紹兩個一般身份使用者常用的帳號資料變更指令囉!
[dmtsai@linux ~]$ chsh [-ls]
:列出目前系統上面可用的 shell ,其實就是 /etc/shells 的內容!
:設定修改自己的 Shell 囉
範例一:列出目前系統上面所以的 shell ,並且指定 csh 為自己的 shell
[dmtsai@linux ~]$ chsh -l
/sbin/nologin
[dmtsai@linux ~]$ chsh -s /bin/ grep dmtsai /etc/passwd
&==為了防止帳號被亂搞~所以需要輸入 dmtsai 的密碼確認!
Shell changed.
dmtsai:x:501:501::/home/dmtsai:/bin/csh
這個指令重點就是在更改使用者的 shell 囉~如上所述,我就可以修訂好 dmtsai 的 shell 啦!
[root@linux ~]# chfn [-foph]
:後面接完整的大名;
:您辦公室的房間號碼;
:辦公室的電話號碼;
:家裡的電話號碼!
範例一:我用 dmtsai 這個使用者來更改一下自己的相關資訊!
[dmtsai@linux ~]$ chfn
Changing finger information for dmtsai.
Password: &==為了防止帳號被亂搞~所以需要輸入 dmtsai 的密碼確認!
Name []: VBird' Test account
Office []: Tainan office 1
Office Phone []: 06-1234567
Home Phone []: 06-7654321
Finger information changed.
[dmtsai@linux ~]$ grep dmtsai /etc/passwd
dmtsai:x:501:501:VBird' Test account,Tainan office 1,06--7654321:
/home/dmtsai:/bin/bash
這個指令說實在的,除非是你的主機有很多的用戶,否則倒真是用不著這個程式!這就有點像是 bbs
裡頭更改你『個人屬性』的那一個資料啦!這個程式主要都是搭配 finger
這支程式在運作的!不過,由於 finger 這支程式不是很安全,所以預設是沒有安裝他的!
如果您想要玩一下 finger 的話,那麼請先參考 RPM 套件安裝內容後,在安裝 finger 的 RPM
檔案,然後再來玩吧!底下這裡鳥哥還是先簡單的介紹一下就好了!
使用 chfn 這個指令之後,程式會要求您輸入許多的資訊,包含了:
密碼暱稱辦公室號碼辦公室電話家裡電話
不過,這些資訊其實更改的都是原本的 /etc/passwd 裡面的第五欄說明資料啦!
每個資訊中間都以逗號『,』分隔開來而已。如上所示, dmtsai 的說明欄救被更動過囉! ^_^
finger 的中文字面意義是:『手指』,嘿嘿!這個 finger 可以查閱的資料可就多了!
剛剛我們不是使用 chfn 來修改 dmtsai 這個使用者的相關資訊嗎?那些個相關資訊就可以利用
finger 來查閱出來的!他的查詢方法如下:
[root@linux ~]# finger [-s] username
:使用長串資料輸出格式。
範例一:將剛剛 dmtsai 建立的一些使用者資訊呼叫出來視察!
[root@linux ~]# finger dmtsai
Login: dmtsai
Name: VBird's Test account
Directory: /home/dmtsai
Shell: /bin/bash
Office: Tainan office 1, 06-1234567
Home Phone: 06-7654321
Last login Tue Aug 30 15:01 (CST) on tty1 from localhost
有趣吧!這個 finger 還可以用來查詢別部主機的帳號呢!不過,目前通常用在本機帳號的查詢。
因為 finger 算是比較危險的指令,所以,有些 linux distributions 預設是不安裝他的,
不過,如果您按照鳥哥說明的方式來完整安裝 FC4 的話,那就沒有問題的啦!可以操作的。
不過,你或許會覺得有趣的是,怎麼 finger 的結果最底下顯示『No mail. No Plan.』呢?
呵呵! finger 會主動去 /var/spool/mail 查詢看看有沒有該帳號的郵件信箱 (mailbox),
而且還會去查詢 ~/.plan 那個檔案,那就是計畫檔啦~比如說,我在 dmtsai 家目錄底下建立
.plan 這個檔案,他的內容是『DmTsai will write something....』,結果使用 finger 時,
嘿嘿!您可以自行看看結果會怎樣啊! ^_^
id 這個指令則可以查詢某人或自己的相關 UID/GID 等等的資訊,他的參數也不少,不過,
都不需要記~反正使用 id 就全部都列出囉~ ^_^
[root@linux ~]# id [username]
範例一:查閱自己的相關資訊!
[root@linux ~]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),10(wheel)
範例二:查閱一下 dmtsai 吧~
[root@linux ~]# id dmtsai
uid=501(dmtsai) gid=501(dmtsai) groups=501(dmtsai),100(users)
再次強調一下,那個 groups 指的是目前該使用者所屬的所有群組,但是您必須要瞭解什麼是『
初始群組與有效群組 』的差異喔!
新增與移除群組
OK!瞭解了帳號的新增、刪除、更動與查詢後,再來我們可以聊一聊群組的相關內容了。
基本上,群組的內容都與這兩個檔案有關:
/etc/group/etc/gshadow
群組的內容其實很簡單,都是上面兩個檔案的新增、修改與移除而已,
不過,如果再加上有效群組的概念,那麼 newgrp 與 gpasswd 則不可不知呢!
[root@linux ~]# groupadd [-g gid] [-r]
:後面接某個特定的 GID ,用來直接給予某個 GID ~
:建立系統群組啦!與 /etc/login.defs 內的 GID_MIN 有關。
範例一:新建一個群組,名稱為 group1
[root@linux ~]# groupadd group1
[root@linux ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:502:
/etc/gshadow:group1:!::
# 注意注意!在 /etc/gshadow 裡面可以發現,密碼是不許登入的喔!
範例二:新建一個系統群組,名稱為 group2
[root@linux ~]# groupadd -r group2
[root@linux ~]# grep group2 /etc/group /etc/gshadow
/etc/group:group2:x:101:
/etc/gshadow:group2:!::
瞭解 -r 有沒有的差異了嗎?!是的~結果會跟 /etc/login.defs 裡面的設定有關喔!
而且以 groupadd 新增的帳號,預設都不能使用密碼的方式登入的~
也就是說,預設是私有群組,並無法使用 newgrp 來登入的呢!
跟 usermod 類似的,這個指令僅是在進行 group 相關參數的修改而已。
[root@linux ~]# groupmod [-g gid] [-n group_name]
:修改既有的 GID 數字;
:修改既有的群組名稱
範例一:將剛剛上個指令建立的 group2 名稱改為 groupname , GID 為 103
[root@linux ~]# groupmod -g 103 -n groupname group2
[root@linux ~]# grep groupname /etc/group /etc/gshadow
/etc/group:groupname:x:103:
/etc/gshadow:groupname:!::
不過,還是那句老話,不要隨意的更動 GID ,容易造成系統資源的錯亂喔!
呼呼! groupdel 自然就是在刪除群組的囉~用法很簡單:
[root@linux ~]# groupdel [groupname]
範例一:將剛剛的 groupname 刪除!
[root@linux ~]# groupdel groupname
範例二:若要刪除 dmtsai 這個群組的話??
[root@linux ~]# groupdel dmtsai
groupdel: cannot remove user's primary group.
為什麼 groupname 可以刪除,但是 dmtsai 就不能刪除呢?原因很簡單,
『有某個帳號 (/etc/passwd) 的 initial group 使用該群組!』
如果查閱一下,你會發現在 /etc/passwd 內的 dmtsai 第四欄的 GID 就是 /etc/group 內的 dmtsai
那個群組的 GID ,所以囉,當然無法刪除~否則 dmtsai 這個使用者登入系統後,
就會找不到 GID ,那可是會造成很大的困擾的!那麼如果要刪除 dmtsai 這個群組呢?
你『必須要確認 /etc/passwd 內的帳號沒有任何人使用該群組作為
initial group 』才行喔!所以,你可以:
修改 dmtsai 的 GID ,或者是:
刪除 dmtsai 這個使用者。
除了設定群組之外,我們還可以針對系統上面有的群組進行一些『密碼』的給予喔!
這個密碼給予之後,該群組就能夠讓某些人登入成為有效群組呢!挺有趣的。
另外,如果系統管理員太忙了,無法針對每個群組來管理,那麼『
系統管理員還可以將某位使用者設定成為該群組的團長喔!』
很有趣吧~雖然目前比較少人這麼玩了,不過,鳥哥在這裡還是跟大家介紹介紹吧!
關於系統管理員(root)做的動作:
[root@linux ~]# gpasswd groupname
[root@linux ~]# gpasswd [-A user1,...] [-M user3,user4...] groupname
[root@linux ~]# gpasswd [-rR] groupname
:若沒有任何參數時,表示給予 groupname 一個密碼(/etc/gshadow)
:將 groupname 的主控權交由後面的使用者管理(該群組的管理員)
:將某些帳號加入這個群組當中!
:將 groupname 的密碼移除
:讓 groupname 的密碼欄失效,所以 newgrp 就不能使用了!
關於群組管理員(Group administrator)做的動作:
[someone@linux ~]$ gpasswd [-ad] user groupname
:將某位使用者加入到 groupname 這個群組當中!
:將某位使用者移除出 groupname 這個群組當中。
範例一:建立一個新群組,名稱為 testgroup 且群組交由 dmtsai 管理:
[root@linux ~]# groupadd testgroup
[root@linux ~]# gpasswd testgroup
Changing the password for group testgroup
New Password:
Re-enter new password:
# 輸入兩次密碼就對了!
[root@linux ~]# gpasswd -A dmtsai -M dmtsai,vbird testgroup
[root@linux ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:502:dmtsai,vbird
/etc/gshadow:testgroup:1CEVbrcjxO6Ps:dmtsai:dmtsai,vbird
# 很有趣吧!此時 dmtsai 則擁有 testgroup 的主控權喔!若以我們討論區 (
的概念來說,群組管理員有點像『版主』啦!
範例二:以 dmtsai 登入系統,並且讓他加入 vbird1 成為 testgroup 成員之一:
[dmtsai@linux ~]$ gpasswd -a vbird1 testgroup
Adding user vbird1 to group testgroup
很有趣的一個小實驗吧!我們可以讓 testgroup 成為一個可以公開的群組,
然後建立起群組管理員,群組管理員可以有多個。在這個案例中,
我將他設定為 dmtsai ,所以, dmtsai 就可以自行增加群組成員囉~
呼呼!然後,該群組成員就能夠使用 newgrp 囉~
還有印象嗎?我們前面談到 /etc/gshadow 時就提過這個指令了!
『newgrp 會額外以另一個 login 來提供使用者登入到另一個 shell 中,
並且將有效群組改為 newgrp 後面接的那個群組,若沒有接群組,則預設群組為 initial group 』
密碼管理: passwd
再來跟大家提一提那個重要的密碼概念!您得要特別留意的是,今天,您的主機若是遭到入侵,
對方的第一個入侵點自然就是您主機上面帳號的『密碼』了,所以,
如果您的密碼定義的比較嚴格的話,那麼自然對方就不容易猜到你的密碼,自然就會比較有保障啦!
目前一些 Cracker 較常使用的密碼破解軟體,大抵是『字典攻擊法』
及所謂的『暴力破解法』,就字面上的意義來說,
『字典攻擊法』是將字典裡面所查的到的任何單字或片語都輸入的程式中,
然後使用該程式一個一個的去嘗試破解你的密碼,不要覺得這樣的速度似乎很慢,實際上,
現今的電腦運算速度太高了,字典攻擊法的操作效率基本上是很高的!另一個『
暴力破解法』就是直接使用鍵盤上面任何可以使用的按鍵,然後依照組合,以
1 個, 2 個, 3 個…. 密碼組合的方式去破解你的密碼!這個方式就真的比較慢一點,如果你的密碼組合是
6~8 個字元以上,那麼暴力攻擊法還是需要好長一段時間才能夠破解的了的!
由上面的『字典攻擊法』與『暴力破解法』猜測你的密碼的方式來說,您知道如何設定一個好的密碼了嗎?
是的,您的密碼最好需要底下幾個特性:
密碼中含有數個特殊字元,例如 $#@^&* 及數字鍵等等:如同上面提到的,
您的按鍵越奇怪,那麼對方就越不容易使用既有的軟體來破解!
英文字母大小寫混合使用;
密碼長度至少要到 6 ~ 8 個以上才好;
沒有特殊意義的字母或數字組合,並且夾著很多的特殊字元!
這種密碼真的很不容易被破解,但是很不幸的,也很容易被你我忘記!^_^。所以呢,
建議您常常使用一些對別人來說是沒有意義,但是對您確有特殊涵意的字眼!
例如鳥哥常常提到的,我愛我老婆!『
I&Mywife*^』之類的密碼!不容易被猜,也挺容易被你自己記住的!
那麼有沒有『很要命的密碼』呢?有的,底下幾種密碼就很要命:
常用的英文單字:例如 party, park, andyliu, linux,
paper 等等,都不好!容易被字典攻擊法破解!
身邊人物的名字,例如配偶、小孩的名字等等, Tom, andy,
eric 等等,都不好!
單純的日期:例如您的生日啦!等等的,都不夠好!
任何與您相關的數字或其他資訊,例如身份證號、銀行帳號等;
VBird 曾經見過直接以帳號做為密碼的狀況!真是要命~太好猜了!
好了!知道了密碼的重要性,與基本的設定之後,接著下來我們談一談如何手動設定密碼吧!基本上,
root 可以設定『任何樣式的密碼』,而且, root 也可以幫助 user 訂定他們的密碼!至於
user 僅能修改自己的密碼!那麼修改密碼使用什麼命令?就是 passwd
這個命令啦!咦!這裡突然給他想到幾個重要資訊,大家趕緊複習一下:
如何尋找 passwd 這個指令?使用 which passwd 即可
如何察看 passwd 這個檔案的屬性?並請說明他的屬性為何?
使用 ls -l `which passwd` 即可!他具有 SUID 的屬性!
什麼是 SUID ?
就是該程式在被執行的過程中,具有程式擁有者的權限!
我該如何查詢 /etc/passwd 與 /usr/bin/passwd 的用法與架構?
分別使用 man passwd 及 man 5 passwd
這些指令與意義如果都還沒有忘記!恭喜您了!真是不錯!好了,還記得我們密碼放在哪裡嗎?對啦!就是
/etc/shadow 裡面,那個檔案的權限是 -rw------- 所以只有 root 可以修改,因此,
passwd 必需要具有 SUID 才能讓一般使用者修改他們的密碼囉!關於 passwd 的用法,
我們前面已經稍微提過一些囉,在底下我們則針對 root 談一下 passwd 還有什麼好功能??
[root@linux ~]# passwd [-lunxwS] username
:將 username 這個帳號的密碼鎖住 (lock),在 /etc/shadow 內的密碼欄修訂~
:將 -l 的 lock 解開!
:後面接天數 (數字) ,最短天數;亦即是 /etc/shadow 內的第四欄;
:後面接天數 (數字) ,最長天數;亦即是 /etc/shadow 內的第五欄;
:後面接天數 (數字) ,警告天數;亦即是 /etc/shadow 內的第六欄;
:顯示目前這個 username 的相關資訊。
範例一:將 dmtsai 這個使用者的密碼凍結,並觀察他!
[root@linux ~]# passwd -l dmtsai
Locking password for user dmtsai.
passwd: Success
[root@linux ~]# passwd -S dmtsai
Password locked.
[root@linux ~]# grep dmtsai /etc/shadow
dmtsai:!!$1$TDy6D7eg$jVJV/FMaQn14v5Kl7sqw6/:99:7::13149:
範例二:將上述密碼凍結解開
[root@linux ~]# passwd -u dmtsai
其實這個 passwd 指令還挺多用的~尤其很多功能僅有 root 才能執行。
您可以使用 passwd -l 及 passwd -u 來強制讓一個使用者『暫時』無法使用該帳號,
很方便的啦! ^_^
使用者身份切換:
什麼?在 Linux 系統當中還要作身份的變換?這是為啥?
系統平日操作的好習慣:
事實上,為了安全的緣故,
我們大家都會建議您,操作 Linux 時,盡量以一般身份使用者來操作,等到需要設定系統環境時,
才變換身份成為 root 來進行系統管理,相對比較安全啦!避免作錯一些嚴重的指令~~
用較低權限啟動系統服務
相對於系統安全,有的時候,我們必須要以某些系統帳號來進行程序的進行。
舉例來說, Linux 主機上面的一套軟體,名稱為 apache ,我們可以額外建立一個名為 apache
的使用者來啟動 apache 啊,如此一來,如果這個程序被攻破,至少系統還不至於就損毀了~
軟體本身的限制
這裡有個很有趣的問題要來跟大家分享一下,還記得在古老的年代裡面,還沒有
ssh 的時候,我們都是使用 telnet 登入系統的,偏偏系統預設是不開啟 root 以
telnet 登入,那麼好了!我們要怎樣遠端操控我們的 Linux 主機呀!?
因為由前面的介紹我們不難發現,系統當中最特殊的帳號就是
UID 為 0 的使用者了,他具有至高無上的權力!而且是系統管理員必須要具備的身份,
否則怎樣操控主機呢?您說是吧!好了,那麼
telnet 將 root 的登入權限關掉了,而如果我們在製作一個使用者,並將其 UID
變為 0 的話又如何?嘿嘿!很抱歉, telnet 就是認 UID 的,所以肯定還是進不了系統,
這個時候要怎麼辦呀!?就是變換身份呀!將一般使用者的身份變成了 root 就行了!
但是怎樣變換身份呀?怎麼說呢?就是說,一般而言,我們都不希望以
root 的身份登入主機,以避免被怪客入侵了!但是一部主機又不可能完全不進行修補或者是設定等動作!
這個時候要如何將一般使用者的身份變成
root 呢?主要有兩種方式,分別是:
以 su 直接將身份變成 root 即可,但是這個指令卻需要 root 的密碼,也就是說,如果你要以
su 變成 root 的話,你的一般使用者就必須要有 root 的密碼才行;
所以當有很多人同時管理一部主機的時候,那麼 root 的密碼不就很多人知道了?不是很好吧?所以,如果不想要將
root 的密碼流出去呢?呵呵!可以使用 sudo 來進行工作呦!
底下我們就來說一說 su 跟 sudo 的用法啦!
[root@linux ~]# su [-lcm] [username]
:如果執行 su - 時,表示該使用者想要變換身份成為 root ,且使用 root 的
環境設定參數檔,如 /root/.bash_profile 等等。
:後面可以接使用者,例如 su -l dmtsai ,這個 -l 好處是,可使用欲變換身份者
他的所有相關環境設定檔。
:-m 與 -p 是一樣的,表示『使用目前的環境設定,而不重新讀取新使用者的設定檔。』
:僅進行一次指令,所以 -c 後面可以加上指令喔!
範例一:由原本的 dmtsai 這個使用者,變換身份成為 root 。
[dmtsai@linux ~]$ su
Password: &==這裡輸入 root 的密碼喔!
[root@linux ~]# env
USER=dmtsai
USERNAME=root
MAIL=/var/spool/mail/dmtsai
LOGNAME=dmtsai
# 注意到了嗎?如果使用 su 沒有加上 - 的話,那麼很多原本使用者的相關設定會繼續存在,
# 這也會造成後來的 root 身份在執行時的困擾。最常見的就是 PATH 這個變數的問題!
[root@linux ~]# exit
&==這樣可以離開 su 的環境!
[dmtsai@linux ~]$ su -
Password: &==這裡輸入 root 的密碼喔!
[root@linux ~]# env
MAIL=/var/spool/mail/root
LOGNAME=root
# 瞭解差異了吧?!所以,下次在變換成為 root 時,記得最好使用 su - 喔!
範例二:使用 root 的身份,執行 head -n 3 /etc/shadow
[dmtsai@linux ~]$ su - -c "head -n 3 /etc/shadow"
Password: &==這裡輸入 root 的密碼喔!
root:$1$jaldj9843u29jlj9u839jljlcghjlE/:99:7:::
bin:*:99:7:::
daemon:*:99:7:::
範例三:原本是 dmtsai 這個使用者,想要變換身份成為 vbird 時?
[dmtsai@linux ~]$ su -l vbird
Password: &==這裡輸入 vbird 的密碼喔!
這個 su 指令可以讓你在不同的使用者之間切換身份,當 su 後面沒有加上使用者帳號時,
那麼預設就是以 root 作為你切換的那個身份啦!其實,這個指令最大的用途也是在這裡!
就是讓一般使用者變成 root 啦!而要特別留意的則是 su 的使用方式上,
由於『是否讀入欲切換的身份者的環境參數檔案』的不同,
所以您必須要留意喔!
如果只是想要使用 root 的身份來操作系統,但是原有的環境參數並不想要改變,
那麼可以使用『 su 』直接切換身份成為 root ,例如上面的範例一所示。
此時, MAIL/PATH/USER 等環境變數都還是原來那位登入者喔!所以要特別留意例如
PATH 這個可能影響到執行指令進行的變數才行!
如果您想要保留原有的環境參數,那麼環境變數當中,最麻煩的當屬 PATH 這個東西,
由於為了避免一般使用者使用了 root 的管理指令,所以通常 Linux
都會將指令分類放在兩個主要的目錄,分別是 /bin 與 /sbin !那個 /sbin 大多是 super
user 就是 root 用來管理系統的指令啦!所以,可能的話,將你習慣操作的那個帳號的 PATH
重新設定成為 root 的 PATH ,這樣也比較方便呀!
無論如何,還是建議您如果要切換成為某個身份,使用『 su - 』或者是『 su -l usename 』
會比較好一點~否則容易造成環境變數的差異~
另外,如果僅想要執行一次 root 的指令,那麼可以參考 -c "command" 這種 su
的使用方式喔!
當 root 使用 su 切換身份時,他並不需要輸入密碼喔!
雖然使用 su 很方便啦~不過,缺點是當我有很多管理員時,那麼是否每個人都需要知道 root 的密碼?
這樣很危險ㄟ! root 的密碼可能會外流~怎麼辦?沒關係,我們可以使用 sudo 來取代 su 喔。
使用 su 切換身份真的是很簡單啦~不過, su 卻有一個很嚴重的問題,
那就是.....我們必須要知道想要變成的那個人的登入密碼~
舉例來說,如果我想要變成 root ,那麼就必須要知道 root 的密碼才行,
如果我想要變成 dmtsai 來工作,那麼除非我是 root ,否則就必須要知道 dmtsai
這個使用者的密碼才行~而眾所皆知的,如果多人管理一部主機的話,
大家都知道 root 的密碼,那......挺危險的,不是嗎?!
這個時候, sudo 就派的上用場囉~那麼 sudo 是怎樣工作的呢?
當使用者執行 sudo 時,系統會主動的去尋找 /etc/sudoers 檔案,判斷該使用者是否有執行 sudo 的權限;
若使用者具有可執行 sudo 的權限後,便讓使用者『輸入使用者自己的密碼』來確認;
若密碼輸入成功,便開始進行 sudo 後續接的指令;
不過, root 執行 sudo 時,不需要輸入密碼;
若欲切換的身份與執行者身份相同,那也不需要輸入密碼。
要注意的是,使用者『輸入的是自己的密碼,而不是欲切換成為他的那個身份的密碼!』
舉例來說,假設 dmtsai 具有執行 sudo 的權限,那麼當他以 sudo 執行 root 的工作時,
他需要輸入的是 dmtsai 自己的密碼,而不是 root 的密碼!嘿嘿!很棒吧! ^_^
如此一來,大家可以使用自己的密碼執行 root 的工作,而不必知道 root 的密碼,安全多了。
此外,使用者能夠執行的指令是可以被限制的!
所以,我們可以設定 dmtsai 僅能進行 shutdown 的工作,或者是其他一些簡單的指令,
嘿嘿!是否很棒啊!
不過,由上面的說明當中,您也會瞭解,是否具有 sudo 的執行權限是很重要的,
而 sudo 的執行權限與 /etc/sudoers 這的檔案有關。在預設的情況下,只有 root
才能夠使用 sudo 呢!至於編輯 /etc/sudoers 則需要 visudo 這個指令。好了,
底下我們就來看一看 sudo 的語法先。
[root@linux ~]# sudo [-u [username|#uid]] command
:後面可以接使用者帳號名稱,或者是 UID。例如 UID 是 500 的身份,可以:
-u #500 來作為切換到 UID 為 500 的那位使用者。
範例一:一般身份使用者使用 sudo 在 /root 底下建立目錄:
[dmtsai@linux ~]$ sudo mkdir /root/testing
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
Password: &==這裡輸入 dmtsai 自己的密碼
dmtsai is not in the sudoers file.
This incident will be reported.
# 瞧!因為 dmtsai 不在 /etc/sudoers ,所以他就無法執行 sudo 喔!
範例二:假設 dmtsai 已經具有 sudo 的執行權限,如何在 /root 底下建立目錄?
[dmtsai@linux ~]$ sudo mkdir /root/testing
Password: &==這裡輸入 dmtsai 自己的密碼
範例三:如何將 sudo 與 su 搭配使用?
[dmtsai@linux ~]$ sudo su -
範例四:dmtsai 想要切換身份成為 vbird 來進行 touch 時?
[dmtsai@linux ~]$ sudo -u vbird touch /home/vbird/test
上面我進行了四個範例,不過,要注意的是,若我是以 dmtsai 來進行的,
那麼在接下來的五分鐘內,如果你持續使用 sudo 來工作時,那就不需要再次的輸入密碼。
這是因為系統相信你在五分鐘內不會離開而有第二個人跑來操作系統啊!
呼呼!真是很人性化的設計啊~ ^_^。不過如果兩次 sudo
操作的間隔超過 5 分鐘,那就得要重新輸入一次你的密碼了。
而且要注意的是,因為使用一般帳號時,理論上不會使用到 /sbin, /usr/sbin 等目錄內的指令,
所以 $PATH 變數不會含有這些目錄,因此很多管理指令需要使用絕對路徑來下達比較妥當喔!
或者直接修改您自己的 PATH 變數吧!
上面這四個範例我都是以 dmtsai 這個使用者來進行的,但是,在預設的情況中,
您的使用者應該是不能使用 sudo 的~這是因為我們上面提到的啊,還沒有去設定 /etc/sudoers 嘛!
所以囉,如果您要測試上面的範例之前,是需要將 /etc/sudoers 動動手腳的。
不過,因為 /etc/sudoers 需要一些比較特別的語法,因此,如果你直接以 vi 去編輯他時,
如果輸入的字句錯誤,可能會造成無法啟用 sudo 的困擾,因此,建議您一定要使用 visudo
去編輯 /etc/sudoers 喔!(註: visudo 必須要使用 root 的身份來執行!)
[root@linux ~]# visudo
# sudoers file.
# This file MUST be edited with the 'visudo' command as root.
# See the sudoers man page for the details on how to write a sudoers file.
# Host alias specification
# User alias specification
# Cmnd alias specification
# Defaults specification
# Runas alias specification
# User privilege specification
ALL=(ALL) ALL
ALL=(ALL) ALL
&==這裡將 dmtsai 製作成完全可用!
# Uncomment to allow people in group wheel to run all commands
# Same thing without a password
NOPASSWD: ALL
ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
localhost=/sbin/shutdown -h now
使用 visudo 之後,其實就會出現一個 vi 的畫面啦!他就是以 vi 來開啟 /etc/sudoers ,
不過,當我們儲存離開時, visudo 會額外去檢查 /etc/sudoers 內部的語法,
以避免使用者輸入錯誤的資訊了。我上面只有加入一行,就是讓那個 dmtsai 成為可以隨意使用 sudo
的身份而已。基本上, /etc/sudoers 的結構您可以使用 man sudoers 去查閱,
該說明內容說的很清楚,而且還有一些範例呢!鳥哥在這裡僅作一些簡單的說明就是了。
那一行『 dmtsai ALL=(ALL) ALL 』代表的意義是:
使用者帳號
登入的主機 = (可以變換的身份) 可以下達的指令
因此,我上面這一行的意義是:『 dmtsai 這個使用者,不論來自何方,
他可以變換成任何 Linux 本機上面有的所有帳號,並執行所有的指令』的意思啦!
假如您的系統裡面,有個 Web 的軟體是以 www 這個使用者來進行編輯的,
您想要讓 vbird2 這個使用者可以用 www 這個帳號進行編輯,那麼就應該寫成:
vbird2 ALL = (www) ALL
如果錯寫成:
vbird2 ALL = ALL
亦即沒有加上身份宣告的話,那麼『預設是僅能進行 root 的身份切換』而已喔! ^_^
這可是很重要的一個觀念呢!另外,如果想要以使用者的群組來進行規範的話,那麼在
『使用者帳號』的欄位,前面加上『 % 』時,就代表是群組 (group) 的身份了。
舉例來說,我想要讓系統裡面所有屬於 wheel 這個群組的使用者都能夠進行 sudo 時,可以這樣寫:
ALL = (ALL) ALL
而如果你還想要讓這個群組內的使用者在使用 sudo 時,不需要輸入密碼,
那麼可以在『可以下達的指令』那個欄位內多加入一個參數,名為『NOPASSWD:』即可,亦即:
ALL = (ALL) NOPASSWD: ALL
另外,除了單一個人或單一群組之外,我們還可以額外指定一些『帳號別名、主機別名、指令別名』
等等的資料來相互套用喔!真是好棒啊!不過,關於別名的使用上,『必須要使用大寫字元』才行喔!
好了,我們來做一些練習,讓您可以很清楚的知道如何進行 visudo 的設定吧!
例題:我想要建立一個可以幫忙系統管理員變更使用者密碼的群組,名稱為 ADMPW
( 注意,在 sudoers 內,這個別名的名稱一定要是大寫字元才行!)但是這個群組不能修改 root 的密碼喔!
且他們執行 sudo 時,不需要密碼驗證。
答:我以 root 的身份使用 visudo ,進入編輯畫面後,去設定成底下的模樣:
User_Alias ADMPW = vbird, dmtsai, vbird1, vbird3
ADMPW ALL = NOPASSWD: !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, \
!/usr/bin/passwd root
上面的意思是說,我的系統上面有四個帳號,分別是 vbird, vbird1, vbird3 與 dmtsai
這四個帳號加入 sudo 內的 ADMPW 群組中,這四個帳號可以使用 sudo 進行『 /usr/bin/passwd * 』
密碼的更改動作,但是不能 (在指令前面加入 ! 代表不可) 使用 /usr/bin/passwd 或 /usr/bin/passwd root
,如此一來,就讓該 ADMPW 可以更改使用者的密碼,但是不能變更 root 的密碼囉! ^_^
在 /etc/sudoers 裡頭加入別名有很多的好處,舉例來說,以上面的例子來講,
假設未來我有其他的使用者要加入該密碼管理的群組時,直接將帳號加入 ADMPW
那個群組中就好了,很簡單的使用吧! ^_^。再看看下一題:
例題:我的系統中有 DNS 服務,他的啟動指令在 /etc/init.d/named ,如果我想要建立一個 DNSMASTER
的群組來管理他時?如何是好?
答:我以 root 的身份使用 visudo ,進入編輯畫面後,去設定成底下的模樣:
User_Alias DNSMASTER = vbird, dmtsai
Cmnd_Alias DNSCMD = /etc/init.d/named, /usr/bin/vim /var/named/*
DNSMASTER ALL = DNSCMD
看的懂嗎?嘿嘿!因為 DNS 的設定檔大多在 /var/named 裡面,所以,我也允許相關帳號用 vi
去處理 DNS 的設定檔啦!很簡單對吧! ^_^
好了,我們知道 sudo 可以搭配 su 來進行一堆系統的工作對吧!
因為 sudo 僅能進行一次指令,很麻煩,如果我能夠將 sudo 與 su 搭配在一起,不就很棒了嗎?
這個時候,我可以利用上面已經建立好的 ADMPW 群組來新增這一行:
ADMPW ALL = /bin/su
如此一來,在 ADMPW 內的使用者,就可以利用『 sudo su - 』來切換身份成為 root 囉~
真是棒得不得了啊! ^_^
使用者的特殊 shell 與 PAM 模組
我們前面一直談到的大多是一般身份使用者與系統管理員 (root) 的相關操作,
而且大多是討論關於可登入系統的帳號來說。那麼換個角度想,如果我今天想要建立的,
是一個『僅能使用 mail server 相關郵件服務的帳號,而該帳號並不能登入 Linux 主機』呢?
如果不能給予該帳號一個密碼,那麼該帳號就無法使用系統的各項資源,當然也包括 mail 的資源,
而如果給予一個密碼,那麼該帳號就可能可以登入 Linux 主機啊!呵呵~傷腦筋吧~
所以,底下讓我們來談一談這些有趣的話題囉!
特殊的 shell, /sbin/nologin
如果你曾經仔細的看過 /etc/shells 這個系統可用的 shell 檔案,以及
/etc/passwd 這個檔案的內容時,你應該會發現,嘿嘿!怎麼有個怪怪的 /sbin/nologin 啊!
這是什麼 shell 呢?呵呵!趕緊利用 man nologin 就可以知道啦~
其實,這個 shell 通常是給系統帳號使用的,因為這個 /sbin/nologin 事實上並無法給予帳號實際登入,
如果你利用 usermod 修改了 dmtsai 這個使用者的 shell 成為 /sbin/nologin 之後,
再次想要以 dmtsai 重新登入系統時,他在螢幕上會出現這樣的訊息:
This account is currently not available.
嘿嘿!它說的是『這個帳號並不能被允許登入啦!』不過,這個帳號卻可以進行其他的工作喔!
舉例來說,各個系統帳號,列印工作由 lp 這個帳號在管理, WWW 服務由 apache 這個帳號在管理,
他們都可以進行系統程序的工作,但是『就是無法登入主機』而已啦!^_^
換個角度來想,如果我的 Linux 主機提供的是郵件服務,所以說,在這部 Linux 主機上面的帳號,
其實大部分都是用來收受主機的信件而已,並不需要登入主機的呢!
這個時候,我們就可以考慮讓單純使用 mail 的帳號以 /sbin/nologin 做為他們的 shell ,
這樣,最起碼當我的主機被嘗試想要登入系統時,可以拒絕該帳號呢!
另外,如果我想要讓某個具有 /sbin/nologin 的使用者知道,他們不能登入主機時,
其實我可以建立『 /etc/nologin.txt 』這個檔案,
並且在這個檔案內說明不能登入的原因,那麼下次當這個使用者想要登入系統時,
螢幕上出現的就會是 /etc/nologin.txt 這個檔案的內容,而不是預設的內容了!
PAM 模組:/etc/nologin, /etc/securetty
當一個使用者想要登入 Linux 主機時,他受到什麼限制呢?我們說,
他除了必須要通過 /etc/passwd 及 /etc/shadow 的驗證並取得相關的權限資料,
最後獲得一個 shell 之外,事實上,他在登入系統之前,就得要通過 PAM (Pluggable Authentication
Modules, 嵌入式模組) 的驗證才行。
PAM 模組的用途非常的多,除了可以在使用者登入時進行身份的驗證之外,
也可以輔助一些應用程式的驗證之用喔!舉例來說,我們前面提到的密碼修改程式『 passwd 』
,當我們執行密碼修訂的時候,這個程式不是會告訴我們您輸入的密碼是否合於規範嗎?
如果是記錄在字典當中的密碼,或者是與帳號相同的密碼,那麼就會被 PAM 模組打回票,
也就無法通過驗證了!
那麼 PAM 怎麼運作呢?我們同樣以 /usr/bin/passwd 這支程式來作為簡單的說明好了:
使用者開始執行 /usr/bin/passwd 這支程式,並輸入密碼;
passwd 開始呼叫 PAM 模組,PAM 模組會搜尋 passwd 程式的 PAM 相關設定檔案,
這個設定檔一般是在 /etc/pam.d/ 裡面的與程式同名的檔案,所以,在本例中,
PAM 會去搜尋 /etc/pam.d/passwd 這個設定檔;
經由 /etc/pam.d/passwd 設定檔的資料,取用 PAM 所提供的相關模組來進行驗證;
將驗證結果回傳給 passwd 這支程式,而 passwd 這支程式會根據 PAM 回傳的結果決定下一個動作
(重新輸入新密碼或者通過驗證!)
這個過程提供我們幾個重要的資訊:
PAM 的設定檔放置在 /etc/pam.d/ 這個目錄中;
至於更多的環境相關設定則放置在 /etc/security/* 內;
PAM 是透過自己提供的相關模組來進行驗證,模組放置在 /lib/security/* 內。
至於 PAM 相關模組的運作,有興趣的話,您可以前往您 Linux 主機的: /usr/share/doc/pam*
目錄去瞧一瞧,裡面有相當多豐富的資訊可以提供給你參考。
我們這裡僅就使用者登入相關的模組來進行一些簡單的說明而已喔。
PAM 的設定檔設定範例:
反正 PAM 模組就是讓程式呼叫用的,而當程式呼叫時,
PAM 就會利用相對應的設定檔來進行一些驗證就是了。我們還是舉 passwd 為例好了,
如果你去觀察一下 /etc/pam.d/passwd 的內容時,他是這樣的:
[root@linux ~]# cat /etc/pam.d/passwd
pam_stack.so service=system-auth
pam_stack.so service=system-auth
pam_stack.so service=system-auth
基本上,在這個檔案內,每一行都是一個動作,而每個動作都分為四個欄位,分別是:
驗證的類別   驗證的控制標準   使用的PAM模組   該模組的能使用的參數
驗證的類別 (Module type) 共分為四種類,分別說明:
這種類別主要用來檢驗使用者的身份驗證,所以這種類別通常是需要密碼來檢驗的。
這種類別則主要在檢驗使用者是否具有正確的使用權限,舉例來說,當你使用一個過期的密碼來登入時,
當然就無法正確的登入了。
這種類別主要在管理當使用者正確的使用該程式時的環境設定。舉例來說,我們登入 Linux
其實使用的是 /bin/login 這個程式的相關功能的,所以,當實際登入後,在操作 shell
的過程中,都是受 session 這種類別的設定所控制的喔!另外,如果使

我要回帖

更多关于 微信怎么才能转发语音 的文章

 

随机推荐