返回顶部
首页 > 资讯 > 后端开发 > Python >Python33 paramiko模块
  • 234
分享到

Python33 paramiko模块

模块paramiko 2023-01-31 07:01:37 234人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

paramiko模块 ssh登录 需要打开cmd,通过 pip install paramiko 命令来安装paramiko模块。 import paramiko #创建SSH对象 ssh = paramiko.SSHClient()

paramiko模块

ssh登录

需要打开cmd,通过 pip install paramiko 命令来安装paramiko模块。

import paramiko

#创建SSH对象
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
# ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#连接服务器
ssh.connect(hostname='192.168.21.128',port=22,username='test',passWord='123qwe')

#执行命令
stdin,stdout,stderr = ssh.exec_command('df')
##stdin标准输入:你输入的命令,会返还给你
##stdout标准输出:你的命令执行结果
##stderr标准错误:在执行过程中出现的错误

#获取命令结果
result = stdout.read()  ##标准输出,只有在命令正确的情况下才会输出,否则返回的信息为空。
print (result.decode()) ##因为linux是utf-8的bytes格式所以要decode

#关闭连接
ssh.close()

执行结果:
Traceback (most recent call last):
  File "E:/python/代码练习/A1.py", line 11, in <module>
    ssh.connect(hostname='192.168.21.128',port=22,username='test',password='123qwe')
  File "D:\python3.6.4\lib\site-packages\paramiko\client.py", line 402, in connect
    self, server_hosTKEy_name, server_key
  File "D:\Python3.6.4\lib\site-packages\paramiko\client.py", line 768, in missing_host_key
    'Server {!r} not found in known_hosts'.fORMat(hostname)
paramiko.ssh_exception.SSHException: Server '192.168.21.128' not found in known_hosts

我们可以看到报错Server '192.168.21.128' not found in known_hosts
image_1c7akfv9c3et16b7njv1h9j3in70.png-51.4kB
linux默认是没有.ssh文件的

image_1c7an1a691snp1mpf14bo13et12nq7d.png-29.3kB
第一次被ssh登录时,会弹出提示来做一个签名认证,有了这个签名认证才能正常登录,而之前用python代码去ssh登录linux时,报错就是因为找不到known_hosts这个文件,所以会报错。
image_1c7aicl891sfq1mge3o41htl162k9.png-55.9kB
通过ssh test@192.168.21.129 -P22 (只要通过ssh登录一次就会出现.ssh文件)

image_1c7aijatl1gp7365142n1kn4p0rm.png-10.8kB
而在.ssh中有known_hosts文件
image_1c7ailvs21heqa3oqfvk5kk133.png-35.1kB
可以看到known_hosts中的内容是一些加密的算法,会将被登录认证的信息存储到该文件中。

注意在上面的代码中将其中一行代码给注释掉了, ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())。该代码就是当known_hosts文件中没有被登录设备信息时,就会自动将期添加进去。
所以将该代码取消注释就可以正常登录了。

image_1c7asvoigfkk1lne1hf81upupc47q.png-35.8kB
这回看到可以正常执行代码了。

import paramiko

#创建SSH对象
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#连接服务器
ssh.connect(hostname='192.168.21.128',port=22,username='test',password='123qwe')

#执行命令
stdin,stdout,stderr = ssh.exec_command('abc')
## 这里使用abc这个无效命令

#获取命令结果
result = stdout.read()
print (result.decode())
#关闭连接
ssh.close()

执行结果:
D:\python3.6.4\python.exe E:/python/代码练习/A1.py

Process finished with exit code 0
##可以看到 执行结果为空,这说明stdout.read()只有当命令正常执行后,得到了返回结果才会输出,如果错误的话stdout.read就不会有任何输出结果。
import paramiko

#创建SSH对象
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#连接服务器
ssh.connect(hostname='192.168.21.128',port=22,username='test',password='123qwe')

#执行命令
stdin,stdout,stderr = ssh.exec_command('abc')
## 这里使用abc这个无效命令

#获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err    ##这里我们使用三元运算
print (result.decode())
#关闭连接
ssh.close()

执行结果:
D:\python3.6.4\python.exe E:/python/代码练习/A1.py
bash: abc: 未找到命令

Process finished with exit code 0
#可以看到,我们这次得到了标准错误的结果。

ssh上传、下载

ssh_sft:通过ssh上传文件

import paramiko

# 创建连接
transport = paramiko.Transport(('192.168.21.128',22))
# 连接服务器
transport.connect(username='test',password='123qwe')
##根据创建的连接+用户名密码来连接服务器

sftp = paramiko.SFTPClient.from_transport(transport)
##将transport当做参数交给paramiko.SFTPClient.from_transport
##接下来真正的传输协议是在SFTPClient中定义的(实际交互是通过SFTPClient实现的)

# 将location.py上传至服务器 /tmp/test.py
sftp.put('test.txt','/home/test/test_new.txt')

# 将remove_path 下载到本地 local_path
# sftp.get('remove_path','local_path')

transport.close()

image_1c7au539frp41ljf1725fl41rbl87.png-39.2kB
可以看到,文件成功的被传入到linux中了。

ssh_sft:通过ssh下载文件

import paramiko

# 创建连接
transport = paramiko.Transport(('192.168.21.128',22))
# 连接服务器
transport.connect(username='test',password='123qwe')

sftp = paramiko.SFTPClient.from_transport(transport)

# 将location.py上传至服务器 /tmp/test.py
# sftp.put('test.txt','/home/test/test_new.txt')

# 将remove_path 下载到本地 local_path
sftp.get('/home/test/aaaa.txt','from_linux.txt')

transport.close()

image_1c7audftbbge1feg1gjo1mhl1f5j94.png-8.6kB
成功将linux中的文件下载到本地

ssh认证

之前的代码,我们通过用户名和密码来登录linux,但是我们使用的是明文,这种情况容易被非法获取。

那么接下来我们可以通过密钥的方式来实现ssh登录。

在 192.168.21.128 linux中生成一堆密钥(私钥和公钥)

test@test-virtual-Machine:~$ 
test@test-virtual-machine:~$ ssh-keygen ##通过该命令生成
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/test/.ssh/id_rsa.
##私钥存储的位置(私钥不可以给任何人,只能自己存储好)
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
##公钥存储的位置
The key fingerprint is:
SHA256:u9dlYPkYxpc4DjIVvVRNZdx7Tq1/7eRADP1lcvsXnpM test@test-virtual-machine
The key's randomart image is:
+---[RSA 2048]----+
|          .o ..+*|
|          . o. .+|
|         . o.+o.*|
|        o . @oo**|
|        So = Bo*o|
|         .  o.* *|
|        .  . o.E=|
|         .. .  +*|
|        ..     .+|
+----[SHA256]-----+
test@test-virtual-machine:~$ 
在 192.168.21.128 linux中查看公钥

test@test-virtual-machine:~$ more .ssh/id_rsa.pub 

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCh7LDTrqAO7p9J0UgRaNkHJX8lua4hamfnLZ07Ugg2
E/nGR5pX+CWGmVelNZZVdUyRl2Riu28tbyG3mMBZ9aFZFVhPCD3aY2Y2oTQIK/t62IzBpMT9TL7GwRCF
a+S6wzx2oDU+gp2VkYOxdBEYBDD1Gj0LH6Qt7QIc4Xb6XufZdFV+T8XTRqrQ/KcWJp3fNbnaHWBWaERe
+v6RZtlPW5ermK/nfgzB2Ccq/tUQNlFUOFOI6ddNazS1bIuKOTS21FeFuBda3wLbeoe785e2XFZA2FQp
AVKtvjExsSS6PCeMbvb01JOienVm/tUPIQ21v9vup09tc/bbfS6wxkQVtc8P test@test-virtual-m
achine

## 上面我们可以看到我们复制了一整段密钥,但是确是有好几个换行符,密钥中是不能有换行符的,否则就不是原来的密钥了,也就无效了(我们直接按照下图解决存在多余换行符问题)。

test@test-virtual-machine:~$
#我们将该公钥内容copy到其他设备上,其他设备就可以使用该公钥了。

image_1c7b4eipo1hp59fss8h131fdad9h.png-36.6kB
我们直接将公钥复制到PyCharm中,可以看到有好几个换行符,那么我们就需要往前删除将其变成一行。
image_1c7b4h48niub5rmrcd1rbn1tti9u.png-9.4kB
这回密钥都在一行了,就不存在多余的换行符了,然后复制当前公钥即可。

在192.168.21.129这台linux上
    通过su命令进入root模式
    通过adduser zhangsan来添加新用户
    通过su - zhangsan命令 进入zhangsan这个用户的家目录下
    注销当前用户,使用zhangsan用户登录linux,然后在/home/zhangsan下创建'.ssh'目录,然后在'.ssh'目录下创建authorized_keys文档
    将192.168.21.128生成的公钥内容copy到authorized_keys文档中,注意copy公钥后的文档中不能有换行,否则就不是原有的公钥内容了。

    zhangsan@test-virtual-machine:~$ ll .ssh/authorized_keys 
-rw-rw-r-- 1 zhangsan zhangsan 412 2月  27 15:10 .ssh/authorized_keys
## 查看该文档当前权限是-rw-rw-r--;一共可以设置三组权限(三组rwx),第一组表示属主,第二组表示属组,第三组表示others。
r是读,w是写,x是执行;r是4,w是2,x是1。

    我们可以需要修改authorized_keys文档权限,通过 'shmod 777 authorized_keys' 来修改,4+2+1(r+w+x)=7,所以是修改该文档为三个7。

zhangsan@test-virtual-machine:~/.ssh$ chmod 777 authorized_keys 
zhangsan@test-virtual-machine:~/.ssh$ ll authorized_keys 
-rwxrwxrwx 1 zhangsan zhangsan 412 2月  27 15:10 authorized_keys*
## 此时我们可以看到该文档已经拥有最高操作权限。可以访问、修改、执行。

    但是我们只要求只有当前用户可以访问、修改、所以就要修改权限为 600。

zhangsan@test-virtual-machine:~/.ssh$ chmod 600 authorized_keys 
zhangsan@test-virtual-machine:~/.ssh$ ll authorized_keys 
-rw------- 1 zhangsan zhangsan 412 2月  27 15:10 authorized_keys
##目前只有zhangsan这个用户可以读、写了。

此时我们在192.168.21.128这个linux上
    test@test-virtual-machine:~$ ssh test@192.168.21.129 -P22
    test@192.168.21.129's password:
    可以看到我们ssh  test这个用户时,依然需要密码
    ## 这是因为我们只将公钥copy到了zhangsan下的.ssh/authorized_keys文件中,并没有copy到test用户下

    test@test-virtual-machine:~$ ssh zhangsan@192.168.21.129 -P22
Welcome to ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

687 个可升级软件包。
355 个安全更新。

Last login: Tue Feb 27 16:23:32 2018 from 192.168.21.128
zhangsan@test-virtual-machine:~$ 
## 我们ssh  zhangsan可以看到此时就不需要通过密码来登录了。
## 这里注意,如果依然提示密码登录的话,请先关闭192.168.21.128 linux端的cmd终端,重新打开再重新试一下。
之前我们通过粘贴的方式将公钥给另一台linux,粘贴的过程中出现了一些问题,那么我们下面通过其他方式来传递公钥。

在 192.168.21.129 的linux上
    zhangsan@test-virtual-machine:~$ vi .ssh/authorized_keys 
    zhangsan@test-virtual-machine:~$ rm .ssh/authorized_keys 
    zhangsan@test-virtual-machine:~$ rm -d .ssh/
    ## 我们将之前创建的文件和目录都删掉

在 192.168.21.128 的linux上
    ssh-copy-id -i /home/test/.ssh/id_rsa.pub zhangsan@192.168.21.129
    ## 直接将公钥传递给192.168.21.129

test@test-virtual-machine:~$ ssh-copy-id -i /home/test/.ssh/id_rsa.pub zhangsan@192.168.21.129
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/test/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
zhangsan@192.168.21.129's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'zhangsan@192.168.21.129'"
and check to make sure that only the key(s) you wanted were added.
## 已经成功,提示要求到192.168.21.129上检查一下。

在 192.168.21.129 的linux上:
    zhangsan@test-virtual-machine:~$ ls -a
.              .cache   .gnupg         .soGouinput       公共的  下载
..             .config  .ICEauthority  .ssh              模板    音乐
.bash_history  .dbus    .local         .Xauthority       视频    桌面
.bash_logout   .dmrc    .presage       .xinputrc         图片
.bashrc        .GConf   .profile       .xsession-errors  文档
zhangsan@test-virtual-machine:~$ 
##我们可以看到 已经存在了.ssh目录

在 192.168.21.128 的linux上:
    test@test-virtual-machine:~$ ssh zhangsan@192.168.129 -p22

^C
test@test-virtual-machine:~$ ssh zhangsan@192.168.21.129 -p22
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-21-generic x86_64)

 * Documentation:  Https://help.ubuntu.com/

687 个可升级软件包。
355 个安全更新。

Last login: Tue Feb 27 16:23:51 2018 from 192.168.21.128
zhangsan@test-virtual-machine:~$ 
##可以看到 已经实现了 免密码登录。

通过Python实现RSA秘钥认证

我们直接利用Linux中的秘钥,需要私钥拷贝到windows中

在Windows下,通过xshell  ssh连接Linux,在Linux中通过sz ~/.ssh/id_rsa将私钥保存到Windows

image_1c7e7lpem1oreaqj13hs14di1d0a9.png-10.7kB
我们将id_rsa重新命名为id_rsa_win,然后剪切到当前代码目录中

在 192.168.202.128 Linux中:
    cd .ssh ##进入.ssh目录
    cat id_rsa.pub >> authorized_keys
    ## 需要将公钥的内容copy到authorized_keys中(authorized_keys之前不存在,通过该命令会新建并将公钥内容拷贝到authorized_keys文档中);  认证时会通过authorized_keys中的公钥来认证,而不是id_rsa.pub。

如此便完成了公钥的安装。有些时候,可能会有一些权限问题,可以执行如下:
chmod 600 authorized_keys
chmod 700 ~/.ssh

python RSA认证参考网址:http://50vip.com/article/84

通过Python实现RSA秘钥认证

import paramiko

#指定私钥在哪里
private_key = paramiko.RSAKey.from_private_key_file('id_rsa_win')
## 因为在当前目录,所以直接指定文件名即可;如果在其他目录,就需要加上路径了
##这里要注意id_rsa_win是私钥、私钥、私钥(重要的事所三遍),私钥认证,公钥解密。

# 创建SSH对象
ssh = paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 链接服务器
ssh.connect(hostname='192.168.202.128', port=22, username='test', pkey=private_key)
## 这里注意,如果使用RSA认证,那么最后面就不是password了,而是pkey=private_key
## pkey 表示是private key

# 执行命令
stdin,stdout,stderr = ssh.exec_command('df')

# 获取命令结果
res,err = stdout.read(),stderr.read()
result = res if res else err
print (result.decode())

# 关闭连接
ssh.close()

执行结果:
文件系统          1K-块    已用     可用 已用% 挂载点
udev             991244       0   991244    0% /dev
tmpfs            203072    6428   196644    4% /run
/dev/sda1      19478204 5577000 12888724   31% /
tmpfs           1015344     112  1015232    1% /dev/shm
tmpfs              5120       0     5120    0% /run/lock
tmpfs           1015344       0  1015344    0% /sys/fs/cgroup
tmpfs            203072      48   203024    1% /run/user/1000
通过RSA认证上传下载

import paramiko

private_key = paramiko.RSAKey.from_private_key_file('id_rsa_win')

transport = paramiko.Transport(('192.168.202.128',22))
transport.connect(username='test',pkey=private_key)

sftp = paramiko.SFTPClient.from_transport(transport)

# 将xxx.py上传到服务器 /tmp/test.py
sftp.put('test.txt','/home/test/test_new.txt')

# 将xxx.txt下载到本地
sftp.get('/home/test/aaaa.txt','aaaa_new.txt')

transport.close()

--结束END--

本文标题: Python33 paramiko模块

本文链接: https://lsjlt.com/news/190967.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python33 paramiko模块
    paramiko模块 ssh登录 需要打开cmd,通过 pip install paramiko 命令来安装paramiko模块。 import paramiko #创建SSH对象 ssh = paramiko.SSHClient() ...
    99+
    2023-01-31
    模块 paramiko
  • python paramiko模块
        paramiko模块是python中很重要的模块,他的功能呢主要分为两大块功能。一个是模拟SSH功能登录到远程主机上执行命令。一个是模拟SFTP功能传输文件。paramiko支持密码登陆方式和免密码的私钥登录方式。密码登陆方式代码如...
    99+
    2023-01-31
    模块 python paramiko
  • Python 之 paramiko 模块
    paramiko模块是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接1.安装#paramiko模块的安装需要先安装PyCrypto模块 wget https://pypi.python.or...
    99+
    2023-01-31
    模块 Python paramiko
  • python的paramiko模块
      paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。  由于使用的是python这样的能够跨平台运行的语言,所以所有python支持的平台,如Linux, Solaris, ...
    99+
    2023-01-31
    模块 python paramiko
  • python模块paramiko与ssh
      paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连...
    99+
    2023-01-31
    模块 python ssh
  • python paramiko模块讲解
    Windows下有很多非常好的SSH客户端,比如Putty。在Python的世界里,你可以使用原始套接字和一些加密函数创建自己的SSH客户端或服务端,但如果有现成的模块,为什么还要自己实现呢。使用Paramiko库中的PyCrypto能够让...
    99+
    2023-01-31
    模块 python paramiko
  • python3导入paramiko模块
    这些指令包括paramiko 2及以上。如果你想安装paramiko 1。x,请参见安装(1.x)。然而,1.x依赖于不安全的依赖,所以升级是强烈鼓励。推荐的方式得到Paramiko是安装最新的稳定版本通过PIP:$ pip install...
    99+
    2023-01-31
    模块 paramiko
  • Python paramiko模块(实现
    开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 安装paramiko模块 pip3 install paramiko 基于用户密码方式 import paramiko # 创建...
    99+
    2023-01-31
    模块 Python paramiko
  • python paramiko模块的使
    一般使用paramiko的功能就是通过ssh远程执行命令,远程(上传、下载)传输文件等等依赖包:/usr/local/python27/bin/pip install pycrypto下载包 paramiko#wget http://en....
    99+
    2023-01-31
    模块 python paramiko
  • python下paramiko模块ssh
        python下有个paramiko模块,这个模块可以实现ssh登录linux服务器,下面贴出代码,注意,我在centos5.6下,python2.6.5,paramiko-1.7的版本下测试成功。。。#!/usr/bin/env p...
    99+
    2023-01-31
    模块 python paramiko
  • python paramiko模块简介
    python paramiko模块简介一:简介    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。    由于使用的是python这样的能够跨平台运行的语言,所以所有py...
    99+
    2023-01-31
    模块 简介 python
  • Python学习—paramiko模块实
    paramiko模块 paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能。这是一个第三方的软件包,使用之前需要安装。 import paramiko # ssh root@ip # 创建一个ssh对象 ...
    99+
    2023-01-31
    模块 Python paramiko
  • Python paramiko模块的安装
    paramiko是Python语言编写的遵循SSH2协议,支持加密和认证方式,连接远程服务器执行命令或者上传下载文件。一、安装paramikopip3 install paramiko二、使用用户名密码方式远程执行命令import para...
    99+
    2023-01-31
    模块 Python paramiko
  • python模块之paramiko学习<
    简介: paramiko是python(2.2或更高)的模块,遵循SSH2协议实现了安全(加密和认证)连接远程机器。 安装所需软件包: http://ftp.dlitz.net/pub/dlitz/crypto...
    99+
    2023-01-31
    模块 python paramiko
  • python paramiko模块管理S
    下面是两种使用paramiko连接到linux服务器的代码 方式一: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ...
    99+
    2023-01-31
    模块 python paramiko
  • Python通过paramiko模块备份
    1.过程思路 备份配置前,先保存交换机running config到starup config 交换机通过tftp备份配置文件 批量备份交换机配置(通过excel文件保存交换机IP) name ip SUZ-SW-101 ...
    99+
    2023-01-31
    备份 模块 Python
  • Python使用Paramiko模块实现
    paramiko是用python写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输以及远程命令执行。 通过安装包安装: wget ...
    99+
    2023-01-31
    模块 Python Paramiko
  • python的paramiko模块报错解
    写了一个Python脚本内容如下:#-*- coding:utf-8 -*- __author__ = 'kai' import paramiko import sys,os host = sys.argv[1] user = 'zk' ...
    99+
    2023-01-31
    报错 模块 python
  • 如何用paramiko模块写发版机
    本文小编为大家详细介绍“如何用paramiko模块写发版机”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何用paramiko模块写发版机”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。说明:为了安全,本文敏感信...
    99+
    2023-06-04
  • Python中paramiko模块的作用是什么
    这篇文章给大家介绍Python中paramiko模块的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所不能,该语言通俗...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作