一直以来都是手工发布项目,服务器数量多不仅浪费时间还容易出错引起发布事故,所以最近趁着测试迭代任务轻,帮项目组写了一套自动发布的web平台,今天先来记录一下连接服务器的这个过程。
连接服务器用的是第三方库Paramiko,非常强大,可以实现文件的上传/下载,还可以执行命令行,这里只会用到这几个简单的功能
Windows server 、Linux都可以连接,亲测有效!官方文档在这paramiko
先通过pip安装一下
$ pip install paramiko
话不多说,先看代码,这边我是把paramiko提供的api再封装了一下
import paramiko
from logger import info # 我自己封装的日志模块,不用导入
# 把连接断开等一系列操作封装一下
class SSHConnect(object):
def __init__(self, hostname='hostname' username='username', password='password', port=22, timeout=10):
self.hostname = hostname
self.username = username
self.password = password
self.port = port
self.timeout = timeout
# 通过账号密码连接服务器
def connect(self):
try:
transport = paramiko.Transport((self.hostname, self.port))
transport.banner_timeout = self.timeout
transport.connect(username=self.username, password=self.password)
self.__transport = transport
# print(info('server connected'))
print('server connected')
except Exception as e:
print(e)
# 关闭连接
def disconnect(self):
self.__transport.close()
# print(info('server disconnect'))
print('server disconnect')
# 在远程服务器上执行命令行,接收str的命令行
def exec_cmd(self, command):
ssh = paramiko.SSHClient()
ssh._transport = self.__transport
stdin, stdout, stderr = ssh.exec_command(command)
# print(info('cmd execute done'))
return stdout.read()
# print(stdout.read())
# 上传文件到服务器,local_path为本地文件压缩包的路径
# target_path 为服务器的路径,要跟上文件名,如:
# local_path: 'D:\workspace\file.zip'
# target_path: '/root/workspace/file.zip'
def upload(self, local_path, target_path):
try:
print(info('start uploading'))
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.put(local_path, target_path) # paramiko是通过sftp传输文件的,文件大小有限制,建议将文件压缩成zip包后传输
# print(info('upload finished'))
print('upload finished')
except:
# print(info('upload failed'))
print('upload failed')
# 从服务器上获取文件, 与上传文件一致
# remote_path: 服务器文件的路径
# local_path: 本地你要保存的路径,同样要加上文件名
def download(self, remote_path, local_path):
try:
print(info('start downloading'))
sftp = paramiko.SFTPClient.from_transport(self.__transport)
sftp.get(remote_path, local_path)
print(info('download finished'))
except Exception as e:
print(e)
# 测试一下上传文件
if __name__ == '__main__':
cmd = 'pwd && ls'
local_path = 'D:\\workspace\\file.zip'
target_path = '/root/workspace/file.zip'
ssh = SSHConnect(hostname='你的服务器IP',
username='你的服务器用户名最好是root',
password='你的服务器密码')
ssh.connect()
ssh.upload(local_path, target_path) # 上传文件
ssh.exec_cmd(cmd) # 执行命令行
ssh.disconnect() # 最后记得关闭连接
demo是适合连接linux的,如果服务器是windows server的话,需要现在server上安装cygwin并开启ssh服务,这个具体的教程见我下一篇文章