前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >paramiko模块

paramiko模块

作者头像
用户1679793
发布2018-04-28 09:39:33
1.4K0
发布2018-04-28 09:39:33
举报

1.定义

paramiko是一个基于SSH用于连接远程服务器并执行相关操作(SSHClient和SFTPClinet,即一个是远程连接,一个是上传下载服务),使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现实。

2.使用实例

使用paramiko模块远程连接分为两种:1.只用SSHClient 2.自己创建一个transport

基于用户名和密码连接方式1:

python版本:Python 3.5.1

代码语言:javascript
复制
import paramiko
#创建ssh对象
ssh = paramiko.SSHClient()
#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
ssh.connect(hostname='45.199.182.238',port=23424,username='zww',password='123')
#执行命令并获取命令输出结果
stdin,stdout,stderr=ssh.exec_command('df -h')
res=stdout.read()
print(res.decode())
#关闭连接
ssh.close()

基于用户名和密码连接方式2:

代码语言:javascript
复制
import paramiko
transport = paramiko.Transport(('45.199.182.238',23424))
transport.connect(username='zww',password='123')
ssh=paramiko.SSHClient()
ssh._transport=transport
stdin,stdout,stderr=ssh.exec_command('df -h')
print(stdout.read().decode())
transport.close()

 基于公钥秘钥连接方式1:

代码语言:javascript
复制
#使用ssh-keygen命令创建秘钥对,公钥添加到目标主机对应用户的authorized_keys文件(远程添加公钥:ssh-copy-id '-p23424 zww@45.199.182.238')
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='45.199.182.238',port=23424,username='zww',pkey=private_key)
stdin,stdout,stderr=ssh.exec_command('df -h')
print(stdout.read().decode())
ssh.close()

  基于公钥秘钥连接方式2:

代码语言:javascript
复制
import paramiko
private_key= paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
transport=paramiko.Transport(('45.199.182.238',23424))
transport.connect(username='zww',pkey=private_key)
ssh=paramiko.SSHClient()
ssh._transport=transport
stdin,stdout,stderr=ssh.exec_command('df -h')
print(stdout.read().decode())
transport.close()

 基于用户名和密码连接远程服务器并进行上传下载方式1:

代码语言:javascript
复制
import paramiko
transport=paramiko.Transport(('45.199.182.238',23424))
transport.connect(username='zww',password='123')
sftp=paramiko.SFTPClient.from_transport(transport)
sftp.put('/root/a.log','/tmp/a.log')   #上传
sftp.get('/home/zww/abc.txt','/tmp/a.txt')  #下载

  基于公钥秘钥连接远程服务器并进行上传下载方式:

代码语言:javascript
复制
import paramiko
private_key = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa')
transport = paramiko.Transport(('45.199.182.238', 23424))
transport.connect(username='zww', pkey=private_key)
sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('/tmp/po.sh', '/tmp/abc.py')
# 将remove_path 下载到本地 local_path
sftp.get('/tmp/a.log', '/root/a.log')
transport.close()

 实现远程连接服务器获取执行命令结果和文件上传下载:

代码语言:javascript
复制
import paramiko
class SSHConnection(object):
    def __init__(self,host='45.199.182.238',port=23424,username='zww',password='123'):
        self.host = host
        self.port = port
        self.username = username
        self.password = password
        self.__k=None
    def run(self):
        self.connect() #连接远程服务器
        self.upload('/root/test.txt','/home/zww/a.txt')#上传本地文件到远端服务器
        self.cmd('df -h')
        self.close() #关闭连接
    def connect(self):
        transport=paramiko.Transport((self.host,self.port))
        transport.connect(username=self.username,password=self.password)
        self.__transport=transport
    def close(self):
        self.__transport.close()
    def upload(self,local_path,ssh_path):
        sftp=paramiko.SFTPClient.from_transport(self.__transport)
        sftp.put(local_path,ssh_path)
    def cmd(self,command):
        ssh=paramiko.SSHClient()
        ssh._transport=self.__transport
        stdin,stdout,stderr=ssh.exec_command(command)
        print(stdout.read().decode())

obj=SSHConnection()
obj.run()

 另外一种方法实现远程连接主机:

代码语言:javascript
复制
import paramiko, sys, os, socket, select, getpass
from paramiko.py3compat import u
tran = paramiko.Transport(('45.199.182.238', 23424,))
tran.start_client()
tran.auth_password('zww', '123')
# 打开一个通道
chan = tran.open_session()
# 获取一个终端
chan.get_pty()
# 激活器
chan.invoke_shell()
while True:
    readable, writeable, error = select.select([chan, sys.stdin, ],[],[],1)
    if chan in readable:
        try:
            x = u(chan.recv(1024))
            if len(x) == 0:
                print('\r\n*** EOF\r\n')
                break
            sys.stdout.write(x)   # 写入缓冲区
            sys.stdout.flush()    # 刷新,将缓冲区内容显示出来
        except socket.timeout:
            pass
    if sys.stdin in readable:
        inp = sys.stdin.readline()
        chan.sendall(inp)
chan.close()
tran.close()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.定义
  • 2.使用实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档