Python3學習之路~9.1 paramiko模塊:實現ssh執行命令以及傳輸文件


我們一般使用linux的時候,都是在Windows上安裝一個ssh客戶端連接上去。那么從一台linux如何連接到另一條linux呢?使用ssh命令即可,因為每台linux機器自己都有一個ssh客戶端。現在我們使用Python的paramiko模塊可以實現ssh客戶端,通過Python腳本遠程登錄一台機器並執行相關操作。
為什么要使用Python來實現ssh客戶端呢?主要作用是用來作批量管理。如果讓你使用ssh命令登錄1台linux機器還好,但是如果讓1000台機器同時執行一個命令怎么辦呢?當然你可以使用shell腳本寫一個for循環來實現,我們使用Python也可以實現。

paramiko模塊:基於SSH用於連接遠程服務器並執行相關操作

首先安裝paramiko模塊

基本命令:pip install paramiko
C:\Users\Administrator>pip install paramiko #由於我PC上同時安裝了Python2和Python3,所以會報錯
Fatal error in launcher: Unable to create process using '"'

C:\Users\Administrator>python3 -m pip install paramiko #用這個命令安裝就好啦
...
Successfully installed asn1crypto-0.24.0 bcrypt-3.1.6 cffi-1.12.2 cryptography-2
.6.1 paramiko-2.4.2 pyasn1-0.4.5 pycparser-2.19 pynacl-1.3.0 six-1.12.0

C:\Users\Administrator>python3 #驗證是否安裝成功
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD6
4)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko #不報錯說明安裝成功
>>>

PS:別看上面用命令安裝paramiko這么簡單,剛開始跟着網上博客離線安裝各種報錯,浪費了我整整1天的時間,哎,說多了都是淚啊。。。
Win7系統下安裝paramiko實操
[root@hadoop ~]# cd /usr/local/python3/bin/
[root@hadoop bin]# pip3 install paramiko #直接安裝會報錯,所以請按下面步驟安裝
pip._vendor.requests.packages.urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.

1.安裝組件
[root@hadoop ~]# install openssl openssl-devel python-dev   pycrypto -y
[root@hadoop ~]# yum install zlib-devel zlib #必須安裝,不安裝會報錯
[root@hadoop ~]# cd /usr/local/python3/
[root@hadoop python3]# ./configure #安裝zlib-devel需要對python3.5進行重新編譯安裝
[root@hadoop python3]# make & make install

2.安裝setuptools:
[root@hadoop python3]# cd bin
[root@hadoop bin]# pip3 install setuptools #貌似安裝python3.6時已經順帶安裝過了
Requirement already satisfied: setuptools in /usr/local/python3/lib/python3.6/site-packages

3.安裝paramiko
[root@hadoop bin]# pip3 install paramiko #安裝成功未報錯
Successfully installed asn1crypto-0.24.0 bcrypt-3.1.6 cffi-1.12.2 cryptography-2.6.1 paramiko-2.4.2 pyasn1-0.4.5 pycparser-2.19 pynacl-1.3.0 six-1.12.0
[root@hadoop bin]# python3 #驗證是否安裝成功
Python 3.6.1 (default, Sep 21 2018, 15:34:57) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko #不報錯說明安裝成功
>>> 

參考:https://www.cnblogs.com/chimeiwangliang/p/7193187.html
CentOS7系統下安裝paramiko實操

SSHClient

用於連接遠程服務器並執行基本命令

基於用戶名密碼連接:

import paramiko

# 創建SSH對象
ssh = paramiko.SSHClient()

# 允許連接不在know_hosts文件中的主機,否則可能報錯:paramiko.ssh_exception.SSHException: Server '192.168.43.140' not found in known_hosts
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 連接服務器
ssh.connect(hostname=b'192.168.43.140', port=22, username=b'root', password=b'123123')

# 執行命令
# stdin:標准輸入(就是你輸入的命令);stdout:標准輸出(就是命令執行結果);stderr:標准錯誤(命令執行過程中如果出錯了就把錯誤打到這里),stdout和stderr僅會輸出一個
stdin, stdout, stderr = ssh.exec_command('df')

# 獲取命令結果
result = stdout.read().decode() # 這個有問題,不顯示錯誤,可以修改一下,先判斷stdout有沒有值,如果輸出沒有,就顯示錯誤
print(result)

# 關閉連接
ssh.close()
#Author:Zheng Na

import paramiko

transport = paramiko.Transport(('192.168.43.140', 22))
transport.connect(username='root', password='123123')

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('df')

result = stdout.read().decode()
print(result)

transport.close()
SSHClient 封裝 Transport

基於公鑰密鑰連接:

import paramiko

# 首先指定你的私鑰在哪個位置(ssh是自動找到這個位置,Python不行,必須指定)
private_key = paramiko.RSAKey.from_private_key_file('id_rsa')

# 創建SSH對象
ssh = paramiko.SSHClient()

# 允許連接不在know_hosts文件中的主機
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 連接服務器
ssh.connect(hostname='192.168.43.140', port=22, username='root', pkey=private_key)

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

# 獲取命令結果
result = stdout.read().decode()
print(result)

# 關閉連接
ssh.close()
import paramiko

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

transport = paramiko.Transport(('192.168.43.140', 22))
transport.connect(username='root', pkey=private_key)

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('df')

result = stdout.read().decode()
print(result)

transport.close()
SSHClient 封裝 Transport
#Author:Zheng Na

import paramiko
from io import StringIO

key_str = """-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA+4kJjKuG2uYNuTZ1SsBr5kCd5GPHV9MU1OsqqXjJlFDvFwa/
/DtPNgeimA6bkHLdd63j0pDpgY/r5jcyH1bLbHMq97hYzNEJZ4GsEDMjnR0qFLTm
QtD2qj+Y6bEmNj39PgGs8sWN+1O4fPWDvGQTnmCytGOTYPA9LtMWkjHcTTNk9UqC
x5kSlhASSuf0DEtBrpKGUDT1G6BYVDQN3rALAZVAtLOEDCZWcKl8bk8OtuIc4WeL
1/5JPD0BIquPTcwl7DaALW2isut/RFiqhPWoYgexovQEiHhbuGfJQK9WFUxyOjby
9mS3BdN+1nFg4aWIa+iVH8cUMIJLxO1bJzEdjQIDAQABAoIBAQDEzPdXxGyCoDRk
kSM8FUlWoX/nzdmN8Wz/GfALIKI3FQu77GARrSXQlDC239b/MZ/tn3P8r7zCziQ3
vz/MHVCTzZf0sZtoxLSi82X4VsqqhsMB6HewF2am1ZOCZEQNdHrLJOx4FfF8joht
3Hnx0Cs5Y1bupGoPEmgMVsP2JmTDUMG5ZUCUJigRJ1W38gfx17ZFziaDWPVrMFwy
/zJ8kw5w/ZRn1pw2PeIahSFsGMFVGfm78PXVANr9wOB2YVYuQxOzzHwo8JQnBRke
wYdg1oDHn74HVBNeHUN4YXVwAP8Ggieq/mnHAb36RSIqk6y51KnypR1BiKcSmn+i
VQ6QR7GBAoGBAP81ZcL/pMenSaIQ8nev2evcqXwyJHfDRH1CWPxSygNfcePlEF1I
+OecYswPvlV+iHangnfnt1xZcTTZXQpAyn7xmKk133sOe5f4Jq2vzjqK8mqmWTDw
5OeQIQ3Uuh0XrX93CZpRhgOctL1k6exFSkGkCWnDJOX05+WGrXhoG3IlAoGBAPxQ
uUOJ2k9o1kKylMUYAYpk8y7QwwVSlBhm5Hy1Y6X1Rk2/ERuiebzpSeynXcq+rJyr
tmDaxokzasVcP+YMgDwLF1buENDA2UQzUaZjnPds4M6R89xjWbEJ6q3+jFK8JvSd
KcSJab/fP83tKApmoR0qfXR1yWEe+k5LaBTio/1JAoGAJr4XdbPTcw+9SOIjvPGw
NnMoM5d1G81D73QMCDoVOs/ZfUw/4Ll8N8Tw5qOZNGdiFgk18Df4CQf2/Jvm2PCf
DQhmMYHhLFA1iQt9664ds5t2U6RvM9POHC0wJ2Zc3p/CkfAjQA8SNigq8/mG3Xxj
WnWpjCm4x0QXlCuO2BGN4RUCgYEA0HjOKhyLcVM4vREaVKLaGwP/3e2FRS+Ox360
SMoClIvM084Lj562IT1L5CoBF9RlgGlsHiiFI7WFAZ6P+T7Y8UNkvGGlKSY+Hdid
HPJvLgwazvLO34iDAgEkkzCftnhZY4E7knTLGEqYSEgr7jQP6K5Dy+bKReG3hNtP
GvqL7mkCgYEA+MKBttwVDv8qmOx6UzVhUlVvp8W+/Db1hC0L/bnhx3Fcp0ZpV+dn
3htyqOnP4XYj86PUPFo9Vl3niQKjSuoo4EVchLTIAupndZGw238lX5puqxJJTyxZ
oNrD9RgeiT6GWeLOxnDUsp/hSASix3PRSNTrJGqdOKnwgkBJaLNM6ic=
-----END RSA PRIVATE KEY-----
"""

private_key = paramiko.RSAKey(file_obj=StringIO(key_str))
transport = paramiko.Transport(('192.168.43.140', 22))
transport.connect(username='root', pkey=private_key)

ssh = paramiko.SSHClient()
ssh._transport = transport

stdin, stdout, stderr = ssh.exec_command('df')

result = stdout.read().decode()
print(result)

transport.close()
基於私鑰字符串進行連接

SFTPClient

用於連接遠程服務器並執行上傳下載(ssh本身可以使用scp命令傳文件,它是基於sftp協議)

基於用戶名密碼上傳下載

import paramiko

transport = paramiko.Transport(('192.168.43.140', 22))
transport.connect(username='root', password='123123')

sftp = paramiko.SFTPClient.from_transport(transport)

# 將location.txt 上傳至服務器 /tmp/f_win.txt
sftp.put('location.txt', '/tmp/f_win.txt')

# 將/tmp/test.txt 下載到本地 f_linux.txt
sftp.get('/tmp/test.txt', 'f_linux.txt')

transport.close()

基於公鑰密鑰上傳下載

import paramiko

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

transport = paramiko.Transport(('192.168.43.140', 22))
transport.connect(username='root', pkey=private_key)

sftp = paramiko.SFTPClient.from_transport(transport)

# 將location.txt 上傳至服務器 /tmp/f_win.txt
sftp.put('location.txt', '/tmp/f_win.txt')

# 將/tmp/test.txt 下載到本地 f_linux.txt
sftp.get('/tmp/test.txt', 'f_linux.txt')

transport.close()
#Author:Zheng Na

import paramiko
import uuid

class Haproxy(object):

    def __init__(self):
        self.host = '192.168.43.140'
        self.port = 22
        self.username = 'root'
        self.pwd = '123123'
        self.__k = None

    def create_file(self):
        file_name = str(uuid.uuid4())
        with open(file_name,'w') as f:
            f.write('hello paramiko')
        return file_name

    def run(self):
        self.connect()
        self.upload()
        self.rename()
        self.close()

    def connect(self):
        transport = paramiko.Transport((self.host,self.port))
        transport.connect(username=self.username,password=self.pwd)
        self.__transport = transport

    def close(self):
        self.__transport.close()

    def upload(self):
        # 連接,上傳
        file_name = self.create_file()

        sftp = paramiko.SFTPClient.from_transport(self.__transport)
        sftp.put(file_name, '/tmp/tttt.txt')

    def rename(self):

        ssh = paramiko.SSHClient()
        ssh._transport = self.__transport
        # 執行命令
        stdin, stdout, stderr = ssh.exec_command('mv /tmp/tttt.txt /tmp/oooo.txt')
        # 獲取命令結果
        result = stdout.read().decode()


ha = Haproxy()
ha.run()
Demo

 

補充:

1.使用ssh的密鑰來連接遠程服務器的原理:

RSA:非對稱加密算法

公鑰:public key

私鑰:private key

如果你想連接服務器,首先本地生成密鑰對,然后本地保存私鑰,把公鑰拷貝給服務器。

比如:本地(172.16.134.128,私鑰)——>遠程服務器(172.16.134.129,公鑰)

步驟:

本地操作:
[root@hadoop ~]# ssh-keygen #生成密鑰對
[root@hadoop ~]# ssh-copy-id root@172.16.134.129  #使用命令將公鑰拷貝給遠程服務器
[root@hadoop ~]# ssh root@172.16.134.129 #登錄遠程服務器
本地(172.16.134.128)
[root@hadoop ~]# ssh-keygen  #生成密鑰對
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):   #回車,將私鑰保存在/root/.ssh/id_rsa默認文件中
Enter passphrase (empty for no passphrase):   #回車
Enter same passphrase again:   #回車
Your identification has been saved in /root/.ssh/id_rsa. #私鑰保存位置
Your public key has been saved in /root/.ssh/id_rsa.pub. #私鑰保存位置
The key fingerprint is:
SHA256:Jo4+uE0HO78Hg4+F7Nm//TYx8igi7ddbFk+vkvBH6YI root@hadoop
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|   ..o. S   . .. |
|    +=+o  o o+o. |
|   o=Boo . Bo*. .|
|  .+*+= +.EoO o. |
|  ..o++*ooo+.=.  |
+----[SHA256]-----+
[root@hadoop ~]# more /root/.ssh/id_rsa #查看私鑰,注意私鑰不要拷貝給任何人
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAsE9XuFPI0rHnLn6dDprDbAo+L9l5yYthgC2JsYAJTECchq9h
FdynquzRveBy3t0UgidFSHvTmXYsOAZC1svwWATRtq53/fRCU4Gd5FkYCB/2v2Gm
w7FxRl/ExmNJAlHhx5ZQK5qYRJWOlb1hOh+BfGJHX8ns6TuNwmv8hl9HpElgoqw1
5Lc09NZp8eHwcorKOPK0IMchdxPSQYvFvarKdNN0SQ8DhHoa5bZre46urSfnBZmr
N7AOxegpO7mGPkAqCrG2Deia9EcMLl4uHybSb6LhiueG31qOSpBgR1f71rsSMDMu
srL3MSZCtPAXYuN6yxKSQDbZbrr8HqtfrTwb5QIDAQABAoIBAGwcyyKJpfylAKj/
FNnOxwSqJ0X6KncPFAOgaO3CIHF0sUbZpkPcoafrPhYb2vSURq4k3JQ88h0JXMYh
+Lx0I/YlRl+qDoRYUo+YTLSoeVcKGqlyfOtFFLvdn/EzEqLsiPF1V8XVL4fm2Z8y
mLsmdKVMMo4naTH/xcaxpxDSvkCbhJ1f/mWJ93muLZ46IkkyA4WFBoR59IdFHoKO
Y+EFAW8AaYitvyecjFFfNhDsEcK7/Td90LaEI526+L4VGstH7bxvhyKSBl10X4QG
HWG/IhSItLaif6L32HcZ4qVNR+50fEG7gXGWogBi8kCeF9TWsd/8U2kePiP9f6Ld
JNV0TOECgYEA6HlYPDQE02434lSiwxd+TDCkpqlsy9yer4aeuVowQb0VP6l/Pgjj
vjju06hE3IUDc4502VvqGKdhMFMj7biqLFRY24tFok0CbdvIuuQDy81U7Mxp12Wt
eGjl19ibEB0MMoaw5PatcpU1ow2w9ghT6hf/AmbL6VN1dTH2ypxHZ40CgYEAwib3
mIwfgLKVFK/A/HmRDVB7fBnaqZScqGyNxcqMrg9XQmhpr1gOYJy6ziSy6zfvjZSK
zJ68GxfDwqJImYhAG4+R44yMMrvnIRnFKRUg+c522ErjpTxB/JEMfUo0ig8N2wEO
boWZrDz3d7IZaMvTiYw8ZHpesVU5SS6h19DiI7kCgYEA3VJRH5fClGvVRmOfRS8D
rZON3aFlE7ypUqBOUlY7pQpXxXEf07Zw47OeI+GKFYuI2qXgNuMbvnbzvycYCIUL
dgKjSfiQxdCdJGve8ZaMyqVkWcDObyO8/+qWD2WHUtLkvuGeXY0/WdwV4XLya3lI
MpC/1dB6B1vOclGsC/62uC0CgYBEhbA4/KtZpq2LAYShFt6kzlTmtdFArJylrLpU
pmoEPJHVdDholDFu06Hyg21KKxG27EgYc6V8AmUq2k+5MCdAEumwX7hTZ5HpUskM
+NIMmFvFdpjlhmDbnO3Fgl0MpMeFFdhcFXbpHRNSAV+KZvWfxAjEhZPKDoQLWhPw
sV4+sQKBgQCKsUWeNntWr1LdcSsRigMOJ6ZF/QLXiZkmx97UmqLFQIG9+K0s7hHb
qmsucmYZPs46qkAinimSsZ6HksSKRwRmZNEzKQgH/ua3gsjGqbjNkZKxXOCQ9PCF
l6yw27/x2onIVGj5kVGt1yYfPrBspKimPB3O7p7y3igFF/TRMTHn2A==
-----END RSA PRIVATE KEY-----
[root@hadoop ~]# more /root/.ssh/id_rsa.pub #查看公鑰
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwT1e4U8jSsecufp0OmsNsCj4v2XnJi2GALYmxgAlMQJyGr2EV3Keq7NG94HLe3RSCJ0VIe9OZdiw4BkLWy/BYBNG2rnf99EJTgZ3kWRgIH/a/YabDsXFGX8TGY0kCUeHHllArmphElY6VvWE6H4F8Ykd
fyezpO43Ca/yGX0ekSWCirDXktzT01mnx4fByiso48rQgxyF3E9JBi8W9qsp003RJDwOEehrltmt7jq6tJ+cFmas3sA7F6Ck7uYY+QCoKsbYN6Jr0RwwuXi4fJtJvouGK54bfWo5KkGBHV/vWuxIwMy6ysvcxJkK08Bdi43rLEpJANtluuvweq1+tPBvl r
oot@hadoop
[root@hadoop ~]# ssh-copy-id root@172.16.134.129 #使用命令將公鑰拷貝給遠程服務器
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.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
root@172.16.134.129's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@172.16.134.129'"
and check to make sure that only the key(s) you wanted were added.

[root@hadoop ~]# ssh root@172.16.134.129  #成功登錄遠程服務器
Last login: Fri Mar  8 02:26:32 2019 from 172.16.134.128
[root@hadoop ~]# ip addr #查看遠程服務器IP
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:bd:97:52 brd ff:ff:ff:ff:ff:ff
    inet 172.16.134.129/24 brd 172.16.134.255 scope global noprefixroute dynamic eth0
       valid_lft 1339sec preferred_lft 1339sec
    inet6 fe80::b46e:fbba:4f30:8322/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@hadoop ~]# exit #退出
登出
Connection to 172.16.134.129 closed.
[root@hadoop ~]# 
實操

注意這種連接是單向的,如果希望服務器的用戶也可以無密碼登錄我們本地的用戶,則同樣需要在服務器的用戶下生成密鑰對,並把公鑰拷貝給我們本地的用戶。

除了可以使用命令來將公鑰拷貝給服務器外,還可以直接登錄遠程服務器進行手動拷貝。

1.復制存放在/root/.ssh/id_rsa.pub的私鑰

2.用戶登錄服務器172.16.134.129

3.將私鑰拷貝到/root/.ssh/authorized_keys文件中。
[root@hadoop ~]# vi /root/.ssh/authorized_keys 
注意:
(1)公鑰在服務器的存放位置由用戶來決定。比如我想登錄服務器的root用戶,就將其拷貝到root文件夾的目標文件中。
(2)默認如果你登錄過這個用戶,則這個用戶的.ssh文件會自動生成,如果沒登錄過這個用戶,文件可能需要手動創建。
(3)如果你打開authorized_keys文件后看到其中中已經有一個公鑰了,那么這應該是別人的,就是說別人如果也想不通過用戶名密碼登錄這台服務器的話,就也會創建密鑰對並把公鑰放在這里。
(4)公鑰只有1行,拷貝的時候可能會自動換行變成3行,最終導致登錄不成功。可以先把公鑰拷到一個txt文件中查看,確定是否只有一行,如果不是,手動刪除回車變為一行。更好的辦法是用命令拷貝。

4.安全起見,查看文件的權限是不是只允許自己讀寫,如果不是,修改權限。
[root@hadoop ~]# ll /root/.ssh/authorized_keys 
-rw-r--r-- 1 root root 393 Mar  8 02:01 /root/.ssh/authorized_keys
[root@hadoop ~]# chmod 600 /root/.ssh/authorized_keys 
[root@hadoop ~]# ll /root/.ssh/authorized_keys 
-rw------- 1 root root 393 Mar  8 02:01 /root/.ssh/authorized_keys
手動拷貝公鑰
本地嘗試登錄遠程服務器時,
若登錄不成功,可以使用調試模式查看,-v
[root@hadoop ~]# ssh root@172.16.134.129 -v
若端口不是22,則需要加上端口號,比如
[root@hadoop ~]# ssh root@172.16.134.129 -p52113
登錄服務器失敗怎么辦?

2.為什么要使用公鑰連接?

基於用戶名密碼來連接遠程服務器,這是不安全的,一旦被別人拿到你的腳本,獲取到用戶名密碼,別人也就可以連接你的服務器。

3.寫Python腳本時,注意不要將名稱寫為paramiko.py,因為這與模塊名重復,執行時會有問題。

4.安裝好paramiko模塊后第一次運行,可能會出現警告:CryptographyDeprecationWarning

D:\software\Python3.6.5\python3.exe D:/python-study/s14/Day09/paramiko_ssh_pwdlogin.py
D:\software\Python3.6.5\lib\site-packages\paramiko\kex_ecdh_nist.py:39: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
  m.add_string(self.Q_C.public_numbers().encode_point())
D:\software\Python3.6.5\lib\site-packages\paramiko\kex_ecdh_nist.py:96: CryptographyDeprecationWarning: Support for unsafe construction of public numbers from encoded data will be removed in a future version. Please use EllipticCurvePublicKey.from_encoded_point
  self.curve, Q_S_bytes
D:\software\Python3.6.5\lib\site-packages\paramiko\kex_ecdh_nist.py:111: CryptographyDeprecationWarning: encode_point has been deprecated on EllipticCurvePublicNumbers and will be removed in a future version. Please use EllipticCurvePublicKey.public_bytes to obtain both compressed and uncompressed point encoding.
  hm.add_string(self.Q_C.public_numbers().encode_point())
警告信息
C:\Users\Administrator>python3 -m pip uninstall cryptography==2.5
C:\Users\Administrator>python3 -m pip install cryptography==2.4.2
參考:https://yq.aliyun.com/articles/690717
解決方法

5.若希望使用公鑰從本地win7系統登錄到遠程linux服務器,該如何在win7本地生成密鑰對呢?

方法一:可以直接從一台linux系統拷貝其私鑰到本地(注意:此系統必須已將公鑰給過你的服務器)

[root@hadoop ~]# sz ~/.ssh/id_rsa #sz命令可以將文件下載到本地

方法二:可以通過打開XShell-->工具-->新建用戶密鑰生成向導-->...-->...步驟實現

6.假如Linux下光標消失,不要急:

echo -e "\033[?25l"   #隱藏光標
echo -e "\033[?25h"   #顯示光標

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM