03操作linux

看完本章後你必須會使用以下最基本的命令
passwd  設定密碼
pwd  目前所在目錄
cd 路徑  到指定目錄
cd  回到主目錄
cd ..  回到上一層目錄
mkdir directory  建立目錄
rmdir directory  移除目錄
ls  查詢目錄內容
ls -a  查詢目錄全部內容
ls -l  查詢目錄下檔案的額外資訊
ls -h  將檔案大小欄位以容易解讀的方式顯示
cat filename  遊覽檔案
more filename  分頁遊覽檔案
ln  建立符號連結
&  將工作放入背景執行
ps  查詢正在執行的行程
ps -a  查詢全部正在執行的行程
ps -x  查詢沒有控制終端機的行程
ps -c command  查詢command的行程
fg process-id  把背景工作帶回前景
kill process-id  刪除背景行程
man 命令  查詢手冊頁面
apropos 命令  查詢與命令有關的手冊頁面
echo $PATH  顯示預設搜尋路徑為何
export PATH=$PATH:路徑名稱  加入新的搜尋路徑
echo $SHELL
  查詢目前使用的shell
chsh  改變所使用的shell
以及七個技巧
1虛擬主控台
2常用按鍵
3自動補齊
4選用己輸入命令
5縮短檔名
6轉向符號
7管線
還有二個重點,包括了解權限表示法以及修改權限的方法
最後還要明白檔案與目錄作用及其它補充說明
先進入Linux,登入帳號名稱和密碼兩者都是有大小寫的區分

如果用root帳號進入,提示符號可能只是簡單的 # 符號,但如果是用其他使用帳號進入,則出現的提示符號常是一個金錢的符號 $ ,登入後,就會處於shell層級(類似dos的黑底白字畫面),而所看到的提示符號稱為shell提示符號

-------
正式開始
-------

一 命令篇
passwd
要改root的密碼,只要鍵入passwd即可,系統會提示你輸入舊的密碼,用來確定你是否為本人,接著在打入新的密碼,即可修改成功

pwd
用來印出目前自己所在工作目錄的命令,換句話說,可以用來看自己目前正在那個目錄(或俗稱的資料夾)下,例如,如果你正在 /home/inet 目錄下:
$pwd
/home/inet

cd directory
用來移至另一個目錄 (cd後面要空一格接目錄),假設你要去 /user/bin 這個目錄就鍵入:
$cd /usr/bin
$pwd
/usr/bin
cd
如果只打cd,則會回到主目錄,用上面的例子來舉例:
$cd
$pwd
/home/inet
cd ..
用來回到目前所在目錄的上一層目錄

mkdir directory
用來建立新目錄,例如想建立一個programs的目錄,則鍵入:
$mkdir programs
或用完整路徑名稱也可以:
$mkdir /home/inet/programs
rmdir directory
移除目錄的,例如想移除programs的目錄,則鍵入:
$rkdir programs

ls
可用來查看現在目錄中有些什麼,不加參數會顯示目前工作目錄中的內容,若要查看其他目錄的內容,可以加入參數來指定,例如:
$ls /home
ls -a
會把目錄中全部的內容顯現出來,參數-a是指全部 (all) 的意思,例如:
$ls -a
. .bashrc .fvwmrc
.. .emacs .xinitrc
.bash_history .exrc
單獨一個點,表示目前的工作目錄,兩個點表示目前工作目前的上一層目錄,而其他以點開頭的是隱藏檔
ls -l
會顯示檔案的一些額外訊息,參數-l是指long 的意思,例如:
$ls -l
– rw-r–r– 1 inet inetclub 2048 jul 19 2005 index.php
– rw-r–r– 1 inet inetclub 1028 jul 19 2005 set.php
d rw-r–r– 1 inet inetclub 1028 jul 19 2005 inetweb
第一個欄位的 – 代表是一般檔案,d代表的是目錄
ls -h
會把檔案大小的欄位改以較容易解讀的單位表示 

遊覽檔案有以下幾種方法,如果要看.bashrc檔案可用這些命令:
emacs filename
會用emacs來編輯,這時就可以順便看此檔案的內容了,例如:
$emacs .bashrc
cat filename
如果只想快速看過檔案,而不是要編輯檔案可以用這個方法,例如:
$cat .bashrc
more filename
這樣每次會列出一個畫面大小的內容,並等待你按下空白鍵,然後再繼續下一頁,例如:
$more .bashrc

ln
可以做符號式連結,類似windows的捷徑,例如想要做一個prog的連結,並把它指向prog.1.1這個實際的檔案:
$ln -s prog.1.1 prog
打ls -l prog看剛建立的連結檔案
$ls -l prog
lrwxrwxrwx 2 inet inetclub jul 19 2005 prog -> prog.1.1
一開始的 l 字元表示這個檔案是一個連結檔,->表示它所連結的實際檔案

ps
用ps命令,可以知道有那些行程在執行,例如
$ps
PID TTY STAT TIME COMMAND
1663 pp3 S 0:01 -bash
1676 pp3 R 0:00 ps
PID是專屬該行程的識別號碼,又叫做行程號碼,TTY會顯示該行程正在那一個終端機上執行,STAT顯示該行程狀態,S代表suspended,T代表STOP,R代表正在執行的run。TIME表示該行程佔用多少CPU時間
ps -a
可以查看整個系統的所有行程,-a代表all process所有行程
ps -x
可以將那些沒有控制終端機的行程也都顯示出來
ps -c command
命令後加所知道的行程名稱,可看到符合指定名稱的行程,例如:
$ps -c httpd

&
在命令結尾處加 & 即可將該命令放到背景去執行,例如:
$gcc invinitjig.c &
[1] 21457
1是指定給該命令的工作序號,21457是行程識別碼 ( proess ID )
fg process-id
如果要把工作帶回前景,就用fg命令,例如:
$fg %1

$fg 21457

kill process-id
如果想終止背景中執行的命令,可用kill命令,例如:
$kill %1

man
找出某個命令的相關訊息,可以使用手冊頁面,只需鍵入man命令即可,例如:
$man ls
或者加入所要的章節來搜尋某個命令:
$man 1 ls
apropos
使用apropos 可以顯示出所有與某個命令有關的手冊頁面,例如:
$apropos edit

一個命令就是一個檔案;例如,ls命令是位在bin目錄下的一個可執行檔 (binary file ),因此除了輸入ls之外,也可以輸入完整的路徑名稱,也就是絕對路徑 (absolute pathname ),例如:
$/bin/ls
不過有些命令並不是檔案的形式,cd即是一例,這類命令大都會影響到shell本身,因而必須被shell所充分瞭解和直接執行,由於他們己經是shell的一部份,因此也被稱為內建命令

echo $ PATH
要察看預設搜尋路徑,只要鍵入 echo $ PATH即可,例如:
$echo $path
/usr/local/bin:/usr/bin:/usr/X11R6/bin:/bin:…略
export PATH=$PATH:路徑名稱
如果要加入一個搜尋目錄,只需鍵入 export PATH=$PATH:路徑名稱,例如想在原來的路徑加上 /usr/sbin而成為現在的搜尋路徑,做法如下:
$ export PATH=$PATH:/usr/sbin

echo $SHELL
可以顯示出目前所使用的shell,並把shell所在的完整路徑顯示出來,例如:
$ echo $SHELL
chsh
可以改變所使用的shell,例如:
$ chsh

-----
休息一下
-----

二 技巧篇
技巧1 虛擬主控台
按 住alt + f1~f8鍵或ctrl + alt + f1~f8,可以看到一個全新的畫面和登入的提示符號,你可以登入不同的虛擬主控台,彷彿你是不同的使用者一般,也可以在虛擬主控台之間切換,做不同的 事;甚至可以在各個主控台分別執行x視窗。X視窗系統預設使用的是第7個虛擬主控台,

技巧2 常用按鍵
ctrl U 會把從遊標停駐處直到那一行開頭的部分刪除
ctrl C 在輸入命令並開始執行時可以用來中斷執行
ctrl Z 在輸入命令並開始執行時可以用來暫停執行,若要繼續執行直需鍵入fg即可
ctrl S 可以暫時中止終端機的輸出
ctrl Q 可將ctrl s的暫時輸出取消
ctrl T 可以交換遊標停駐處兩邊的字元

stty命令可用來修復失效的按鍵,例如
$ stty erase ^H
$ stty kill ^U
$ stty intr ^C
$ stty susp ^Z
ps:^代表ctrl鍵

技巧3 自動補齊
如果輸入一行未打完的指令,然後按下tab鍵,shell會自動幫你填滿完整的指令,例如:
$cd /usr/inc
然後不要按enter,改按tab鍵,shell就會自動加上lude以補齊/usr/include這個目錄名稱
如果開頭的字串是相同的,shell就會把字母填補到開始不一樣的地方,如果使用bash的shell,按兩下tab鍵,則會顯示出所有補齊的可能性,例如
$cd /usr/l
不按enter,而改按兩次tab鍵,bash將會印出
lib local

技巧4 選用己輸入命令
按一下上方的按鍵,則會出現前一個你曾輸入過的命令

技巧5 縮短檔名
可以用一個問號 ? 來表示任何一個字元;用一個星號 * 來表示任何長度的字串,例如有一個目錄,包含下列的C原始程式檔案
$ls
inv1jig.c inv2jig.c inv3jig.c invinitjig.c invpar.c
只想列出包含數字的三個檔案就鍵入:
$ls inv?jig.c
inv1jig.c inv2jig.c inv3jig.c
或是用另一種做法:
$ls inv[1-3]jig.c
inv1jig.c inv2jig.c inv3jig.c

$ls inv[123]jig.c
inv1jig.c inv2jig.c inv3jig.c
如果對第二個檔沒興趣就鍵入:
$ls inv[13]jig.c
inv1jig.c inv3jig.c
如果想要看到invinitjig.c檔案,則鍵入
$ls inv*jig.c
inv1jig.c inv2jig.c inv3jig.c invinitjig.c

技巧6 轉向符號
如果在命令的後面加上一個 > 符號和一個檔名,這個命令的執行結果就會被送到該檔案中,例如,要擷取ls的執行結果並結果放入binaries檔案,可以鍵入:
$ls /usr/bin > ~/binaries
然後就會建一個全新的binaries檔案或者取代過去,但一般使用者常會不注意覆該掉一個己存在的檔案,所以可用$noclobber=1來防止覆寫,或用 >> 轉向符號把輸出結果附加到binaries的檔尾,例如:
$ls /usr/bin >> ~/binaries

技巧7 管線
用 某個程式來處理另一個程式的輸出結果,例如想在把第一個命令的輸出結果給第二個命令來執行,只要這中間放一條垂直線 ( | ) 即可,例如我想把du程式的結果送到sort程式。下面的du是顯示磁碟使用狀況的命令,會顯示每個工作目錄下每個檔案各佔用的區塊 ( block ) 數目,而sort程式是用來把其他命令的輸出排列成一個有用的順序,sort的 -n參數表示以數字大小來排序,而非依照ASCII順序,-r表示用由大到小的順序來排序。不用管線的做法可能會像以下這樣:
$du > du_output
$sort -nr du_output
第一行把du的輸出結果存到du_output檔案裡,第二行用sort把du_output的結果用輸出排序結果,但使用管線後做法就像變成:
$du | sort -nr
du命令所產生的結果會丟給sort命令,但如果檔案太多可以在用第二道管線接more的命令,就可以一頁一頁的顯示,例如:
$du | sort -nr | more
如果只想顯示前十行,就用head命令即可,例如:
$du | sort -nr | head
或想顯示倒數十行可用tail,例如
$du | sort -nr | tail

-----
休息一下
-----


三 檔案權限篇
檔案的所有權和使用權限是系統安全的問題的重心。一般來說,如果出現 Permission denied 訊息,表示你想做的事己超過被允許的權限

重點一 了解權限表示法
unix下有三種檔案權限:
read可讀權限:表示你可以讀取檔案內的資料
write可寫權限:表示你可以改變或刪除該檔案
execute可執行權限;表示你可以把該檔案當作程式執行

對目錄而言,權限有著不同的意義:
read可讀權限:表示你可以列出目錄中的內容,也就是說,可以知道該目錄下有那些檔案
write可寫權限:表示你可以在該目錄中新增或移除檔案
execute可執行權限;表示你可以查尋並列出在該目錄下檔案的相關訊息

unix有三種不同階層的權限授權範圍:所有者 ( owner )、群族 ( group ) 及其他 ( other ) 。其他這個階層包括所有者和所屬群族以外可以接觸這個系統的人,而通常檔案的所有者就是建立該檔案的人,而每個使用者會屬於一個預設的群組

使用ls -l可以列出像這樣的資訊
– rwxr-xr-x 2 inet inetclub 10240 jul 19 2005 index.php
我們只要看以下五個即可:
inet:檔案的所有者
inetclub:檔案的群族
rwxr-xr-x:畫底線的前三個位元適用於檔案的所有者
rwxr-xr-x:畫底線的中間三個位元適用於所屬群族的成員
rwxr-xr-x:畫底線的後三個位元用來規範其他使用者的權限


重點二 修改權限
如果想為一個新的使用者在 /home 下建立新的目錄,則必須以root的身份登入來建立所有的目錄和檔案,但在完成之後,你得將這些檔案與目錄的所有者改設為該使用者,否則這個使用者根本無法用你幫他建立的環境

chown命令可以改變檔案所有者,但只有root能執行,而chgrp命令可改變檔案的所屬群族,例如想把sampsoft的檔案所有者和所屬群族改成inet:
$ chown inet sampsoft
$ chgrp inet sampsoft
或是用:
$ chown inet.inet sampsoft

chmod可用來改變所有階層的檔案權限的模式,換句話說是可以一次改變所有者權限、所屬群族權限和其他使用者權限,例如想給header檔案可執行權限:
$ chmod +x header
或加入可讀取的權限:
$ chmod +r header
如果想移除可執權限:
$ chmod -x header
如果只想改變自己的權限,而不想改變所有階層的權案權限:
$ chmod u+x header
加號前面表示該權限的適用對象 ( u、g、o ) 加號後面是指權限類別 ( r、w、x )
所以如果想改變自己與該檔案所屬群族的權限就鍵入:
$ chmod ug+x header
也可以一次指定多種權限
$ chmod ug+rwx header

另外一種權限表示法,稱為絕對模式,必須用位元的權點以及八進位表示法來看它。絕對模式和3個權限及階層的對應關係如下,粗體表示絕對模式

user使用者階層
read=400 write=200 excute=100
group所屬群族階層
read=40 write=20 excute=10
other其他使用者階層
read=4 write=2 excute =1

假設你想要為自己開啟可讀的權限,但不想讓其他人擁有這項權限,這時必須指定400這個數字,所以chmod命令應該要這樣用:
$ chmod 400 header
若要指定可讀權限給每全部的人,就要把三個限層的權限所代表的數字加起來,也就是400+40+4=444,用444來代表,所以chmod命令會像這樣
$ chmod 444 header
於$ chmod +r header相等,如果要指定所有人可讀和可執行的權限,必須把各階層所代表可讀和可執行的對應位元加起來,也就是444+111=555,所以對應命令是:
$ chmod 555 header
這於$chmod +rx header相等

-----
休息一下
-----


四 檔案與目錄
組態設定 (configuration )是unix非常重要的一環,主要是用來完全掌握使用環境,並減少打字或其它需要親自動手的勞力工作,這些檔案的名稱大都以rc結尾,表示resource configuration資源組態的意思

啟動命令檔 (starup file ) 通常會在你的登入主目錄下,檔名大都以 . 開頭,因此在正常情況下,ls命令不會將他們顯示出來,例如:
.bashrc 這是bash用的shell script
.bash_profile 這是bash另一個shell script
.cshrc 這是c shell或tcsh所用的shell script
.login 這是c shell或tcsh所用的shell script
.emacs emacs編輯器所用的設定檔
.exrc vi編輯器所用的設定檔
.newsrc 新聞閱讀器所用的網路新聞群族清單
.Xdefaults x視窗系統的應用程式所用
.xinitrc  用於x視窗系統
.kde/sbare/config kde桌面環境的所有組態設定檔
.gnome  gnome桌面環境的所有組態設定檔

unix並未強置規定檔案的存放位置,但多年以來卻逐漸形成了一些慣例

在 /home 目錄下,每個使用者都有一個子目錄;如果你登入的名稱是inet,則你的私人檔案將會被放在 /hoem/inet 目錄下,這就是個人主目錄 (home directory);當然,你還可以在這個主目錄下建立更多的主目錄,附帶一提,/home 是在 / 目錄(又稱根目錄)之下

除了home之外的重要目錄:
/bin 存放最基本的unix命令,如ls
/usr/bin 放置其他的命令
/usr/sbin 存放管理系統用途的命令
/boot 核心或其它系統開機時用到的檔案有時候會放在此目錄下
/etc 存放網路、NFS、電子郵件這類子系統所用到的檔案
/var 用來存放一些管理性質的檔案,如日誌檔
/var/spool 暫時存放等待列印的檔案
/usr/lib 用來放置標準函式庫
/usr/lin/X11 存放X視窗系統所發行的套件
/usr/include 存放C語言所使用之標頭檔
/usr/src 在此系統上所編譯建構之各程式的原始程式碼存放之處
/usr/local 系統管理人員在本地端所新增的程式及資料檔會存放在此
/etc/skel 啟動設定檔的樣本;可以用這些檔案會新使用設定登入環境
/dev 這個目錄存放所謂的裝置檔案
/proc 檔案系統與執行中的行程、CPU及記憶體等硬體之間的界面

目錄名稱的各個部份是用斜線 ( / ) 來隔開的,而所謂的「路徑名稱」pathname就是指這整個用斜線分隔的串列

而倒斜線 ( ) 在unix中則有不同的意義,用來當作一個控制字元,也就是說如果它後面所緊接的一個字元原本具特殊含意, 會將些特殊含意關閉


-----
結束囉
-----

五 其它補充
現在很多電腦的活動都極為複雜,它們必須和其它執行中的行程互動,所以無法單從一個檔案或其它靜態資源來了解

以FTP 為例,你可能己經用過它來下載Linux的相關文件或軟體,當你FTP到另一個系統上時,該系統會執行另一個程式來接受你的連線,並且解析你所下的命令, 這個程式叫做ftpd,其中的d代表daemon。daemon是unix系統中的特殊名稱,意指在背景中不斷執行一種伺服程式,大部分的 daemon都用來處理網路上的活動

UNIX的整個運作,建立在「行程」( process ) 的觀念上,process是一個獨立執行的程式,擁有自己一套資源。在UNIX上,系統的有限資源,如記憶體,磁碟空間,都是由核心這個萬能的程式來統籌管理,除此之外,系統上所有其它東西都是以行程為主體
例如,在你登入前,終端機是由getty行程所監控;登入之後,getty會自我了結並將終端機的掌控權交給shell接管,shell是另一個行程;而在你登出系統之後,核心會再啟動另一個新的getty行程

由一個行程衍生為兩個叫做分叉 ( fork ),例如,如果使用x視窗系統,每個行程都會開啟一個以上的視窗,供你鍵入命令的那個視窗是xterm行程所有的,這個行程會分叉出一個shell在該視窗中執行,而當你輸入命令時,這個shell會分叉出更多的行程