介绍

网络传输是遵循协议的,比如SSH,paramiko则是实现了SSHv2协议的一个python库(底层使用的是cryptography)。有了paramiko之后,我们便可以通过python使用ssh协议来连接远程服务器执行操作,不用再通过xshell等工具。安装也很简单,直接pip install paramiko即可

paramiko包含两大核心组件:SSHClient和SFTPClient

  • SSHClient的作用类似于Linux下的ssh命令,是对SSH会话的封装,该类封装了传输(transport),通道(channel)及SFTPClient建立的方法(open_sftp)等等、通常用于执行远程命令

    transport:是一种加密的会话,使用时会同步创建了一个加密的Tunnels(通道),这个Tunnels叫做Channel
    channel:是一种类Socket,一种安全的SSH传输通道
    session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话
  • SFTPClient的作用类似于Linux下的sftp命令,是对SFTP客户端的封装,用于实现远程文件操作,如:文件上传、下载、修改文件权限等操作


SSHClient的使用

一般都会先创建一个客户端实例,client = paramiko.SSHClient(),然后这个client下有很多方法

  • connect():实现远程服务器的连接与认证

    def connect(
    self,
    hostname,
    port=SSH_PORT,
    username=None,
    password=None,
    pkey=None,
    key_filename=None,
    timeout=None,
    allow_agent=True,
    look_for_keys=True,
    compress=False,
    sock=None,
    gss_auth=False,
    gss_kex=False,
    gss_deleg_creds=True,
    gss_host=None,
    banner_timeout=None,
    auth_timeout=None,
    gss_trust_dns=True,
    passphrase=None,
    ):
    常用参数:
    hostname:连接的目的主机,这个参数是必须的
    port=SSH_PORT:指定端口,默认是22
    username=None:验证的用户名
    password=None:验证的用户密码
    pkey=None:私钥方式用于身份验证
    key_filename=None:一个文件名或者文件列表,指定私钥文件
    timeout=None:可选的tcp连接超时时间
    allow_agent=True:是否允许连接到ssh代理,默认为True
    look_for_keys=True 是否在~/.ssh中搜索私钥文件,默认为True 允许
    compress=False, 是否打开压缩
  • set_missing_host_key_policy():设置远程服务器没有在know_hosts文件中记录时的应对策略。目前支持三种策略:

    设置连接的远程主机没有本地主机密钥或HostKeys对象时的策略,目前支持三种:
    
    AutoAddPolicy 自动添加主机名及主机密钥到本地HostKeys对象,不依赖load_system_host_key的配置。即新建立ssh连接时不需要再输入yes或no进行确认
    WarningPolicy 用于记录一个未知的主机密钥的python警告。并接受,功能上和AutoAddPolicy类似,但是会提示是新连接
    RejectPolicy 自动拒绝未知的主机名和密钥,依赖load_system_host_key的配置。此为默认选项
  • exec_command():在远程服务器执行Linux命令的方法。

  • open_sftp():在当前ssh会话的基础上创建一个sftp会话。该方法会返回一个SFTPClient对象。

    # 利用SSHClient对象的open_sftp()方法,可以直接返回一个基于当前连接的sftp对象,可以进行文件的上传等操作.
    
    sftp = client.open_sftp()
    sftp.put('1.txt','2.txt')
import paramiko

# 实例化SSHClient
client = paramiko.SSHClient() # 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='47.94.174.89', port=22, username='root', password='zgdasdas223') # 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command('ls / ') # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值 # 打印执行结果
print(stdout.read().decode('utf-8'))
"""
bin
boot
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
""" # 关闭SSHClient
client.close()
import paramiko

# 实例化SSHClient
client = paramiko.SSHClient() # 自动添加策略,保存服务器的主机名和密钥信息,如果不添加,那么不再本地know_hosts文件中记录的主机将无法连接
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 连接SSH服务端,以用户名和密码进行认证
client.connect(hostname='47.94.174.89', port=22, username='root', password='zggdsadsa13') # 打开一个Channel并执行命令
stdin, stdout, stderr = client.exec_command('dsadasdasdas ') # stdout 为正确输出,stderr为错误输出,同时是有1个变量有值 # 打印执行结果
print(stderr.read().decode('utf-8'))
"""
bash: dsadasdasdas: command not found
""" # 关闭SSHClient
client.close()


SFTPClient的使用

SFTPCLient作为一个sftp的客户端对象,根据ssh传输协议的sftp会话,实现远程文件操作,如上传、下载、权限、状态

from_transport(cls,t) 创建一个已连通的SFTP客户端通道
put(localpath, remotepath, callback=None, confirm=True) 将本地文件上传到服务器 参数confirm:是否调用stat()方法检查文件状态,返回ls -l的结果
get(remotepath, localpath, callback=None) 从服务器下载文件到本地
mkdir() 在服务器上创建目录
remove() 在服务器上删除目录
rename() 在服务器上重命名目录
stat() 查看服务器文件状态
listdir() 列出服务器目录下的文件
import paramiko

# 获取transport实例
transport = paramiko.Transport(("47.94.174.89", 22)) # 连接ssh,通过username和password
transport.connect(username="root", password="dasdsadas3") # 获取SFTP实例
sftp = paramiko.SFTPClient.from_transport(transport) # 执行下载文件
sftp.get("/root/dockerfile", "dockerfile") # 执行上传文件
sftp.put("1.py", "/root/11.py") transport.close()

paramiko:实现ssh协议,对linux服务器资源的访问的更多相关文章

  1. 通过SSH服务登陆linux服务器(版本RHEL7)

    通过SSH服务登陆linux服务器(版本RHEL7) SSH服务概述:是一种能够以安全的方式提供远程登陆的协议,也是目前远程管理linux系统的首选方式.在此之前,我们一般使用FTP或者telnet来 ...

  2. iTerm 2打造ssh完美连接Linux服务器快捷方法

    iTerm 2打造ssh完美连接Linux服务器快捷方法 2019年05月02日 10:40:19 Mars0908 阅读数 213更多 个人分类: Mac下开发   版权声明:本文为博主原创文章,遵 ...

  3. 保持SSH连接的linux服务器不断线

    目录 1. secureCRT和putty连接设置 2. 命令行设置 3. 服务器配置修改 4. 参考 使用ssh连接远程服务器的时候,如果长时间没有操作,远程连接就有可能中断.正在执行的程序和vim ...

  4. ssh远程登录linux服务器

    ssh远程登录linux服务器 用法: ssh -l user -p port server_ip 或者 ssh -p port user@server_ip 参数: -l 后接要登录的远程系统用户名 ...

  5. 如何在Windows系统上利用Telnet协议连接Linux服务器

    Telnet协议是Internet远程登录服务的标准协议,它为用户提供了在本地计算机上完成远程主机工作的能力.很多终端使用者都习惯在计算机上利用Telnet会话来远程控制服务器.这里小编就分两步为大家 ...

  6. python paramiko模块SSH自动登录linux系统进行操作

    1). Linux系统首先要开启SSH服务:service ssh status 如果没安装的话,则要:apt-get install openssh-server service ssh resta ...

  7. Mac下使用终端连接远程使用ssh协议的git服务器

    最近换了台新电脑, MacBook pro,拿到新电脑之后小小心喜了一下(终于解脱windows的束缚拥抱mac啦), 然后就开始苦逼的安装各种开发环境了. 之前在windows上使用tortoise ...

  8. [Linux][Mac]如何使用SSH登陆远程Linux服务器&使用SCP下载远程终端文件

    --------------------------- 2017-01-16 初版 2017-01-17 增加ssh登录端口修改 -------------------------- 一.使用ssh ...

  9. Jmeter通过SSHCommand测试获取Linux服务器资源文件信息

    有些时间我们想通过接口测试来获取服务器上面的某个资源文件信息,应该怎么办? 别急.... Jmeter通过ssh协议可以实现这个操作. 下面来看一下具体的实现吧. 需要提前安装好的工具: 1.按照好j ...

随机推荐

  1. Ironic 裸金属实例的部署流程

    目录 文章目录 目录 逻辑架构 部署架构 前提条件 部署流程 iSCSI Deploy UML PXE Deploy Driver Direct Deploy UML IPA Deploy Drive ...

  2. keyston报错处理

    1.35357端口启动不了 [root@controller conf.d]# openstack project create --domain default \ > --descripti ...

  3. Jconsole、JvisualVM无法连接Tomcat服务

    转载自:https://blog.csdn.net/qq_27790011/article/details/88799587 打开TomcatXw.exe找到java选项卡,添加以下参数 -Dcom. ...

  4. JSP 自定义标签的开发流程

    1.编写一个实现Tag接口的标签处理器类 package cn.itcast.web.tag; import java.io.IOException; import javax.servlet.htt ...

  5. k8s 删除ns 卡住的解决办法

    在某些情况下,在k8s中会无法删除某个namespace,它会一直卡在terminating状态下.解决这个问题的步骤为: kubectl api-resources --verbs=list --n ...

  6. JavaScript基础入门07

    目录 JavaScript 基础入门07 BOM window对象 Navigator对象 Screen 对象 Location对象 History 对象 JavaScript 基础入门07 BOM ...

  7. HNU_团队项目_数据库框架Mybatis_环境配置和样例

    前言 数据库从最传统的JDBC连接方式和数据库池化技术到Hibernate的使用,再到Mybatis的快捷轻量级操作,技术迭代的速度飞快. 在了解了基础的理论和方法后,学习前沿编程框架.工具,我认为是 ...

  8. jvm的学习笔记:二、类的初始化,代码实战(4)

    当接口被初始化的时候,不要求其父类被初始化 System.out.println(MyChild5.c); 输出: MyChild5 1 依据:new Random().nextInt(3)并非编译区 ...

  9. win10切换网络位置,加入已经建好的工作网络或者家庭网络时输入密码仍然加不成功时

    为了连接办公室的共享打印机,WIN10网络需要加入已经建好的家庭组,本机WIN10已经是专用网络,但是加入家庭组输入家庭组密码后,加不进去: 经过windows错误检测,查出是网络IPV6配置关掉导致 ...

  10. 关于session的一些问题

    最近在做项目的时候碰见了session过期的问题,然后就上网查了一些资料,我将我整理过的知识点梳理一下,顺便说一下我的使用方案. Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存 ...