---
# System prepended metadata

title: '[Linux](http://shenshanlaoyuan.com/PythonTraining/)'

---

[Linux](http://shenshanlaoyuan.com/PythonTraining/)
===

* Unix、Minix、Linux沿革

    * [Unix](https://zh.wikipedia.org/wiki/UNIX) : [Kenneth Lane Thompson](https://zh.wikipedia.org/wiki/%E8%82%AF%C2%B7%E6%B1%A4%E6%99%AE%E9%80%8A)
    * [Minix](https://zh.wikipedia.org/wiki/MINIX) : [Andrew Stuart "Andy" Tanenbaum](https://zh.wikipedia.org/wiki/%E5%AE%89%E5%BE%B7%E9%B2%81%C2%B7%E6%96%AF%E5%9B%BE%E5%B0%94%E7%89%B9%C2%B7%E5%A1%94%E8%83%BD%E9%B2%8D%E5%A7%86)
    * [Linix](https://zh.wikipedia.org/wiki/Linux) : [Linus Benedict Torvalds](https://zh.wikipedia.org/wiki/%E6%9E%97%E7%BA%B3%E6%96%AF%C2%B7%E6%89%98%E7%93%A6%E5%85%B9)
        * 很多OS皆是以Linix的Kernal改成的，如Andriod、OSX
        * [Linux Kernel](https://www.kernel.org/)
    * ### Graphviz
```graphviz
digraph hierarchy {

                nodesep=1.0 // increases the separation between nodes
                
                node [color=Red,fontname=Courier,shape=box] //All nodes will this shape and colour
                edge [color=Blue, style=dashed] //All the lines look like this
                
                Unix->{BSD Sun_Solaris IBM_AIX ATandT_System_V}
                BSD->{FreeSD}
                ATandT_System_V->{Minix}
                Minix->{Linux}
                Linux->{Ubuntu Redhat SUSE Fedora}
                {rank=same;Ubuntu Redhat SUSE Fedora}// Put them on the same level
}
```

* Ubuntu 文件系統

  >/ : 根目錄
  >/bin : 程序相關
  >/boot : 開機相關
  >/cdrow : 光碟相關
  >/dev : 設備相關
  >/etc : 配置相關
  >/lib : library
  >/home : 家目錄
  
* Linux Terminal 指令

  * ls : 當前目錄清單(list)
    * `$ ls /` : 顯示根目錄(指定路徑)的清單 
    * `$ ls -a` : 顯示指定目錄下所有子目錄與文件(包含隱藏文件)
    * `$ ls -l` : 以list方式顯示
    * `$ ls -l -h` : 以人性化的方式顯示文件大小
    * `$ ls -a -l -h` 與 `$ ls -l -h -a` 顯示相同 ->順序沒差
    * `$ ls -a -l -h` = `$ ls -alh`
    * `$ ls -al` = ll (Mac沒有此指令)
      ![](https://i.imgur.com/fTsLxj2.png)
      ![](https://i.imgur.com/m2Ujgy8.png)
      最前面的-表示文件，如果是d表示文件夾
      r表示讀, w表示寫, x表示可執行
      rwx: 可讀可寫可執行
      r-x: 可讀可執行
      r--: 只能讀

    * `$ ls --help` : 查看ls(命令)選項功能
    * `$ man ls` : 查看ls(命令)文件; man(manual)
    
      >文件內操作:
      >q 離開;
      >f 下一頁; 
      >b 上一頁;
      >上下鍵移動。
      
    * `$ ls > xxx.txt` : 將欲顯示之資訊寫入xxx.txt文件中(會清空檔案資料)
    * `$ ls >> xxx.txt` : 將欲顯示之資訊附加至xxx.txt文件中(不會清空檔案資料)
    
  * 萬用字元 (wildcard character)
    * `$ ls 2*` : 顯示開頭2的文件
    * `$ ls 2?` : 顯示兩字元的2開頭文件
    * `$ ls 2??` : 顯示三字元的2開頭文件
    * `$ ls 2?3` : 顯示三字元的2開頭3結尾文件
    * `$ ls 2[12345]3` = `$ ls 2[1-5]3` : 顯示213 223 233 243 253文件

  * pwd : 顯示當前路徑
  * cd : change directory
    * `$ cd 指定路徑`
    * 想輸入決定路徑卻不知道該怎麼走時，可以案Tab來查詢目前有什麼路徑可以走
    * `$ cd ./A` : 前往當前路徑下的A資料夾
    * `$ cd ..` : 前往當前路徑下的上一個路徑
    * `$ cd ../..` : 往前跳兩個路徑
    * `$ cd -` : 快速回到移動前的路徑
    * `$ cd ~` : 移動到Home
  * touch : 創建文件
    * `$ touch 1.txt`
    * `$ touch .1.txt` : .開頭->創建隱藏文件
  * mkdir : 創建文件夾
    * `$ mkdir gogogo`
    * 如果我想直接創一個A資料夾裡面創B資料夾，B裡創C，C李創D，一個一個慢慢創太麻煩了
      * `$ mkdir A/B/C/D -p` (Mac好像無法,-r也無法)
  * 創建軟快捷(原文件砍了，此快捷即作廢)
    * `$ ln -s 1.txt(快捷目標) 1-softlink.txt(快捷名)` : 對1.txt創建一個名為1-softlink.txt的快捷
  * 創建應快捷(原文件砍了，此快捷還能用)
    * `$ ln 1.txt 1-hardlink.txt`
    > 原理
    ![](https://i.imgur.com/it8RBgW.png)
    ![](https://i.imgur.com/fX9kTEX.png)


  * MV :移動或重新命名
    * `$ mv 1.txt(目標) 2.txt(命名)` : 將1.txt改為2.txt 
    * `$ mv 1.txt A` : 將1.txt移動至A資料夾
  * CP :複製
    * `$ cp 1.txt B` : 將1.txt複製一份至B資料夾中
    * `$ cp 1.txt 2.txt` : 將 1.txt 的內容複製到 2.txt 
  * clear : 清除
  * Tab鍵可以自動補齊名稱
  * gedit : 文件編輯器
    * `$ getit 文件名`
  * cat : 查看文件內容(一次顯示所有文件,適合小文件)
    * `$ cat 文件名稱`
    * `$ cat 1.txt 2.txt` : 顯示1.txt跟2.txt的文件內容
    * `$ cat 1.txt 2.txt > xxx.txt` : 把顯示內容存入xxx.txt ->做到合併1.txt跟2.txt的效果
  * more : 查看文件內容(分次慢慢顯示,適合大文件)
    * `$ more 文件名稱`
    * 想查一個資料顯示龐大的，可以先將資料寫入一文件，再以More查看
      > `$ ls -alh /bin >> xxx.txt`
      > `$ more xxx.txt`
    * 但如此會多了一個不必要的文件；故可以用"|", 如此資料會存進|中，more再於|讀取資料
    * | : 一個命令的輸出，可以通過管道作為另一個命令的輸入
      > `$ ls -alh /bin | more` 
  * history : 歷史命令
    * `$ !指定歷史命令次數` : 執行該次輸入指令
    * `上下鍵也能翻歷史命令`
  * rm : (remote)
    * `$ rm 想刪的文件`
    * `$ rm *.txt` : 刪掉所有txt檔
    * `$ rm A文件夾 -r` = `$ rmdir A文件夾`
  * Control + C : 不執行我所輸入的命令，直接跳下一行
    > 用法：不用全選刪掉這麼麻煩 
  * Tree  : 以樹狀圖方式顯示文件
  * Grep : 搜索文件裡內容
    * `$ grep "s" xxx.txt` : 顯示xxx.txt有s字眼的行
    * `$ grep "^s" xxx.txt` : 顯示以s開頭的內容
    * `$ grep "s$" xxx.txt` : 顯示以s結尾的內容
    * `$ grep -n "s" xxx.txt` : -n -> 顯示行數
    * `$ grep -v "s" xxx.txt` : -v -> 顯示沒有s的內容
  * Find : 於指定路徑尋找文件或目錄
    * `$ find / -name "*name*"` : 於根目錄下尋找有name的文件
    * `$ find / -name "name"` : 於根目錄下尋找全名為name的文件
    * `$ find ./ -name [A-Z] : 於當前目錄下尋找大寫字母開頭的文件
    * `$ find /tmp -size 2M` : 於tmp目錄下尋找文件大小等於2M的文件
    * `$ find /tmp -size +4K -size -5M` : 於tmp目錄下尋找 4k<file<5M 之文件 
    * `$ find ./ -perm 777` : 於當前目錄尋找權限為777的文件
  * Tar : 打包與解包
    * `$ tar -cvf test.tar *.txt` : 把所有txt檔==打包==成test.tar
      * -c : 生成檔案，創建打包文件
      * -v : 列出歸檔過程，顯示進度
      * -f : 指定檔案文件名，f一定要放最後
    * `$ tar -xvf test.tar` : 將test.tar解包
      * -x :  解開檔案文件 
    * `$ tar -zcvf test.tar.gz *.txt` : 將所有txt檔==壓縮==成 test.tar.gz 
    * `$ tar -zxvf test.tar.gz` : 解壓gz檔
    * `$ tae -zxvf test.tar.gz -C gogogo/` : -C 指定路徑
    * `$ tar -jcvf yyy.tar.bz2 *.txt` : bz2檔比gz大一點點
    * `$ tar -jxvf yyy.tar.bz2` : 解壓bz2檔
    * `$ zip zzz.zip *.txt` : 壓縮成zip
    * `$ unzip zzz.zip` : 解壓zip
    * `$ unzip -d ./gogogo zzz.zip` : -d 指定路徑
  * which 查看我用的命令在哪
    ``` 
    $ which ls
    /bin/ls
    ```
  * cal : 日歷
    * `$ cal -y 2008` : 2008年日曆
    * `$ cal -m 5` : 今年五月日曆
  * date : 查看當前時間
    * `$ date "+%Y%m%d"` : 20190304
    * `$ date "+%Y年%m月%d日"` : 2019年03月04日
    * `$ date "+%D"` : 03/04/19
  * ps : 查看當前進程 (另外還有top跟htop)
    * `$ ps -aux` (mac沒反應)
    * `$ kill PID編號` : 關閉程式
    * `$ kill -9 PID編號` : 強制關閉程式
  * reboot : 重啟OS
  * shutdown -h now : 立刻關機
  * shutdown -h 20:25 : 20:25關機
  * shutdown -h +10 : 十分鐘後關機
  * init 0 : 關機
  * init 6 : 重開機
  * df : 顯示當前磁盤空間
  * du : 顯示當下資料夾佔用多大空間
    ```
    $ du -h // -h: 顯示單位
    12k ./test3 // 這個資料夾裡的test3資料夾佔用12k
    24k . // 這個資料夾總共佔用24k
    ```
  * ifconfig 查看網卡訊息 
    * `$ ifconfig 網卡名稱 欲設置的網卡IP地址` : 更改IP地址
    * `$ ifconfig | grep 172` : 只顯示172的資料
  * ping 查看有無正常連線
    * `$ ping IP地址或域名(www.google.com)`



1-6 Linux 命令 - 用戶、權限管理
---


* Unix/Linux 係多任務多用戶 <-> Windows 不允許多用戶
  > 也就是說Unix/Linux 一個用戶可以同時多人登，一台電腦也可以同時登入多個用戶，Windows 則無法 
* useradd : 創建用戶
    * `$ useradd ABC(欲創建的用戶名) -m` : 創建 ABC 用戶
    * 查看有無成功 : `$ cat /etc/passwd` ，如果有ABC，即創建成功
    * `$ useradd -d /home/ABC ABC -m` : 創建ABC用戶，如果 /Home/ABC 不存在，就自動創建這個目錄，同時用戶屬於 ABC

* 設置用戶密碼 / 修改密碼
  ```
  $ passwd ABC
  設置新的Unix密碼：
  重新輸入新的Unix密碼：
  passwd：已設置成功
  ```
* 切換用戶 
    * 切換用戶至ABC，工作目錄不會跟著切
      ```
      $ su ABC
      密碼:
      $ pwd
      /home/切換前的帳戶
      ```
    * 切換用戶，同時將當前工作目錄切換至該用戶的主目錄
      ```
      $ su - ABC
      密碼：
      $ pwd
      /home/ABC
      ```
    * 切換至root
      ```
      $ sudo -s
      密碼：
      #  // root權限時，輸入符是 # 而非 $
      ```
       
* 刪除用戶
    * `$ userdel ABC` : 刪除ABC用戶，但不會刪除用戶的主目錄
    * `$ userdel -r ABC` : 連同主目錄一起刪掉  
* 查看當前用戶: `$ whoami`  
* 查看登入用戶：`$ who`
* 退出登入用戶：`$ exit`
* 遠程登入 : `$ ssh 用戶名@IP地址`
  ```
  $ ssh pokemonovvo(用戶名)@123.45.6.789(IP地址)
  The authenticity of host '123.45.6.789(123.45.6.789)' can't be estable ECDSA key fingerprint is SHA256:/O0d2GZ+OZ85kT+GacHP5WrgpMeJwyWBOSfk1x
  Are you sure you wnat to continue conneting (yes/no)? yes
  Waring: Permanently added '123.45.6.789' (ECDSA) to the list of known pokemonovvo@123.45.6.789's password: 
  Welcome to ...............
  ```

* New Tab
    * Linux: ^ + ⇧ + T
    * Linux 切換: ⌥ + 1/2/3/4/5
    * osx: ⌘ + T
* 用戶組
    * 用戶組擁有權限，用戶必須在用戶組裡才能使用該用戶組權限！
    * 當創建新用戶時，實際上已創建了一個組，該組名與該用戶名相同
    * 新創建的帳戶，默認不在sudo組中，無法使用sudo -s指令，需將新創建帳戶加入sudo中才得以使用(adm也是)
      ```
      $ sudo useradd apple -m
      $ sudo passwd apple
      Enter new UNIX password:
      Retype new UNIX password:
      passwd: password update succssflly
    
      $ su - apple
      password:
      $ pwd
      /home/apple
    
      $ sudo -s
      [sudo]password for apple:
      apple is not in sudoers file. This incident will be reported 
      // 如何解決？
    
      // 將apple user加入sudo group即可
      $ sudo usermod -a -G sudo apple
      $ sudo -s
      [sudo]password for apple:
      # whoami
      root
    ```
* 查看用戶組
    * 方法一：`$ cat /etc/group`
    * 方法二: `$ groupmod` + Tab三次 (mac沒反應)
* 增刪用戶組 `$ groupadd YYY` `$ groupdel YYY`
* 修改文件擁有者 
  `$ chown apple 1.txt` : 將1.txt的擁有者改成apple
* 修改文件所屬組
  `$ chgrp yyy 1.txt` : 將1.txt所屬組別改成yyy 
* 修改文件權限 `$ chmod u/g/o/a +/-/= rwx 文件名`
  `$ chmod u=rwx 1.txt` : 將1.txt的文件所有者權限改為可讀可寫可執行(-rwx)
  `$ chmod u=,g=,o= 1.txt` : 將1.txt所有人的所有權限全部拿掉(----------)
  `$ chmod u=rwx,g=r,o=wx 1.txt` = `$ chmod u=7,g=4,o=3 1.txt` (-rwxr---wx)
  7=4( r)+2(w)+1(x), 4=r, 3=2(w)+1(x)
  |u/g/o|含義| 
  |--|--|     
  |u|user|
  |g|group|
  |o|other|
  |a|all|
  
  |+/-/=|含義|
  |--|--|
  |+|增加權限|
  |-|刪除權限|
  |=|設定權限|
  
  |rwx|含義|數字法|
  |--|--|--|
  |r|read|4|
  |w|write|2|
  |x|excute|1|
  |-|沒有權限|0|
  

Python-編輯器
===

Sublime
---
* 整行 Tab空：選取 + Tab
* 退回 Tab空：選取 + Shift + Tab
* 選取單字 : command + D
* 將選標直接跳到最右邊 : command + 方向右鍵


Vim `$ vi file_name`
--
* 如果你不正常關閉vi，你編輯中的檔案(4.py)會被vi存成隱藏文件(.4.py.swp) -> 用 `$ ls -a` 就會看到，再次打開時該文件時($ vi 4.py) , vi會跳出提醒
  ![](https://i.imgur.com/GPF0lF7.jpg)
  
### 進入 vi
> - `$ vim`
> - `$ vim 檔名`

### Normal

> - yy : 複製當前行
> - 4yy : 複製4行(從當前行算下去)
> - p : 於當前行下面另開一行貼上
> - dd : 剪下當前行
> - 3dd : 剪下3行(從當前行算下去)
> - D : 剪下當前光標位置至該行末
> - d0 : 剪下當前光標前一個字符至行首
> - dw : 剪下當前光標的字
> - x : 刪除當前光標的字符，相當於 Del
> - X : 刪除光標的前一字符，相當於 Backspace
> - r : 替換當前一個字符
> - R : 替換當前行字符
> - :%s/123/abc/g : 把所有123換成abc
> - :%s/^/#/g : 在所有開頭都加上#
> - :11,16s/123/abc/g : 第11行到16行的123換成abc
> - u : 恢復上一洞
> - ctrl + r : 反恢復上一洞
> - v : 按字移動, 選取
> - V : 按行移動, 選取
> - \>\> : 整行向右移動
> - << : 整行向左移動
> - . : 執行上一個操作指令

> #### 移動
> - `h` : 左 
> - `l` : 右
> - `k` : 上
> - `j` : 下
>   - 上下會記憶位置, 上下行的字數不夠時, 會到該行頁尾, 
>     到下行字數夠時, 會回到該列垂直位置
 


> - [VimAdventures](https://vim-adventures.com/) : 讓你習慣 vim 移動方式的小遊戲

> - `w` ( word ): 向後移一字首處, 遇到符號會停下來
>   - `W` : 向後移字首處, 遇到符號不會停下來
> - `b` ( back ): 往回移字首處, 遇到符號會停下來
>   - `B` : 往回移字首處, 遇到符號不會停下來

> - `}` : 按段移動, 下移
> - `{` : 按段移動，上移

> - `G` : 移至文件末尾
> - `gg` : 移至文件開頭
> - `20G` : 移至第20行

> - `0` : 跳到該行最前面
> - `^` : 跳到該行有字的最前面
> - `$` : 跳到開航有字的最後面

> - H : 移到畫面最上行
> - M : 移到畫面中間行
> - L : 移到畫面最下行
> - ^ + f : 往下翻頁
> - ^ + b : 往上翻頁
> - ^ + d : 往下翻半頁
> - ^ + u : 往上翻半頁





> - / : 搜尋
> - n : 下一個
> - N : 上一個
    
### EX模式 
> - `:w` : 儲存
>   - `:w 檔名`
> - `:q` : 退出
> - `:wq` : 儲存並退出
> - `shift + zz` = :wq = :x: 

### Insert
> - ctrl + n : 自動補齊曾輸入過的單字
> - `i` ( insert ) : 光標
> - `a` ( append ) : 光標後
> - `o` ( new line ): 新行
> - `Ctrl + [` 或 `esc` : 回到一般模式 

### other

> - `ctrl + z` : 把vim放到背景
>   - `$ fg`  : 叫回
> - vi a.py +11 : 用 vi 打開 a.py, 並直接跳到第11行
> - Windows 使用 Vi 可能有點卡手, 可以考慮使用 [WSL](https://blog.miniasp.com/post/2019/02/01/Useful-tool-WSL-Windows-Subsystem-for-Linux) 來跑 Linux