FreeBSD連載(14):shell設置

1999年11月16日 15:04 王波

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'