如何在iterm2中設置自動遠程登錄(附跳板機攻略)

題圖

最近在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

有跳板機情況

俺(前)公司的跳板機策略如下,不同公司的環境不一樣,也許某些同學可以進行參考

  1. 跳板機上不能存放任何文件,/tmp下可以方臨時文件,每天會定時清掉
  2. copy文件方向只能是local->跳板機->remote的方向,即local可以push/pull跳板機上的文件,跳板機可以push/pull遠程上的文件
  3. 向跳板機登錄前需要通過郵件/短信的方式獲取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 pc
close $fd

# Start the session
catch {spawn ssh -l $USER $TERMSERV} # 登錄跳板機

# Login
expect "*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

密碼中一般有特殊字符,注意傳參時需要在密碼兩邊加上單引號

如果有朋友在使用過程中發現問題,請幫忙糾正,謝謝

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容