paramiko 模块
paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一
个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,
值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实
下载安装
pip install paramiko
远程链接
远程链接分为两种:一种是基于用户名密码
一种是基于公钥和私钥
基于用户名密码
import paramiko
创建SSH对象
ssh = paramiko.SSHClient()
允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
连接服务器
ssh.connect(hostname='ip地址', port=22, username='root', password='@999')
执行命令
stdin, stdout, stderr = ssh.exec_command('ls')
获取命令结果
result = stdout.read()
print(result)
关闭连接
ssh.close()
SSHClient()封装transport
import paramiko
transport = paramiko.Transport(('ip地址', 22))
transport.connect(username='root', password='密码')
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('ssh命令')
print(stdout.read())
transport.close()
基于公钥和私钥
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa路径')
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='hostname', port=22, username='username', key=private_key)
# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()
# SSHClient()封装transport
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa路劲')
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='root', pkey=private_key)
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command('ssh命令')
transport.close()
远程操作服务器
远程操作分为两种:一种是SSHClient(),对服务器进行命令操作
一种是<span class="hljs-selector-tag">SFTPClient</span><span class="hljs-selector-class">.from_transport</span>(), 上传下载服务</code></pre>
SFTPClient.from_transport()
# 基于公钥私钥
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('id_rsa路劲')
transport = paramiko.Transport(('hostname', 22))
transport.connect(username='用户名', pkey=private_key )
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/location.py', '/tmp/test.py')
# 将remove_path 下载到本地 local_path
sftp.get('remove_path', 'local_path')
transport.close()
# 基于用户名密码
import paramiko
transport = paramiko.Transport(('ip地址', 22))
transport.connect(username='root', password='密码')
sftp = paramiko.SFTPClient.from_transport(transport)
# 将up.py 上传至服务器
# sftp.put('up.py', 'up.py')
#将服务器的文件 下载到本地
sftp.get('up9.py', 'up_9.py')
transport.close()
paramiko之SSH进阶版
'''
实现一次链接服务器,操作多次命令,手动关闭transport
'''
import paramiko
class SSHProxy(object):
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, hostname, port, username, private_key_path)</span></span>:
<span class="hljs-keyword">self</span>.hostname = hostname
<span class="hljs-keyword">self</span>.port = port
<span class="hljs-keyword">self</span>.username = username
<span class="hljs-keyword">self</span>.private_key_path = private_key_path
<span class="hljs-keyword">self</span>.transport = None
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">open</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
private_key = paramiko.RSAKey.from_private_key_file(<span class="hljs-keyword">self</span>.private_key_path)
<span class="hljs-keyword">self</span>.transport = paramiko.Transport(<span class="hljs-keyword">self</span>.hostname, <span class="hljs-keyword">self</span>.port)
<span class="hljs-keyword">self</span>.transport.connect(username=<span class="hljs-keyword">self</span>.username, pkey=private_key)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">close</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
<span class="hljs-keyword">self</span>.transport.close()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">command</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, cmd)</span></span>:
ssh = paramiko.SSHClient()
ssh._transport = <span class="hljs-keyword">self</span>.transport
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
ssh.close()
<span class="hljs-keyword">return</span> result
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">upload</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, local_path, remote_path)</span></span>:
sftp = paramiko.SFTPClient.from_transport(<span class="hljs-keyword">self</span>.transport)
sftp.put(local_path, remote_path)
sftp.close()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__enter__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
<span class="hljs-keyword">self</span>.open()
<span class="hljs-keyword">return</span> <span class="hljs-keyword">self</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__exit__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, exc_type, exc_val, exc_tb)</span></span>:
<span class="hljs-keyword">self</span>.close()
if _name_ == 'main':
with SSHProxy('192.168.16.129', 22, 'root', 'id_rsa') as proxy:
# proxy.upload('your.tar', '/data/your.tar')
v = proxy.command('ifconfig')
print(v)
SSHProxy组件,(StringIO)私钥读写在内存
import paramiko
from io import StringIO
class SSHProxy(object):
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, hostname, port, username, private_key_string)</span></span>:
<span class="hljs-keyword">self</span>.hostname = hostname
<span class="hljs-keyword">self</span>.port = port
<span class="hljs-keyword">self</span>.username = username
<span class="hljs-keyword">self</span>.private_key = paramiko.RSAKey(file_obj=StringIO(private_key_string))
<span class="hljs-keyword">self</span>.transport = None
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">open</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
<span class="hljs-keyword">self</span>.transport = paramiko.Transport((<span class="hljs-keyword">self</span>.hostname, <span class="hljs-keyword">self</span>.port))
<span class="hljs-keyword">self</span>.transport.connect(username=<span class="hljs-keyword">self</span>.username, pkey=<span class="hljs-keyword">self</span>.private_key)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">close</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
<span class="hljs-keyword">self</span>.transport.close()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">command</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, cmd)</span></span>:
ssh = paramiko.SSHClient()
ssh._transport = <span class="hljs-keyword">self</span>.transport
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read()
<span class="hljs-comment"># ssh.close()</span>
<span class="hljs-keyword">return</span> result
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">upload</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, local_path, remote_path)</span></span>:
sftp = paramiko.SFTPClient.from_transport(<span class="hljs-keyword">self</span>.transport)
sftp.put(local_path, remote_path)
sftp.close()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__enter__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>)</span></span>:
<span class="hljs-keyword">self</span>.open()
<span class="hljs-keyword">return</span> <span class="hljs-keyword">self</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__exit__</span><span class="hljs-params">(<span class="hljs-keyword">self</span>, exc_type, exc_val, exc_tb)</span></span>:
<span class="hljs-keyword">self</span>.close()
if _name_ == 'main':
with SSHProxy('1.2.3.4', 22, 'root', 'hello') as proxy:
proxy.upload('xx','xx')
proxy.command('ifconfig')
proxy.command('ifconfig')
proxy.upload('xx', 'xx')
with SSHProxy('5.6.7.8', 22, 'root', 'world') as proxy:
proxy.upload('xx','xx')
proxy.command('ifconfig')
proxy.command('ifconfig')
proxy.upload('xx', 'xx')