歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

FreeBSD的基本系統下Shell設置


命令解釋程序shell是與用戶關系最密切的應用程序,用戶主要通過shell使用系統。在每次登錄系統之後,就啟動了一個與用戶交互的shell,這個shell將給出一個提示符等待用戶輸入,(sh為 “$” ,csh為 “%” ,如果是使用root用戶,登錄提示符將是 “#” ),然後對用戶的輸入進行解釋執行。
FreeBSD的基本系統中可以使用的shell有兩個:sh和csh。這兩個基本shell的風格不太相同,不同的使用者常常會根據喜好來在兩者之間進行選擇。當然當前有更好的shell程序可供使用者選擇,這些後續的 shell均是根據sh或csh的風格進一步發展出的,因此可以說在shell中,也有兩種風格,需要使用者根據自己的使用習慣進行選擇。
對於管理員來將,要為使用不同shell的用戶都設置好基本的環境,就必須了解這兩種風格的shell設置方式。系統登錄時,sh將首先執行/etc/profile文件,為每個用戶設置最基本的環境,而csh將使用 /etc/csh.cshrc,csh.login和csh.logout作為系統csh 資源文件。執行了系統級別的登錄文件之後,每個用戶的shell就在該用戶的主目錄下尋找該用戶個人的資源文件:sh使用.profile文件,csh使用.login和.cshrc文件。這些資源文件均使用相應的shell語言,/etc/profile和個人目錄下的.profile使用sh風格的控制語言,/etc/cshrc和個人目錄下的.login、.cshrc使用csh 風格的控制語言。系統管理員可以改動這些資源文件,為用戶提供一個最方便的使用環境。當然,系統管理員沒有必要直接去修改個人主目錄下的資源文件,這些文件應該由用戶自己管理,但是系統管理員可以在生成帳號時為用戶產生缺省的資源文件,以減輕用戶設置資源文件的麻煩。adduser命令缺省使用/usr/share/skel下的文件為用戶提供各種資源文件的缺省設置,這個目錄下除了可以放入shell的資源文件之外,還可以放入其他應用程序的資源文件。由於這些資源文件都是以點開頭的隱藏文件,為了表示清楚,在skel目錄下使用了一種轉換方式,如使用dot.profile 作為.profile的模板。
# ls /usr/share/skel
dot.cshrc dot.mail_aliases dot.rhosts
dot.login dot.mailrc dot.shrc
dot.login_conf dot.profile
在/usr/share/skel中為用戶設置的缺省配置文件,在用戶生成之後,就不會對用戶產生影響了。因此對系統登錄文件進行修改更有效和直接。對於sh風格的用戶,可以更改/etc/profile文件,對csh應更改 /etc/csh.cshrc文件。在這些文件中可以改動shell使用的環境變量,這樣來改變shell的行為方式,或者執行一系列自動操作,完成一些用戶登錄時需要自動執行的任務。
常用的環境變量
EDITOR 設置用戶常用的編輯器,很多程序查看這個變量來啟動具體的編輯器,可以 根據系統的情況更改
HOME 用戶的主目錄的名字,這個變量由login程序設置,一般不需要更改DISPLAYX 使用這個環境變量來標識具體的顯示位置,格式為“計算機名字:X服務 器序號.顯示屏序號” ,例如:xt1:0.0,它不需要在資源文件中進行定義
LANG 系統使用的語言,用於系統的本地化,缺省為 “C” ,具體的設置可以查看 /usr/share/locale 目錄,那裡定義了不同的語言,可以將其設置為zh_CN.EUC來使得一些軟件使用中文字符。
MAIL 用戶mail文件的位置,也不需要改動PATH 使用冒號分隔的一系列路徑,系統用它來查找具體可執行程序,因此這個變量非常重要,可以根據具體的情況改動其值。為了安全的原因,不要將當前目錄作為執行程序的搜尋路徑,尤其對於root用戶。這樣在當前目錄下啟動程序,需要加上路徑,例如啟動當前目錄下的a.out 程序,輸入 “./a.out” 。
MANPATH 使用冒號分隔的一系列路徑,系統用它來查找具體命令的在線手冊,設置方法與PATH相同。
PS1sh 風格的shell使用這個變量的值作為提示符,缺省值為 “$”(root為 “#” )。更現代的sh就增強了提示符的靈活性,可以在提示符中加入當前目錄、用戶名、機器名,命令的序號等。
PS2sh 風格的shell使用這個變量的值作為後續提示符,提示命令還沒有完全輸入,缺省為 “>“TERM 終端的類型,對於需要全屏操作的程序,非常重要。有時要根據情況對設置進行調整。
TZ 時區設置,具體的時區信息位於/usr/share/zoneinfo目錄下,需要設置為適合本地 時區的標准值
可以將用戶的shell設置為特殊的應用程序,來達到對特殊用戶進行限制的目的。例如,僅僅給予用戶一個電子郵件信箱,但不想給他終端使用權,可以將用戶的shell更改為/bin/true或者其他立即退出的程序。為了安全起見,用戶shell應該是一個不存在漏洞的二進制程序,最好不要使用解釋性語言腳本作為登錄shell。由於系統認可的shell 程序是在/etc/shells文件中列出的程序,將特殊用戶的shell設置為特殊的應用程序,但這些應用程序沒有列入shells文件,那麼這個用戶就會被一些應用程序區分出與普通用戶的差異,從而拒絕提供服務。例如ftp服務器程序ftpd,通過檢查用戶的shell是不是標准shell,來區分這個用戶是普通用戶還是用於特定目的的用戶。
注意,不能輕易更改root用戶的shell,因為這可能會造成root無法正常登錄,而使得無法正常執行系統維護。即使是將root的shell更改為其他更新、更強功能的標准shell,例如bash或tcsh,也是不應該。雖然這些shell也是非常成熟的shell程序,仍然不應該使用它們作為root的shell。主要原因是這些 shell一般沒有被安裝到根分區中,那麼當系統進入單用戶狀態時就會發生問題。另外這些shell可能會由於進行版本升級等原因,而偶然形成故障,造成root無法正確登錄。此外,由於這些非標准shell不一定來自於系統的安裝盤,因此也存在對shell來源的安全信任問題,必須保證這些shell不是經攻擊者更改過的版本。如果要使用它們 shell提供的方便特性,可以在系統登錄之後再使用全路徑執行它們。
配置用戶shell
事實上sh與csh,並不是普通用戶的最佳選擇,因為這兩個shell在易用性方面做的不夠好,例如命令行編輯功能不強、不能利用熱鍵重復執行命令等。較新的shell,如bash和tcsh都具有這些方便用戶使用的功能,但必須安裝了這些shell程序之後,才能更改普通用戶的shell設置以使用這些shell程序。更改用戶的shell 可以使用pw、vipw或chsh。
這兩個shell分別遵照sh和csh的風格,因此喜好csh風格的可以選擇tcsh,而喜歡sh風格的選擇 bash。除了這兩種shell之外,還有ksh、zsh等shell可供選擇。如果對兩種shell沒有偏好,可以選擇bash,它是一個GNU軟件,比標准sh功能強大的多。
使用了這兩些增強型shell之後,用戶就可以使用shell提供的命令行編輯功能。按照習慣的不同,可以選擇vi風格的編輯方式或emacs風格的方式,缺省為emacs方式,這種方式使用方向鍵來回溯執行過的命令,並進行修改,而vi風格使用字母命令作編輯鍵,例如使用h、j、k、l四個鍵來移動光標,vi風格的好處是不使用基本鍵盤之外的控制鍵,因而可以適用於任何終端設備,並且進行編輯時手不需離開基本鍵盤,熟練操作之後最為快捷。emacs風格比起vi風格更適合從個人計算機轉向Unix的使用者的習慣。bash, ksh ,zsh下使用下面的命令在emacs 風格和vi風格切換:
bash$ set -o emacs
bash$ set -o vi
tcsh中使用不同的命令:
% bind emacs
% bind vi
還可以為常用的命令設置別名,簡化用戶輸入,例如:
bash$ alias ec=”echo This is a alias”
bash$ ec
This is a alias
shell用於方便用戶操作的另一項能力是自動補全命令或文件名的功能,因為FreeBSD下的文件名可能很長,將它們全部輸入比較麻煩。事實上可以輸入部分名字,然後按Tab鍵(在vi風格下是連續兩次按Esc鍵),shell 將自動補全文件名的剩余部分。如果已經輸入的這部分名字不能確定具體的命令或文件,那麼shell只將能確定的部分補上,
然後響鈴通知使用者繼續輸入以明確具體的文件。
事實上即使在基本的sh或csh下,也可以使用 “*” 等特殊字符,用模式匹配的方式來簡化輸入。
bash$ cd /usr/loca*
bash$ pwd
/usr/local
Unix中的多數程序都具備模式匹配的處理能力,而shell的模式匹配功能最為常用。
shell可以使用這些特殊模式來配置多個文件,達到簡化操作的目的。如果要熟練掌握Unix,必須掌握模式匹配。
當試圖在bash下輸入漢字的時候,除了必須設置終端屬性能接受8位字符之外(執行stty pass8命令),還需要設置bash的輸入輸出轉換,可以在登錄腳本.profile文件中 包括以下設置:
bind 'set convert-meta off'
bind 'set meta-flag on'
bind 'set output-meta on'
Copyright © Linux教程網 All Rights Reserved