轉載來自:http://dhq.me/use-ssh-config-manage-ssh-session
通常利用 ssh 連接遠程服務器,一般都要輸入以下類似命令:
1
|
ssh
user@
hostname
-p port
|
如果擁有多個 ssh 賬號,特別是像我這種喜歡在終端里直接 ssh 登陸,不用 PuTTY、SecureCRT之類的 ssh 客戶端的,要記住每個ssh 賬號的參數,那是多么蛋疼的事情。
還好,ssh 提供一種優雅且靈活的方式來解決這個問題,就是利用 ssh 的用戶配置文件 config 管理 ssh 會話。ssh 的用戶配置文件是放在當前用戶根目錄下的 .ssh 文件夾里(~/.ssh/config,不存在則新創建一個),其配置寫法如下:
1
2
3
4
5
|
Host 別名
HostName 主機名
Port 端口
User 用戶名
IdentityFile 密鑰文件的路徑
|
有了這些配置,就可以這樣用 ssh 登陸服務器了:
1
|
ssh
別名
|
這里以免費的 ssh shell -- CJB 為例,介紹指定密鑰文件配置連接 ssh 的用法,如果沒有可以在這里注冊一個賬號。
這里假設你有一個名為 user 的 CJB ssh 賬號,那么用戶名就是 "user",端口使用 ssh 默認的端口 "22",CJB 默認使用的主機名是 "shell.cjb.net",不過在鎮里這個域名已經被 DNS 污染用不了,只能用 IP 地址 216.194.70.6 代替。
PS:上面的 CJB 主機名 IP 可以通過 dig 獲得
1
|
dig
shell.cjb.net
|
使用密鑰的好處就是省去每次 ssh 登陸服務器時都要輸入登陸密碼的操作,這里使用 ssh-keygen 生成 ssh 密鑰(以下操作是在 ~/.ssh/ 目錄里執行):
1
|
ssh
-keygen -t rsa
|
這里使用 rsa 的加密方式(另外一種加密方式是 dsa),中間會詢問密鑰生成的位置,這里只輸入 cjb,在當前位置生成名為 cjb 的密鑰,接着會詢問是否要設置一個密碼(passphrase),這里留空,直接按回車就行(本來就不想登陸輸入密碼了...),最后,會在當前目錄路徑下生成一個名為 cjb 的私鑰,一個名為cjb.pub 的公鑰。
把公鑰 cjb.pub 上傳到遠程 cjb 服務器的 ~/.ssh/ 目錄下:
1
|
scp
.
/cjb
.pub user@216.194.70.6:~/.
ssh
/
|
上傳完后,把公鑰 cjb.pub 的內容復制到 authorized_keys 文件里(不存在則新創建一個):
1
|
cat
cjb.pub >> authorized_keys
|
以 ssh publickey 的形式訪問,對當前用戶根目錄下的 .ssh 文件夾里的目錄文件是要有一定的權限要求,之前遇到過 ssh publickey 配置好了,不過用 publickey 登陸驗證時則無效。所以,最好設下 .ssh 目錄權限為 700,authorized_keys 權限為 600:
1
2
|
chmod
700 ~/.
ssh
/
chmod
600 authorized_keys
|
當然,用密鑰的方式連接服務器是需要服務器上的 ssh 支持的,需要 ssh 的配置文件(默認是在 etc/ssh/sshd_config)里的 PubkeyAuthentication 設置成 yes。如果要改登陸的端口,直接把 Port 改成你想要的端口值就行。修改完后重啟下 ssh ,配置就生效:
1
|
/etc/init
.d
/ssh
restart
|
還好,CJB 提供的免費 ssh 支持密鑰訪問。
這樣,連接 cjb 的密鑰配置完成,本地 ssh 用戶配置文件 config 里的 IdentityFile 值寫為私鑰 cjb 的文件路徑 "~/.ssh/cjb" 就行,最后,本地 ssh 用戶配置文件 config 的內容如下:
1
2
3
4
5
|
Host cjb
HostName 216.194.70.6
Port 22
User user
IdentityFile ~/.ssh/cjb
|
配置完成后,就可以在終端直接輸入 "ssh cjb" 暢通無阻地連上遠程的 cjb 服務器上了。
如果有多個 ssh 賬號需要配置,在 config 文件里隔行分開寫就行,例如:
1
2
3
4
5
6
7
8
9
10
|
Host cjb
HostName 216.194.70.6
Port 22
User user
IdentityFile ~/.ssh/cjb
Host alias
HostName hostname
Port port
User user
|
嘿嘿,如果你也用 ssh 作 socks5 代理翻牆,以后不用這樣寫了:
1
|
ssh
-qTfnNC -D 12345 user@216.194.70.6 -p 22
|
可以省去 user 后面的,直接寫成這樣:
1
|
ssh
cjb -qTfnNC -D 12345
|
上面的 scp 傳送也可以簡寫成這樣:
1
|
scp
.
/cjb
.pub cjb:~/.
ssh
/
|
執行遠程 ssh 命令:
1
|
ssh
cjb
"ls ~"
|
打包一個文件(假設當前目錄有個名為 test 的文件夾),接着上傳到遠程服務器,最后解壓文件
1
|
tar
-zcvf - .
/test/
|
ssh
user@216.194.70.6
'cd /user/; tar xvfz -'
|