---
# System prepended metadata

title: Linux 學習筆記
tags: [Note, ' Linux']

---

---
title: Linux 學習筆記
tags: Note, Linux
---
# 前言
此為Linux學習記錄

###### tags: `Linux`

# 基礎 Linux command
隨手記錄一下linux command指令，免得久沒用都忘惹ＱＱ

## 常用指令

- ```ls``` 顯示當前目錄下的檔案
- ```mkdir 資料夾的名稱``` 建立一個新的資料夾
- ```cd 路徑``` 移動到指定的路徑
- ```rm 檔案``` 移除檔案
- ```mv 原檔案/路徑 新檔案/路徑``` 檔案的移動與更名
- ```cp 原檔案/路徑 新檔案/路徑``` 複製檔案

> 在ubuntu中可以用快捷鍵`crtl+alt+t` 啟動terminal

## 檔案處理相關
### 顯示當前目錄下的檔案
```
ls
```
### 顯示隱藏的檔案
```
ls -a
```

### 列出目錄下資料數量
src: https://iter01.com/575361.html
```bash
# 列出目錄下檔案數量
ls -l <folder path> | grep "^-" | wc -l
# 列出目錄下資料夾數量
ls -l <folder path> | grep "^d" | wc -l
```

### 建立資料夾
```
mkdir 檔案名
```

在當前路徑下建立一個新的資料夾，用ls確認有沒有成功建立。

### 移動到指定路徑
```
cd 路徑
```

冒號後面有告訴你當前路徑。

<img src="http://i.imgur.com/90BwrLF.png" style="width:50%"/>

### 啟動文字編輯器
```
gedit 檔案名
```

gedit是內建於ubuntu相對於windows下記事本的存在，在這裡我們用於建立測試用的檔案。

<img src="http://i.imgur.com/IY95axG.png" style="width:70%"/>

### 移動到上一層目錄
```sh
cd ..
```
<img src="http://i.imgur.com/2BxYhNP.png" style="width:50%"/>

### 檔案的移動或更名

```sh
mv 原檔案路徑 新檔案路徑
```

更名 ```mv 原檔案名 新檔案名```

<img src="http://i.imgur.com/ao01Mqk.png" style="width:50%"/>

移動`mv 檔案路徑 目錄路徑`可以不用打完整的路徑，預設的會是當前的目錄的路徑。
所以`mv 檔案名 目錄名`也通，不過前提是兩者皆在當前目錄下，或者可以 `mv 檔案名 目錄路徑`，任意排列組合。

<img src="http://i.imgur.com/jcFUWHd.png" style="width:50%"/>

移動後原檔案就消失了。

到資料夾裡面看看。

<img src="http://i.imgur.com/Ib0D57c.png" style="width:50%">

### 移除檔案

```sh
rm 檔案
```
<img src="http://i.imgur.com/wNmPTZW.png" style="width:50%"/>

使用```rm -r``` 移除資料夾

<img src="http://i.imgur.com/ppNjH8z.png" style="width:50%"/>

### 複製檔案

```sh
cp 欲複製的檔案 新複製的檔案
```

<img src="http://i.imgur.com/kpjsFtl.png" style="width:50%"/>

# 進階 Linux command
## `chattr`
設定檔案屬性，預防檔案被更改或刪除，尤其是`/etc`下的一些系統設定檔。
可以避免系統的套件管理程式在升級套件時改動到設定檔。

與 `chmod`, `chown` 差別在於，可以防止在使用 `root` 權限時誤刪檔案。只有將屬性拿掉才可以改動檔案。

- 設定檔案屬性 `chattr [-RVF] [+-=][attr] filename`
	常用屬性如下：
	|Attribute|Explain|
	|:---:|---|
	|`i`|檔案不可被更動(immutable)，不可寫入、刪除、建立連結檔等|
	|`a`|只能以附加方式寫入(Append only)|
	|`c`|自動壓縮(compressed)，Linux核心自動把檔案壓縮後，再寫入硬碟，讀取內容時，linux核心也會自動解壓縮|
	|`d`|使用`dump`時，檔案會被排除|
	|`s`|安全刪除檔案(secure deletion)，檔案被刪除時，系統將所有硬碟上的檔案內容用`0`取代，確保檔案資料確實刪除|
	|`A`|不要更新檔案存取時間(no atime updates)|
	|`C`|關閉copy-on-write|
	|`S`|檔案被更動時，馬上同步寫入硬碟(synchronous updates)|
	
- 查看檔案屬性 `lsattr`

## `lsof` 
##### **[src]:** [Linux 列出行程開啟的檔案，lsof 指令用法教學與範例](https://blog.gtwang.org/linux/linux-lsof-command-list-open-files-tutorial-examples/)

列出指定port
```bash
lsof -i:port
```

## `kill` 
> src: [在 Linux 中使用 kill、killall 與 xkill 等指令強迫關閉程式](https://blog.gtwang.org/linux/linux-kill-killall-xkill/)

可以透過`ps` 列出現在執行的程式，看到想終止的Process ID(PID)
```bash
kill PID
```
但有時候程式當掉時，上面的指令無法停止城市的執行，可以加下列指令強制停止：
```bash
kill -9 PID
```

其他 `kill` 常用參數：
- `-2`：與`ctrl + C` 相同
- `-9`：強制停止程式執行
- `-15`：以正常的程序通知程式停止執行，為預設的訊號
- `-l`：列出所有可用指令參數


## `killall`
不用查`PID`，可以直接用程式名稱終止
```bash
killall geth
```

`killall` 常用參數：
- `-e`, `--exact`：process名稱完全比對成功才會終止程式，若process名稱超過15字元，其餘字元在系統中會被捨去，此時在預設情況下，`killall` 會把所有符合15字元的程式都終止掉，若加上`-e` 參數，則會跳過名稱過長的程式。
- `-I`, `--ignore-case`：比對名稱時，忽略大小寫
- `-i`, `--interactive`：終止程式前，以互動式詢問。
- `-l`, `--list`：列出所有參數
- `-r`, `--regexp`：使用常規表示法(regular expression)指定程式名稱
- `-u`, `--user`：只終止指定使用者所執行的程式

## 檢視檔案編碼
有兩種參數
```bash
# mac os 可以用 --mine
file --mime [filename]

file -i [filename]
```

# SSH

## 解決 SSH 連線緩慢
##### [參考資料]：[解決 SSH 登入很慢、很久的問題](https://www.puritys.me/docs-blog/article-426-%E8%A7%A3%E6%B1%BA-SSH-%E7%99%BB%E5%85%A5%E5%BE%88%E6%85%A2%E3%80%81%E5%BE%88%E4%B9%85%E7%9A%84%E5%95%8F%E9%A1%8C.html)

SSH連線緩慢有可能是因為伺服器要做數次的 reverse DNS 導致。reverse DNS 就是將IP轉為hostname，SSHD server轉換ip成hostname後，會檢查client的ip與hostname是否一致，用於 hostname-based host authentication登入機制，但此機制一點也不安全，基本上可以直接取消此設定。

除此之外也可以將 GSSAPIAuthentication (Generic Security Services AP)停用。

- Linux 設定檔：`/etc/ssh/sshd_config`
```bash
UseDNS no
GSSAPIAuthentication no
```


- 重啟SSHD有以下方式(擇一)：
	- `sudo service sshd restart`
	- `sudo systemctl restart sshd`
	- `sudo /etc/init.d/ssh restart`