在学习了paramiko模块后,可以利用该模块连接linux服务器,然后进行一系列的linux操作。

# -*- coding: utf-8 -*-

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='xxx')

# 执行命令,可以执行linux命令或脚本
stdin, stdout, stderr = ssh.exec_command('df')
stdin2, stdout2, stderr2 = ssh.exec_command('pwd')
# 获取命令结果
result = stdout.read()
result2 = stdout2.read()
print result
print result2
# 关闭连接
ssh.close()

基于用户名和密码的 transport 方式登录 
以上是传统的连接服务器、执行命令、关闭的一个操作,有时候需要登录上服务器执行多个操作,比如执行命令、上传/下载文件则无法实现,可以通过如下方式来操作

import paramiko
  
transport = paramiko.Transport(('IP地址',22))
transport.connect(username='root',password='xxx')
  
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

class SSHProxy(object):
    def __init__(self, hostname, port, username, password):
        self.hostname = hostname
        self.port = port
        self.username = username
        self.password = password

        self.transport = None

    def open(self):
        self.transport = paramiko.Transport((self.hostname, self.port))
        self.transport.connect(username=self.username, password=self.password)

    def command(self, cmd):
        ssh = paramiko.SSHClient()
        ssh._transport = self.transport

        stdin, stdout, stderr = ssh.exec_command(cmd)
        result = stdout.read()
        return result

    def upload(self, local_path, remote_path):
        sftp = paramiko.SFTPClient.from_transport(self.transport)
        sftp.put(local_path, remote_path)
        sftp.close()

    def close(self):
        self.transport.close()

    def __enter__(self):
        self.open()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()

if __name__ == '__main__':

    with SSHProxy("123.206.16.61",22,'root','xxx') as ssh:
        ssh.command('df')
        ssh.upload(r'D:\wupeiqi\s27\day01\4.基于paramiko操作\xx', '/data/s27/xx')
posted on 2019-06-19 15:12  雨之夜&秋  阅读(314)  评论(0编辑  收藏  举报