Linux 上的 SSH 常用模組與設定

先前在 VS Code 的設定文章中有提及過 SSH 登入的設定,本篇以 Linux 的 SSH 登入開始介紹,並且提及 scp 與 sshfs 方便於多台 Linux 機器之前交換資料的模組。

先前在 VS Code 的設定文章中有提及過 SSH 登入的設定,本篇以 Linux 的 SSH 登入開始介紹,並且提及 scp, sshfs 兩個基於 SSH 連線,方便於多台 Linux 機器之前交換資料的模組。

使用 SSH 登入

  1. 首先,本地 (local) 的電腦需要有 SSH key,

    ssh-keygen
    

    首先它會問 ssh 存放的位置,預設是 ~/.ssh 下面。密碼如果直接按 Enter 相當取用不需要用密碼,可自行斟酌。

    資料夾中 id_rsa.pub 是公鑰、id_rsa 是私鑰。

  2. 取得遠端 (remote) 電腦的 IP。登入遠端機器之後,使用 ipconfigifconfig 通常可以找到,如果兩者都無法,可以用指令 cat /etc/hosts 查找。

把公鑰放到遠端機器上

先說簡單的方法,使用 ssh-copy-id

ssh-copy-id <remote id> 

會需要輸入一次密碼,指令會把 public key 放到遠端機器上設定好。參考:ssh-copy-id

另一種是手動方法,編號接續前面的 Step

  1. 在 Linux 上可用 nano, vim 之類的文字編輯器,在本地打開 ~/.ssh/id_rsa.pub,複製內容。

  2. 把公鑰 (public key) 放到遠端電腦的 ~/.ssh/authorized_keys 裡面。

  3. 從本地端使用 ssh 連線過去,嘗試是否成功!

    ssh username@IP -p port
    

使用 SSH 可以免去每次都要輸入密碼的環節,像是 mobaxterm 這種工具雖然有記住密碼的功能,有鑑於之前曾發生忘記 mobaxterm 密碼的慘劇,讓我後來都改用 SSH 的方式 。當然 .ssh 如果有設密碼一樣可能面臨相同的困擾,但 ssh 在 linux 上可用的範圍更為廣泛,算是個好處吧。

給予遠端 IP 別名

像是在用 docker, kubernetes 一次使用多台機器的時候,如果每一台的 IP 都不同,也不怎麼連續。有時候又會需要登入每一台做些設定,這時如果能給每一台機器的 IP 都設其他代稱,可以方便許多。以下會先說名 ssh 部份的作法,後面提及使用 docker 的經驗!

設置 .ssh/config

位置在 ~/.ssh/config 下,

Host            remoete_machine 	# 代稱
Hostname        192.168.0.1        	# ip address
Port            22                	
User            jonny                # user name
identityfile    ~/.ssh/id_rsa   	 # private key 位置 

這樣下次就可以直接用這邊設定的內容連線!但如果前面在產生 ssh key 的時候有設密碼,則每次連線會需要打那個密碼!

ssh remoete_machine

在網域上尋找機器

我曾遇到過需要自己找 IP 的情況….,要在網域上尋找機器,可使用使用 nmap,用法可參考文章最後的參考資料。

sudo apt install nmap
sudo nmap -sn 192.168.1.1-100

改變 IP address 的 hostname

這是另外一種作法,在使用 docker 管理多台 Raspberry Pi 時曾用此方法:修改檔案 /etc/hosts 。把 IP 位置改成自訂的 hostname,例如:

192.168.1.181         docker1
192.168.1.182         docker2
192.168.1.183         docker3
192.168.1.184         docker4

其實前面提到的 ssh-copy-id,如果在這一部先設好每一個 IP,用腳本跑 ssh-copy-id 有機會輕鬆的多。

scp

透過 SSH 執行 Copy ,scp 之後第一個位置是 source、第二個位置是 destination

# local to remote 
scp <local path> user@192.168.0.1:<remote path>
# remote to local
scp user@192.168.0.1:<remote path> <local path>

複製目錄也跟原始的 cp 相似,加上 -r 參數:

scp -r user@192.168.0.1:<remote path> <local path>

要從同台機器上,複製多個資料夾的內容,則在冒號後面把路徑寫在一起:

# 正確作法
scp -r user@192.168.0.1:"dir1 dir2 dir3" <local path>

# 會複製兩次! (如果有設密碼就要打兩次)
scp -r user@192.168.0.1:dir1 user@192.168.0.1:dir2 <local path>

sshfs

需要注意,如果不是 root 用戶,本地位置目錄擁有者必須為使用者自己(不能把檔案從遠端 copy 到這台電腦中,別的 user 所屬的資料夾的概念)。如果遠端機器的 ssh port 不是預設的 22 (是透過 router 設定 port forwarding 之類的),要透過 -p <port> 標明連哪個 port,否則會連線不進去。

sshfs <remote location> <local location>
sshfs username@hostname:/path/to/folder /path/to/local/folder
sshfs -p <remote port> username@hostname:/path/to/folder /path/to/local/folder
# example
sshfs -p 1000 pi@0.0.0.100:/share_files /accept_file

這個舉動的意思是:把遠端機器(0.0.0.100) 上的 share_files 資料夾『掛載 (mount)』到我的機器上的 accept_file 資料夾!因為是用 mount 的,所以當遠端機器的 share_files 內容有更新,我這邊的 accept_file 也會同步更新!

而如果希望解除綁定資料夾的狀態,可以參考下面連結的論壇,用 fusermount -u /path/to/local/folder 解除本地資料夾與遠端的連結。

參考資料