1、登陸過程:
第一步:鍵入用戶名和密碼
第二步:系統(tǒng)通過查詢/etc/passwd來檢測是否為有效用戶
第三步:如果登陸正確并且密碼有效,則系統(tǒng)執(zhí)行環(huán)境設(shè)置文件/etc/profile-->.bash_profile。
一般情況下,root的權(quán)限太高,為了防止誤操作造成系統(tǒng)崩潰,我現(xiàn)在的做法是以一個(gè)普通用戶的身份登陸,重新定制環(huán)境,需要root權(quán)限時(shí)以su指令切換過去執(zhí)行。這樣比較安全。對于shell變量的定制,有新的理解。變量的作用很多,可以定制用戶本身的工作環(huán)境,可以保存有用的信息,也可以暫時(shí)保存信息。所以出現(xiàn)了下面變量:
1)本地變量。只是在當(dāng)前shell生命期的腳本中使用,一旦shell中啟動(dòng)另一個(gè)進(jìn)程或者退出,則失效。好處就是不會(huì)對其他的shell或者進(jìn)程產(chǎn)生影響。
2)環(huán)境變量。在建立嵌入式交叉編譯環(huán)境的工具鏈時(shí)設(shè)置過環(huán)境變量,在這里算是對環(huán)境變量的位置特點(diǎn)比較清晰了。環(huán)境變量用于所有用戶進(jìn)程,登錄進(jìn)程稱為父進(jìn)程,shell中執(zhí)行的用戶進(jìn)程稱為子進(jìn)程。按照傳統(tǒng)方法,所有環(huán)境變量均為大寫,這點(diǎn)與本地變量不同。而且,環(huán)境變量在應(yīng)用于用戶進(jìn)程前,必須用export命令導(dǎo)出,而本地變量不需要。環(huán)境變量的兩種定制方法前面已經(jīng)掌握了,在命令行中定制用戶注銷時(shí)就會(huì)丟失,所以最好還是在.bash_profile中定制。
3)位置變量。這種為特殊變量,因?yàn)樗鼈兪侵蛔x的。它的作用是向一個(gè)shell腳本傳遞參數(shù),用位置參數(shù)的方式完成此功能。參數(shù)數(shù)目可以任意多,但是只有前9個(gè)可以被訪問,不過使用shift命令可以改變這個(gè)限制。參數(shù)從第一個(gè)開始,在第9個(gè)結(jié)束;每個(gè)訪問參數(shù)前都要加$符號。其中第一個(gè)參數(shù)為0,表示預(yù)留保存實(shí)際腳本名稱,無論腳本是否有參數(shù),此值均可用。以前為openvpn的啟動(dòng)看過一個(gè)腳本,實(shí)質(zhì)上就是使用了位置變量。現(xiàn)在才理解,也能夠編寫此類腳本了。
4)特定參數(shù)變量。為特殊變量,只讀。共有7個(gè)特定變量,在編程時(shí)用的比較多。
$# 傳遞到腳本的參數(shù)個(gè)數(shù)
$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,此選項(xiàng)參數(shù)可以超過9個(gè)。
$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號
$! 后臺運(yùn)行的最后一個(gè)進(jìn)程的進(jìn)程ID號
$@ 與$#相同,但是使用時(shí)加引號,并在引號中返回每個(gè)參數(shù)
$- 顯示shell使用的當(dāng)前選項(xiàng),與set命令功能相同
$? 顯示最后命令的退出狀態(tài),0表示沒有錯(cuò)誤,其他表明錯(cuò)誤。
2、密碼文件/etc/passwd的格式:7個(gè)域
登陸名:加密的密碼:uid:gid:用戶全名:用戶home目錄:用戶的shell路徑
以前總結(jié)過忘記root密碼的處理方法,當(dāng)時(shí)只是依葫蘆畫瓢,現(xiàn)在才明白原理。只要將加密的密碼域去除,密碼自然也就沒有了。即“::”
-------------------------------------
實(shí)例設(shè)置1
注:使用RedHat 9.0默認(rèn)的bash shell
嵌入式shell變量中有一些預(yù)留的環(huán)境變量,比如HOME,PATH等。現(xiàn)在要利用PS1,PS2來定制自己的命令提示符。
PS1:基本提示符包含shell提示符,缺省是對超級用戶為#,其他為$。
在默認(rèn)情況下,我的命令提示符如下:
[armlinux@lqm armlinux]$ echo $PS1
[\u@\h \W]\$
其中\(zhòng)u代表用戶名,\h代表主機(jī)名,\W代表當(dāng)前的文件夾。
現(xiàn)在我希望我的命令提示符由如下幾個(gè)部分組成,首先要顯示用戶名,然后要顯示絕對路徑,方便使用。那么就可以用如下的命令定制:
[armlinux@lqm armlinux]$PS1="\u: \`pwd\`>"
armlinux: /home/armlinux>
如果想設(shè)置系統(tǒng)主機(jī)名做提示符,則只需令PS1="`hostname`>"即可。
要想始終起作用,當(dāng)然是修改.bash_profile文件,前面剛剛學(xué)了。
PS2:為附屬提示符,缺省符號為>。當(dāng)執(zhí)行多行命令時(shí),出現(xiàn)的符號。這個(gè)一般我習(xí)慣用默認(rèn)的。
舉例:
armlinux: /home/armlinux>cat >>test<<EOF
> test
> test
> test
> EOF
armlinux: /home/armlinux>cat test
test
test
test
如果設(shè)置成"@:",則顯示如下:
armlinux: /home/armlinux>PS2="@:"
armlinux: /home/armlinux>cat >>test<<EOF
@:test
@:test
@:test
@:EOF
armlinux: /home/armlinux>cat test
test
test
test
-------------------------------------
實(shí)例設(shè)置2
注:使用RedHat 9.0默認(rèn)的bash shell
1 使用命令echo顯示環(huán)境變量
#本例使用echo顯示常見的變量HOME
$ echo $HOME
/home/lqm
2 設(shè)置一個(gè)新的環(huán)境變量
variable-name=value;export variable-name
或者
export variable-name=value
$ export HELLO=”Hello!”
$ echo $HELLO
Hello!
3 使用env命令顯示所有的環(huán)境變量
$ env
SSH_AGENT_PID=1875
HOSTNAME=lqm
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
……
4 使用set命令顯示所有本地定義的Shell變量
$ set
BASH=/bin/bash
……
5 使用unset命令來清除環(huán)境變量
$ export TEST=”test” #增加一個(gè)環(huán)境變量TEST
$ env | grep TEST #此命令有輸出,證明環(huán)境變量TEST已經(jīng)存在了
TEST=test
$ unset $TEST #刪除環(huán)境變量TEST
$ env | grep TEST #此命令無輸出,證明環(huán)境變量TEST已經(jīng)存在了
6 使用readonly命令設(shè)置只讀變量
如果使用了readonly命令的話,變量就不可以被修改或清除了。示例如下:
$ export TEST="Test..." #增加一個(gè)環(huán)境變量TEST
$ readonly TEST #將環(huán)境變量TEST設(shè)為只讀
$ unset TEST #會(huì)發(fā)現(xiàn)此變量不能被刪除
-bash: unset: TEST: cannot unset: readonly variable
$ TEST="New" #會(huì)發(fā)現(xiàn)此變量不能被修改
-bash: TEST: readonly variable
7 用C程序來訪問和設(shè)置環(huán)境變量
對于C程序的用戶來說,可以使用下列三個(gè)函數(shù)來設(shè)置或訪問一個(gè)環(huán)境變量。
getenv()訪問一個(gè)環(huán)境變量。輸入?yún)?shù)是需要訪問的變量名字,返回值是一個(gè)字符串。如果所訪問的環(huán)境變量不存在,則會(huì)返回NULL。
setenv()在程序里面設(shè)置某個(gè)環(huán)境變量的函數(shù)。
unsetenv()清除某個(gè)特定的環(huán)境變量的函數(shù)。
另外,還有一個(gè)指針變量environ,它指向的是包含所有的環(huán)境變量的一個(gè)列表。下面的程序可以打印出當(dāng)前運(yùn)行環(huán)境里面的所有環(huán)境變量:
#include <stdio.h>
extern char**environ;
int main ()
{
char**var;
for (var =environ;*var !=NULL;++var)
printf ("%s \n ",*var);
return 0;
}
8 通過修改環(huán)境變量定義文件來修改環(huán)境變量。
需要注意的是,一般情況下,這僅僅對于普通用戶適用,避免修改根用戶的環(huán)境定義文件,因?yàn)槟菢涌赡軙?huì)造成潛在的危險(xiǎn)。
$cd #到用戶根目錄下
$ls -a #查看所有文件,包含隱藏的文件
$vi .bash_profile #修改環(huán)境變量定義文件
紅色部分也可以用一條語句代替:$vi ~/.bash_profile。在這里,~實(shí)際上是shell變量的擴(kuò)展。它包含著內(nèi)建命令cd。可以這樣理解,~就是你當(dāng)前登錄shell的根目錄的絕對路徑。假設(shè)你的當(dāng)前用戶是armlinux,那么你執(zhí)行l(wèi)s ~,將會(huì)顯示/home/armlinux文件夾下的內(nèi)容。同樣的,$vi ~/.bash_profile展開后,實(shí)際上是$vi /home/armlinux/.bash_profile。所以,很容易理解為什么與紅色部分等價(jià)了。
然后編輯你的PATH聲明,其格式為:
PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>
你可以自己加上指定的路徑,中間用冒號隔開。環(huán)境變量更改后,在用戶下次登陸時(shí)生效,如果想立刻生效,則可執(zhí)行下面的語句:$source .bash_profile。如果在命令行中定制環(huán)境變量,那么你所設(shè)置的環(huán)境變量的生命期就是你當(dāng)前shell用戶的登錄時(shí)間。一旦退出,那么環(huán)境變量也就失效了。所以,如果想只要登錄改用戶,就要使環(huán)境變量生效,還是在.bash_profile中修改。至于原因,這就與shell的激活模式相關(guān)了,可了解相關(guān)內(nèi)容。
需要注意的是,最好不要把當(dāng)前路徑”./”放到PATH里,這樣可能會(huì)受到意想不到的攻擊。完成后,可以通過$ echo $PATH查看當(dāng)前的搜索路徑。這樣定制后,就可以避免頻繁的啟動(dòng)位于shell搜索的路徑之外的程序了。