Linux指令筆記


chmod 變更檔案權限

權限則是依照User(Owner), Group, Other的讀取,寫入和來排列
- rwx rwx rwx 是權限全開,可用chmod 0777 filename來設定
- rwx rwx r-x 是Other無法寫入,可用chmod 0775 filename來設定
- rw- rw- rw- 是開啟讀寫權限,但不可執行,可用chmod 0666 filename來設定
- rwx --- --- 是User本身權限全開,可用chmod 0700 filename來設定

目錄的r是可以查看目錄中有哪些檔案
目錄的w是建立,移除目錄下的檔案
目錄的x是可以cd 切換到該目錄中

如果想要開啟某個script的執行權限可以用chmod +x filename設定
chmod u+x   是賦予擁有者執行權限
chmod a=rw  表示所有人都賦予讀寫權限

除了上面的9個設定外,還有3個權限控制用的設定,這只要是Linux的file system都會支援這12種的檔案存取模式。如果是用Windows使用的FAT則沒有這些設置,NTFS的話則是下沒有下面這三種設定。
  • SUID
    chmod o+s file
    SUID是Set User ID的意思,如果有設定,則在Owner的執行權限會寫成S或是s,因為它的特性是為了讓執行檔被執行時,有檔案擁有者的權限,所以才會設計寫在Owner的x位置,讓一般使用者可以執行某些原本需要root或是其他系統權限的指令。例如改密碼的passwd指令,就是設定SUID的方式達成。
    -rwsr-xr-x 1 root root 47032 May 17 2017 /usr/bin/passwd
    然後擁有者是root,所以passwd執行時,可以存取root可存取的密碼檔案/etc/passwd
    -rw-r--r-- 1 root root 1207 Feb 12  2017 /etc/passwd
    只不過有些執行檔千萬這麼設置,例如是vim,不然所有的使用者都可以使用vim,編輯系統上所有的檔案,包含重要的系統檔。
  • SGID
    chmod g+s file
    Set Group ID則是對執行檔和目錄有效,如果有設定,則Group執行權限會寫成S或是s,小s表示Group沒有執行權限。
    對執行檔的差異只在是給予Group的權限而不是擁有者權限,當然,如果你設定root group,那就還是root。
    對目錄的話,是該目錄下的新增檔案的Group會是跟目錄Group相同,而不是建立者的Group。
  • Sticky bit 黏滯
    chmod +t file
    如果有設定,則Other執行權限會寫成T或是t,小t表示Other沒有執行權限。
    對執行檔設置是為了讓它保留在記憶體中,下次載入就直接使用該區段記憶體,對於會反覆執行的程式的載入有加速的效果,不過這是以前的作法,現在比較少用了。
    對於檔案來說,設置這個就是只有owner和root可以刪除或變更檔名。
    對於目錄來說,設置這個就只有owner和root可以刪除/變更旗下的檔案/目錄。(/tmp就是有帶Sticky屬性的目錄)
     drwxrwxrwt  0 root root  4096 Jan 18 23:45 tmp
ls 列出檔案
ls -l # 檔案詳細訊息
會顯示檔案類型、使用者、群組、其他使用者的權限以及修改日期和大小
檔案類型有5種:
  1. d表示目錄 
  2. - 表示檔案 
  3. l表示連結 
  4. b表示可儲存的週邊裝置 
  5. c序列埠裝置,例如鍵盤,滑鼠 
  6. p msg pipe檔 
  7. s socket
ls -a #  所有檔案(含隱藏檔,本層目錄,上層目錄..), ls -A則是不包含上層和本層目錄
ls -al # 所有檔案詳細訊息
ls -d #  僅列出目錄
ls -R # 遞迴列印目錄與子目錄所有檔案
ls -il # 列印檔案的inode號碼

遞迴列出~/test內的所有檔案/每個檔案名稱印一行
ls -R ~/test
ls -1 ~/test

cd 切換目錄
cd ~ # 當前使用者的家目錄
cd - # 回到上一個工作目錄(取用環境變數OLDPWD), 跟上一層cd .. 不一定相同

解tar/tar.gz/tar.bz2
我們常常會誤會tar解壓縮的指令,不是打 tar xf {要解的檔案} {要解到哪個目錄},而是先進去目錄;或是使用-C指定輸出到目錄。
cd extact_to_dir
tar xf tarfile_path.tar
或是
tar xf tarfile_path.tar -C {output_dir}
另外,加上v可以顯示詳細訊息

tar zxf ~/hd2/tarballs.tar.gz
tar jxf ~/hd2/tarballs.tar.bz2
tar jxf ~/hd2/tarballs.tar.bz2 -C /mnt/sdcard/ # output directory

將目錄打包成tar檔案
tar cf tarname.tar dirname

打包成tar檔案並壓縮成bz2或gz
tar cvjf tarname.tar.bz2 dirname
tar cvzf tarname.tar.gz dirname

Ref: http://www.linfo.org/tar.html

mkdir 建立/刪除目錄
建立檔案目錄,如果路徑上的目錄不存在也會一起建立
mkdir -p /aa/bb/cc/
rmdir -p /aa/bb/cc/ #連同路徑上的目錄一起刪除
touch 建立檔案
建立空檔案/修改檔案時間
touch
touch -a #改變存取時間為當前時間
touch -m #改變修該時間為當前時間
touch -t 201104161410.01 #設定時間為2011年4月16日14時10分1秒

file 查看檔案類型
file
file -f # 從檔案中讀入要查看的檔案路徑
file -i # 顯示MIME type
用在文字檔上,還會寫出辨認該檔為DOS的行結尾符號(CRLF)或是Unix行結尾符號(LF)
用在核心上,會列出版本與一些訊息

ln 建立連結(捷徑)
ln -s <真實目錄或檔案> <連結的目錄或檔案> # symbolic link, like shortcut
ln <真實目錄或檔案> <連結的目錄或檔案> # hard link,
Hard link的限制是必須再同一個file system,因為是透過寫入file system的紀錄來存取同一個檔案,如果不是同一個file system就無法這樣設置。硬連結因為是在filesystem上面紀錄成同一個inode,所以各種屬性會跟原本的檔案一模一樣(屬性、大小、修改時間等等)

如果你建立了一個hard link再把原始檔案刪除,並不會真的把硬碟上的資料刪除,而是從filesystem上移除你指定的檔案紀錄,並把link數減少,除非減少到0才會刪除資料,這就是symbolic link最大的不同

stat 看檔案是否有hard link
stat  
 File: `12'
  Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d Inode: 137365      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  yhchiu)   Gid: ( 1000/  yhchiu)
Access: 2015-05-14 08:33:15.231398466 +0800
Modify: 2015-05-14 08:33:15.231398466 +0800
Change: 2015-05-15 07:36:57.598178321 +0800
 Birth: -
如果要搜尋hardlink,就先移動到filesystem的根目錄下,用find找inode號碼,就可以列出hard link

man 查看指令說明檔
man
man -k  #搜尋所在的說明檔
man -a # 顯示所有的說明檔內容
man #顯示某類別的說明檔

除了指令之外,很多linux上相關內容也會在man裡面,像是stat除了是指令,也是系統呼叫。所以要看系統呼叫的話就要man 3 stat

一般來說,type為1是指令; 2 是系統呼叫;3是函數庫;5是檔案格式;8是系統管理

yhchiu@yhchiu-HPC:~$ man -k ls
_llseek (2)          - reposition read/write file offset
aconnect (1)         - ALSA sequencer connection manager
add-shell (8)        - add shells to the list of valid login shells
afs_syscall (2)      - unimplemented system calls
alsactl (1)          - advanced controls for ALSA soundcard driver
alsactl_init (7)     - alsa control management - initialization
alsaloop (1)         - command-line PCM loopback
alsamixer (1)        - soundcard mixer for ALSA soundcard driver, with ncurses interface
amidi (1)            - read from and write to ALSA RawMIDI ports
amixer (1)           - command-line mixer for ALSA soundcard driver
aplay (1)            - command-line sound recorder and player for ALSA soundcard driver
arecord (1)          - command-line sound recorder and player for ALSA soundcard driver
aseqdump (1)         - show the events received at an ALSA sequencer port
aseqnet (1)          - ALSA sequencer connectors over network
assert (3)           - abort the program if assertion is false
auth_destroy (3)     - library routines for remo

察看BASH內建指令說明
help
help {bash-builtin-command}
有些指令不是man提供的而是bash提供的內建功能,你可能在man裏面只會搜尋到相關的系統函數資訊,但是卻找不到指令的用法,例如: declare, local, readonly, eval, exec, ulimit等等,這時候就會需要用help來察看指令用法

which 查看某個指令的所在位置
which

由於指令雖然名稱一樣,但是可能後面銜接不同套件所以我會用ls -l 該檔案來查看是否為連結檔,如果是連結檔就要再繼續追下去

另外發現 readlink -f 可以直接印出該指令的檔案位置

留言