介绍

Paramiko 一个第三方包,需要单独安装我们知道远程批量主机管理,比如ansible、Fabric,不需要安装客户端的远程执行命令等,这些都是基于Python原生的SSH,相当于模拟了一个SSH客户端。其实用的就是paramiko。其实想Fabric这种东西你自己也可以写,其实特别简单。paramiko 就是模拟了SSH的客户端,然后通过和SSH服务器交互就可以登录,执行命令等操作。

代码实例

简单的SSH登录实现

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com import paramiko def main():
# 实例化SSH客户端
ssh = paramiko.SSHClient()
# 允许连接不在 known_hosts 文件的IP
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname="172.16.42.136", port=22, username="root", password="12qwaszx!") # 执行命令,它返回三个结果,stdin 是你输入的,stdout是它返回给你的,stderr是错误信息
stdin, stdout, stderr = ssh.exec_command("ls /")
result = stdout.read()
print(result.decode(encoding="utf-8"))
ssh.close() if __name__ == '__main__':
main()

简单的SFTP实现

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: rex.cheny
# E-mail: rex.cheny@outlook.com import paramiko def main():
try:
# 实例化SSH客户端
ssh = paramiko.SSHClient()
# 允许连接不在 known_hosts 文件的IP
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname="172.16.42.136", port=22, username="root", password="12qwaszx!")
transport = ssh.get_transport() """
上面代码也可以这样写
transport = paramiko.Transport((host, port))
transport.connect(username=username, password=password)
""" sftp = paramiko.SFTPClient.from_transport(transport)
sftp.put("./readme", "/tmp")
transport.close()
except Exception as err:
print(err) if __name__ == '__main__':
main()

包含SFTP和SSH功能的代码实例

 #!/usr/bin/env python
# -*- coding: utf-8 -*- import sys
import os
import paramiko
import configparser class paramikoTools(object): def __init__(self, hostname, port, username, password, privateKeyFile=None, privateKeyFilePwd=None):
""" :param hostname: SSH服务器地址
:param port: 端口
:param username: 用户名
:param password: 密码
:param privateKeyFile: 私钥路径,如果没有则不用填写
:param privateKeyFilePwd: 私钥解压密码如果私钥加密了请务必输入否则登陆将会失败
:return:
"""
self._hostname = hostname
self._port = port
self._username = username
self._password = password
self._privateKeyFile = privateKeyFile
self._privateKeyFilePwd = privateKeyFilePwd # 实例化一个SSH客户端对象
self._sshClient = paramiko.SSHClient()
# 第一次SSH登录服务器需要输入一个Yes,这个就是帮你自动输入yes
self._sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#
self._transport = None
#
self._sftpClient = None # 用于记录是否创建了SFTP客户端实例
self._isSftpSessionOpened = False
# 用于记录当前是否已经登录
self._isLogined = False def login(self):
if self._privateKeyFile:
if os.path.exists(self._privateKeyFile):
self._isLogined = self._loginWithPrivateKey()
else:
print("私钥路径不存在。")
else:
self._isLogined = self._loginWithPassword() # 用户名和密码登陆方法
def _loginWithPassword(self):
try:
# 连接远程服务器
self._sshClient.connect(hostname=self._hostname, port=self._port, username=self._username,
password=self._password)
print("密码登陆成功。")
except Exception as err:
# print err
print("连接失败,请检查主机名、端口、用户名或者密码是否正确。")
return False
else:
return True # 私钥登陆方法
def _loginWithPrivateKey(self):
try:
if self._privateKeyFilePwd:
# 取出私钥,有时私钥加密了这里就需要设置私钥的密码,用于对私钥解密。
key = paramiko.RSAKey.from_private_key_file(self._privateKeyFile, password=self._privateKeyFilePwd)
else:
key = paramiko.RSAKey.from_private_key_file(self._privateKeyFile) self._sshClient.connect(hostname=self._hostname, port=self._port, username=self._username,
password=self._password, pkey=key)
print("秘钥登陆成功。")
except Exception as err:
# print err
print("连接失败,请检查主机名、端口、用户名、密码、私钥是否正确。")
return False
else:
return True @property
def isLogined(self):
return self._isLogined # 创建SFTP客户端
def _createSftpSession(self):
"""
我这里建立SFTP连接的方式和网上略有不同,我这里是基于现有SSH连接来建立的SFTP会话。网上很多都是单纯的建立SFTP会话
但是即便单纯建立SFTP会话其背后也要建立套接字和身份验证,可能网上的其他形式如下:
t = paramiko.Transport((host, port))
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
"""
if self._isLogined:
try:
# 使用现有SSH连接获取一个 transport
self._transport = self._sshClient.get_transport()
# 把 transport 传递进去建立SFTP客户端连接
self._sftpClient = paramiko.SFTPClient.from_transport(self._transport)
except Exception as err:
print(err)
else:
self._isSftpSessionOpened = True
else:
print("ssh会话已经关闭或者没有建立,无法创建SFTP客户端连接。")
self._isSftpSessionOpened = False # 路径检查
def _pathChect(self, localPath, remotePath):
# F 表示文件; D 表示目录
CHECK_CODE = {"CODE": "", "LOCALPATHTYPE": "F", "REMOTEPATHTYPE": "F"}
if os.path.exists(localPath):
return CHECK_CODE
else:
# 本地路径检查失败,不存在。
CHECK_CODE = {"CODE": "", "LOCALPATHTYPE": "", "REMOTEPATHTYPE": ""}
return CHECK_CODE # 获取错误码对信息
def _getCheckCodeDesc(self, temp_code):
CHECK_CODE_DICT= {"": "检查通过", "": "本地路径检查失败可能不存在"}
DESC = ""
if CHECK_CODE_DICT.has_key(temp_code):
pass
else:
DESC = "错误码不存在"
return DESC # 关闭ssh连接
def sshConnectLogOut(self):
self._sshClient.close()
self._transport.close()
self._isLogined = False
self._isSftpSessionOpened = False # 执行命令
def execCommand(self, cmd):
result = ''
if self._isLogined:
try:
# 远程执行命令,会返回元祖,里面包含输入、输出、错误
stdin, stdout, stderr = self._sshClient.exec_command(cmd)
except Exception as err:
print(err)
else:
# 输出的就是字符串内容
print(stdout.read())
# return result
else:
print("当前没有建立SSH的有效连接。") # 上传文件
def upLoadFile(self, localPath, remotePath):
count = 0
# 如果SFTP客户端会话没有建立则自动建立,尝试三次
for times in range(3):
if not self._isSftpSessionOpened:
count = times + 1
print("第 %d 次尝试建立SFTP客户端会话,如果失败将再尝试 %d 次" % (count, 3 - count))
self._createSftpSession()
if count == 3 and not self._isSftpSessionOpened:
return None
else:
continue
else:
print("SFTP客户端会话建立成功。")
break # 目前这里是直接上传,没有区分文件还是目录,所以默认只能支持文件,本地是文件路径、远程也是文件路径
try:
CODE = self._pathChect(localPath, remotePath)["CODE"]
if CODE == "":
# 路径检查都成功后如何处理
print("开始上传文件。")
self._sftpClient.put(localPath, remotePath)
print("上传文件完毕。")
else:
print(self._getCheckCodeDesc(CODE))
except Exception as err:
print(err)
else:
pass # 下载文件
def downLoad(self, remotePath, localPath):
pass def main():
# 建立ini文件读取实例
config = configparser.ConfigParser()
# 设置配置文件路径
config_file_path = '/Users/rex.chen/PycharmProjects/Study/paramikoTest/config'
# 读取文件
config.read(config_file_path)
# 获取内容,第一个参数是区,第二个参数是 键
hostname = config.get("ssh", "hostname")
port = config.getint("ssh", "port")
username = config.get("ssh", "username")
password = config.get("ssh", "password")
private_key_path = config.get("ssh", "private_key_path") a = paramikoTools(hostname, port, username, password, private_key_path, password)
a.login()
# a.execCommand("df")
# a.upLoadFile('/Users/rex.chen/Downloads/mapi-webapp.war', '/home/chenyun/update/mapi-webapp.war')
print(a.isLogined) if __name__ == "__main__":
main()

同目录的配置文件如下:

# paramiko连接使用的配置文件,不是必须的,只是这样可以避免过多的硬编码

[ssh]
hostname=
port=
username=
password=
private_key_path=

Paramiko模块简单使用的更多相关文章

  1. python paramiko 模块简单介绍

    背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 首先了解到了 p ...

  2. paramiko模块简单用法

    最简单最基本的用法 1 #__*__coding:utf-8__*__ 2 import paramiko 3 hostname = '192.168.1.1' 4 username = 'root' ...

  3. python的paramiko模块简单应用

    用法1,SSHClient 分别可以使用密码和秘钥登陆,然后执行命令,并且获取执行结果 import paramiko #创建一个SSH对象 ssh = paramiko.SSHClient() #允 ...

  4. 利用paramiko模块实现堡垒机+审计功能

    paramiko模块是一个远程连接服务器,全真模拟ssh2协议的python模块,借助paramiko源码包中的demos目录下:demo.py和interactive.py两个模块实现简单的堡垒机+ ...

  5. paramiko SSH 模块简单应用。

    目的:需要ssh链接到Linux主机,执行telnet 命令,抓回显匹配制定内容. ssh --->执行telnet到本地端口--->执行类似 ls 的命令.匹配命令执行后的特定回显字段. ...

  6. python(paramiko模块的简单使用)

    #通过paramiko模块连接主机运行bash命令 import paramiko hostname = '192.168.88.31' port = 22 username = 'root' pas ...

  7. paramiko模块,线程,进程

    关于paramiko模块 paramiko是基于Python实现的ssh2远程安全连接,支持认证及密钥方式远程执行命令.文件传输,中间ssh代理等 paramiko的安装: 安装好之后,用parami ...

  8. Python-Day9 Paramiko模块/进程/线程/RabbitMQ队列

    一.Paramiko模块 1.Paramiko安装 Python的目录下有个Scripts目录,cd到这个目录用这里面的pip命令(如果添加的环境变量可以在cmd直接输入命令):pip install ...

  9. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

随机推荐

  1. 使用JumpServer管理你的服务器

    本文介绍CentOS 7从安装jumpserver到简单使用jumpserver管理服务器. 1.Jumpserver介绍 Jumpserver是一款开源的开源的堡垒机,如下图是官网介绍. 官网地址: ...

  2. iOS开发之图片压缩实现

    使用下面两个方法,先按尺寸重绘图片,然后再降低品质上传图片data #pragma mark 裁剪照片 -(UIImage *)scaleToSize:(UIImage *)image size:(C ...

  3. js初学练手:Csdn Ads Cleaner

    最新版本在这里哒:https://greasyfork.org/zh-CN/scripts/376621-csdn-ads-cleaner 隔壁csdn的广告太猖獗啦!写个js管管它 需配合Tempe ...

  4. user-agent | what is the "user-agent" ?

    User Agent(用户代理) UA是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本.CPU 类型.浏览器及版本.浏览器渲染引擎.浏览器语言.浏览器插件等 通过抓包可以得到 下面是几个 ...

  5. ProgressBar三种style

    一.普通的ProgressBar显示如图 <ProgressBar        android:id="@+id/pbNormal"        android:layo ...

  6. ES6的Module 的用法

    在vue-cli中遇到的模糊参考 https://www.cnblogs.com/ppJuan/p/7151000.html 解决问题: 在 ES6 之前,社区制定了一些模块加载方案,最主要的有 Co ...

  7. centOS7上编译hadoop-2.7.7

    一.阅读编译文档 在hadoop源码包根目录下有个一个BUINDING.txt的文件,文件说明了编译hadoop所需要的一些编译hadoop所需要的一些编译环境相关的东西.不同hadoop版本的要求都 ...

  8. python制作词云

    需要模块wordcloud,pip install wordcloud安装即可.代码: , #边距background_color='black',#指定背景颜色font_path='simhei.t ...

  9. [python] 溜了,溜了,七牛云图片资源批量下载 && 自建图床服务器

    故事背景: 七牛云最近一波测试域名操作真是把我坑死了!这简直和百度赠送你2T网盘,之后再限速一样骚操作.于是,痛定思痛自己买个云主机.自己搭图床应用! 1.七牛图片批量下载到本地 1.1 曲折尝试 当 ...

  10. zepto与jquery冲突的解决

    一般是不会把zepto和jquery一起来用的.但有时候要引入一些插件,可能就会遇到这样的问题. jquery noConflict() jquery有一个方法叫noConflict() ,可以把jq ...