标题提到两个第三方库,都是可以实现在 python 中执行 ssh 命令。fabric 是在 paramiko 的基础上封装开发的。所以一般场景下 fabric 会更加容易使用。
paramiko
paramiko 最直接的是提供 SSHClient,呈现同服务器的一个会话,基本满足我们执行远程命令,文件上下传的操作。client 连接远端服务可以通过提供 key 或者秘钥的方式,如果 使用 ssh 秘钥登录(本地生成 ssh 公秘钥, 将公钥追加到服务器登录用户目录的 .ssh/authorized_keys 中),在建立连接时,将传递密码的参数改为传递秘钥参数既可。
先用 pip 安装 paramiko。
#!/usr/bin/env python
# coding=utf-8
# by orientlu
import paramiko
class ssh_client():
def __init__(self, host=None,port=22, username=None, password=None, pkey_path=None, timeout=10):
self.client = paramiko.SSHClient()
"""
使用xshell登录机器,对于第一次登录的机器会提示允许将陌生主机加入host_allow列表
需要connect 前调用,否则可能有异常。
"""
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if password != None:
self.client.connect(hostname=host,port=port, password=password, timeout=timeout)
elif pkey_path != None:
"""使用秘钥登录"""
self.pkey = paramiko.RSAKey.from_private_key_file(pkey_path)
self.client.connect(hostname=host,port=port,pkey=self.pkey, timeout=timeout)
self.sftp = self.client.open_sftp()
def run_cmd(self, cmd):
_in, _out, _error = self.client.exec_command(cmd)
return _out.read(),_error.read()
def put_file(self, local, remote):
return self.sftp.put(localpath=local, remotepath=remote)
def get_file(self, local, remote):
return self.sftp.get(localpath=local, remotepath=remote)
def __del__(self):
self.client.close()
self.sftp.close()
if __name__ == "__main__":
print("------ paramiko ssh client test --