最近在mac中折騰ssh自動登錄的問題,不自動登錄每次輸入命令太痛苦了,采取的方案是expect腳本的方式,其實選擇這種方案而不是在遠程服務器上保存key的方式主要是因為公司限制了在跳板機上保存私有數據的權限,如果想了解如何不輸入密碼登錄遠程機器的原理,請看這篇博客
當然,OS X上的終端可以使用iterm2,這樣配置后便利性不比$99的secureCRT差
一般情況
首先介紹下不通過跳板機進行登錄的方式,準備:
寫一個expect腳本
!/usr/bin/expect set timeout 30 spawn ssh [lindex $argv 0]@[lindex $argv 1] expect { "(yes/no)?" {send "yes\n";exp_continue} "password:" {send "[lindex $argv 2]\n"} } interact
該腳本比較簡單,需要三個參數,第一個參數是遠程用戶名,第二個參數是遠程地址,第三個參數是密碼
將expect腳本copy到$PATH下(例如/usr/local/bin)
在iterm2中設置登錄命令為1中的腳本,用command+o的方式呼出profiles,點擊Edit Profiles,按照下圖的方式配好后,雙擊可以圖1中的列表即可自動登錄
圖1
圖2
有跳板機情況
俺(前)公司的跳板機策略如下,不同公司的環境不一樣,也許某些同學可以進行參考
跳板機上不能存放任何文件,/tmp下可以方臨時文件,每天會定時清掉
copy文件方向只能是local->跳板機->remote的方向,即local可以push/pull跳板機上的文件,跳板機可以push/pull遠程上的文件
向跳板機登錄前需要通過郵件/短信的方式獲取passcode,這是除密碼之外的額外的驗證方式
其實跳板機的自動遠程登錄與非跳板機的差異在expect腳本的編寫上,其他的照搬即可,直接把代碼貼出來吧
!/usr/bin/expect# 參數1:遠程host;參數2:遠程password if { $argc != 2 } { send_user "Usage: host password\n" exit}set host [lindex $argv 0]set pw [lindex $argv 1]set TERMSERV yourjumpserver # 跳板機服務器set USER jumpserveruser # 用戶名set PASSWORD jumperserverpasswd # 跳板機密碼set fd [open /place/to/passcode r] # 本地存放passcode的地方gets $fd pcclose $fd# Start the sessioncatch {spawn ssh -l $USER $TERMSERV} # 登錄跳板機# Loginexpect "assword:" { send "$PASSWORD\r" }expect "passcode:" { send "$pc\r" } #通過跳板機登錄線上機器expect "hostname" { send "ssh -l $USER $host\r" } # host為你目標機器的名字expect { "(yes/no)?" {send "yes\n";exp_continue} "assword:" {send "$pw\n"}}expect "$host" { send "cd ~\r"; interact }
問題解決
1
如果在使用過程中,碰到了連接遠程機器非常慢的情況,一般是因為開啟了ControlMaster ,它會復用ssh連接,可以看下這篇文章,如果不想復用,可以通過修改 ~/.ssh/config配置文件將其關閉:
ControlMaster auto#ControlPath ~/.ssh/master-%r@%h:%p%r
2
密碼中一般有特殊字符,注意傳參時需要在密碼兩邊加上單引號
如果有朋友在使用過程中發現問題,請幫忙糾正,謝謝