今天和大家分享一个第三方库paramiko,主要应用场景是在实现自动化操作服务器时使用,模拟我们手动登录服务器、输入cmd命令等操作。最后封装成自己的工具,方便后面调用。
目录
一、安装paramiko
pip install paramiko
二、学习paramiko
这里我直接和大家分享需要学习的几个方法
- Transport:这个模块主要用来创建虚拟客户端,比如我们经常用到的putty、finallshell等。在这个模块中有一个特别重要的方法connect,其中包括的参数有:
hostkey=None,
username="",
password=None,
pkey=None,
gss_host=None,
gss_auth=False,
gss_kex=False,
gss_deleg_creds=True,
gss_trust_dns=True,
最主要的还是hostkey,username,password
- SSHClient:这个模块主要是模拟用户创建登录实例,其中最重要的两个方法:set_missing_host_key_policy、exec_command。一个是连接我们刚才创建好的客户端,一个是执行cmd命令,其中exec_command的返回值有三个,stdin、stdout、stderr。分别表示:输入、输出、错误输出。
三、开始实现
1.首先我们创建SSH类
里面存在:
- 初始化__init__
- 创建客户端并连接
- 关闭客户端
- 执行cmd命令
- 上传资源
- 下载资源
2.代码展示
import paramiko
import os
import time
def to_str(bytes_or_str):
if isinstance(bytes_or_str, bytes):
value = bytes_or_str.decode('utf-8')
else:
value = bytes_or_str
return value
class SSHConnection(object):
def __init__(self, host_dict):
self.host = host_dict['host']
self.port = host_dict['port']
self.username = host_dict['username']
self.passwd = host_dict['passwd']
self.__k = None
def connect(self):
transport = paramiko.Transport(self.host, self.port)
transport.connect(username=self.username, password=self.passwd)
self.__transport = transport
def close(self):
self.__transport.close()
def run_cmd(self, command):
"""
执行shell命令,返回字典
return {'color': 'red', 'res':error}
return {'color': 'red', 'res':res}
:param command:
:return:
"""
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh._transport = self.__transport
# 执行命令
stdin, stdout, stderr = ssh.exec_command(command)
# 获取命令的结果
res = to_str(stdout.read())
# 获取错误信息
error = to_str(stderr.read())
# 如果有错误信息,返回error
# 否则返回res
if error.strip():
return {'color': 'red', 'res': error}
else:
return {'color': 'green', 'res': res}
def upload(self, local_path, target_path):
# 连接,上传
sftp = paramiko.SFTPClient.from_transport(self.__transport)
# 将xx文件上传至服务器 /xxx/xx
sftp.put(local_path, target_path, confirm=True)
print(os.stat(local_path).st_mode)
# 增加权限
sftp.chmod(target_path, os.stat(local_path).st_mode)
sftp.chmod(target_path, 0o755)
def download(self, target_path, local_path):
# 连接,下载
sftp = paramiko.SFTPClient.from_transport(self.__transport)
# 将xx 下载至服务器 /xx/xxx
sftp.get(target_path, local_path)
if __name__ == "__main__":
host_dict = dict(host='43.142.33.58', port=22, username='root', passwd='xxxx')
ssh = SSHConnection(host_dict)
ssh.connect()
cmd1 = "ls -l"
re1 = ssh.run_cmd(cmd1)
print(re1['res'])
四、效果展示
手动登录我们的服务器看看是不是这个结果:
成功!!!!
五、优化
此工具算是已经可以实现自动化对服务器进行操控了。但是有一个缺陷可以优化,就是在输入cmd命令的时候是否可以一次性输入多个命令,逐个执行,感兴趣的朋友可以再研究。
六、结束语
paramiko的使用可以方便我们对服务器进行操控,这也就方便了我们在实现自动化的过程中可以更好的、更精确地实现我们的需求。创作不易,多多支持咯~~~