需求
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放在环境变量中