需求
mac的terminal很方便進行遠程ssh鏈接,但是卻每一次?都要輸入密碼,很麻煩,尤其是管理多臺服務器的時候。
所以如果能記住密碼是再好不過了,直接進行連接和登錄。
解決方案
Linux系統是自帶Python 2.7的,Mac OS也不例外,可以在終端中輸入 python -V
以查看python的版本
由於Python具有很好的易操作性,所以可以使用Python來實現ssh的快捷登錄。
1.安裝pip
pip是Python的搭檔,用來安裝一些wheels,這裏需要安裝一個由Python寫的一個包 pexpect,Python默認是沒有安裝pip的,需要下載和安裝。安裝也很簡單,首先打開終端,然後依次執行以下命令:
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
2.安裝pexpect
安裝好pip後,再安裝pexpect包,用於自動化執行linux命令
pip install pexpect
3.寫腳本
新建一個文件,用來存放ip地址和密碼,命名爲ssh_config.py,寫入一個或者多個服務器配置:
#ssh_config.py
#用於存放ssh連接的配置
host1 = {
"ip" : "x.x.x.x",
"port" : "22",
"user" : "root",
"pwd" : "12345"
}
host2 = {
"ip" : "x.x.x.x",
"port" : "22",
"user" : "root",
"pwd" : "12345"
}
再新建第二個文件,命名爲ssh.py:
#coding=utf8
from ssh_config import *
import pexpect, sys
host = locals()[sys.argv[1]]
CONFIG = host
class SSLconnect():
def __init__(self):
self.user = CONFIG['user'] + "@" + CONFIG['ip']
def connect(self):
print "正在連接主機..."
self.process = pexpect.spawn("ssh", [self.user, "-p", CONFIG["port"]])
print "OK"
self.input_pwd()
def input_pwd(self):
state = self.process.expect([
"[p|P]assword:",
pexpect.TIMEOUT,
"connecting (yes/no)"
])
self.check_state(state)
def check_state(self, state):
if state == 0:
print "正在驗證密碼..."
self.__verify_pwd()
return
if state == 1:
print "連接超時,請重新嘗試"
return
if state == 2:
self.__again()
return
def __again(self):
self.process.sendline("yes")
self.input_pwd()
def __verify_pwd(self):
self.process.sendline(CONFIG["pwd"])
state = self.process.expect(["$", "assword"])
if state == 0:
print "登錄成功"
self.process.interact()
else:
print "登錄失敗,請檢查密碼重試。"
if __name__ == "__main__":
new_con = SSLconnect()
new_con.connect()
4.執行
如上配置好之後,就可以快速的實現SSH的登錄了,只需要執行以下命令:
python ssh.py host1#host1終端
python ssh,py host2#host2終端
注意事項
ssh_config.py和ssh.py要放在同一文件夾中,或者將ssh_config.py放在環境變量中