Paramiko的使用
目录
Paramiko的使用
在线安装
pip3 install paramiko
pip会自动安装Paramiko所依赖的包。
离线安装
如果要离线安装,则先使用pip下载。
mkdir paramiko && cd paramiko #创建一个目录存放安装包 pip download paramiko #下载到paramiko中,并传输至离线环境 pip install paramiko –no-index -f paramiko #离线环境下在目录paramiko中检索安装包
思考:
- SecureRT怎么使用?
- SecureFX怎么使用?
SSHClient方式登录
基于用户名和密码的SSHClient方式登录
编程步骤如下:
(1)初始化一个SSHClient类的实例。
(2)调用connect方法连接远程主机。
(3)执行命令获取输出结果和返回值,关闭连接。
# -*- coding: utf-8 -*- # File Name: paramiko_user_pwd.py # Description: 使用用户名密码来登陆并执行远程命令 import paramiko # 建立一个sshclient对象 ssh = paramiko.SSHClient() # 将信任的主机自动加入到host_allow列表,须放在connect方法前面 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 调用connect方法连接服务器 ssh.connect(hostname="192.168.1.3", port=22, username="root", password="000000") # 执行命令 stdin, stdout, stderr = ssh.exec_command("echo `date` && df -hl") # 结果放到stdout中,如果有错误将放到stderr中 print(stdout.read().decode('utf-8')) # returncode = stdout.channel.recv_exit_status() print("returncode:",returncode) # 关闭连接 ssh.close()
运行结果:
[root@localhost op]# python3 paramiko_user_pwd.py
Sat May 23 16:26:31 CST 2020 Filesystem Size Used Avail Use% Mounted on devtmpfs 979M 0 979M 0% /dev tmpfs 991M 0 991M 0% /dev/shm tmpfs 991M 9.6M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/mapper/centos-root 17G 2.3G 15G 14% / /dev/sda1 1014M 139M 876M 14% /boot tmpfs 199M 0 199M 0% /run/user/0 returncode: 0
本方法是传统的连接服务器、执行命令、关闭一个操作,有时候需要登录上服务器执行多个操作,如执行命令、上传/下载文件,该方法则无法实现。
基于公钥密钥的SSHClient方式登录
有些场景下,两台主机已经做过SSH授信,此时不需要密码即可登录。例如,若主机A不需要密码即可登录主机B执行命令,则在主机A上使用paramiko时只需要指定A的公钥路径即可。
生成私钥公钥对
使用ssh-keygen生成私钥公钥对,一直输入回车即可
[root@localhost op]# ssh-keygen
Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory '/root/.ssh'. 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:jmj7JU89ntQezYCa6BSL269a6YOIxpNdlcMF3Ni6nNE root@localhost.localdomain The key's randomart image is: +---[RSA 2048]----+ | ..= | | o + | | . = | | B E . | | + S . . | | + @ + . + | |..o.=.O * + o o | |.=.o.O.= o + . | |. . +o*+o o . | +----[SHA256]-----+
将公钥推送到远端服务器上
查看生成的公钥,cat /root/.ssh/id_rsa.pub
目的是验证该文件是否存在和格式是否正确
一般后面会把主机名带上,检查好格式
输出:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCccmWiXD7bAJ9Qhwcvc8a40cm6USaDBXZRGLnyYrTRy4TRhj6cnjSCC3i9agZYrDbLcII3aX9myXUf+KSMbVPcjJ/6d6tpu16Iyi2PN+X7rXL0LbOHpaZ4MNTtm+UMFMnvmf2LlEMg7pnBBbMz5RCYblB2xrTsUQC/2N91NVPyuPltZAbImLnefhCUBJmNvkwQZFpKyxACn/TpB/WO+0xcylg4/HyQGEC9Jvny7G2CrcuNZZyWWE5PBk433slJ7FTcGu+JuqVnAfpE1qpd7Y8+jtLphE6fWamYOvnBEIJgCLzxlJmvOW1p/grUTaJ4BKkeP1f6sncfZWoAJZP8Ex7R root@localhost.localdomain
将公钥推送到远端服务器上
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.32
第一次需要验证密码:
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" The authenticity of host '10.0.0.32 (10.0.0.32)' can't be established. ECDSA key fingerprint is SHA256:i02Bc0iO8z6mp3BcZc6nNAjBowdF16KWaXdNEu7tUr0. ECDSA key fingerprint is MD5:d9:fb:c9:a0:37:4d:b7:bc:e9:81:b1:27:ab:15:b5:67. Are you sure you want to continue connecting (yes/no)? yes /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@10.0.0.32's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '10.0.0.32'" and check to make sure that only the key(s) you wanted were added.
出现“wanted were added”说明添加成功了
现在我们验证一下:
ssh -l root 10.0.0.33
就可以从当前机器远程访问主机,输入命令exit退出。
附:windows 生成密钥的方法:
从官网或国内镜像 下载安装git,https://npm.taobao.org/mirrors/git-for-windows/
安装好之后,可以通过 git --version 来测试git是否安装成功。
C:\Users\maxin>git --version git version 2.28.0.windows.1
随后打开cmd,在其中使用:
ssh-keygen -t rsa
C:\Users\maxin>ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (C:\Users\maxin/.ssh/id_rsa): Created directory 'C:\Users\maxin/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in C:\Users\maxin/.ssh/id_rsa. Your public key has been saved in C:\Users\maxin/.ssh/id_rsa.pub. The key fingerprint is: SHA256:7Ip2HoPhUjiJ7dHJH9rEIZboskFOtS9YI4u0Rf7yvTo maxin@LAPTOP-28C3GCM7 The key's randomart image is: +---[RSA 2048]----+ | o | | +... | | =.*+ . | |*+B*++ o | |==Bo*o+ S | | = =+B.o | |. o +.=.. | | ..E.+. | | ..+=. | +----[SHA256]-----+
基于公钥密钥远程登陆
python文件:
# -*- coding: utf-8 -*- #Time: 2018/8/23 22:28:37 #Description: 实现公钥登陆 #File Name: sshclient_public_key.py import paramiko # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,提供password参数即可,如无则不提供 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') #建立连接 ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='10.0.0.32', port=22, username='root', pkey=pkey) # 执行命令 stdin, stdout, stderr = ssh.exec_command('echo `date` && df -hl') # 输出 print(stdout.read().decode('utf-8')) # 关闭连接 ssh.close()
[root@localhost op]# python3 sshclicent_public_key.py
Fri Jun 5 09:46:31 CST 2020 Filesystem Size Used Avail Use% Mounted on devtmpfs 979M 0 979M 0% /dev tmpfs 991M 0 991M 0% /dev/shm tmpfs 991M 9.7M 981M 1% /run tmpfs 991M 0 991M 0% /sys/fs/cgroup /dev/mapper/centos-root 17G 2.3G 15G 14% / /dev/sda1 1014M 139M 876M 14% /boot tmpfs 199M 0 199M 0% /run/user/0
SFTPClient方式登录
使用sftp上传文件(基于用户名和密码)
echo "hello world" >> 123.txt
14-2.py:
import paramiko #获取Transport实例 tran = paramiko.Transport("10.0.0.32",22) #连接SSH服务端 tran.connect(username = "root", password = "000000") #获取SFTP实例 sftp = paramiko.SFTPClient.from_transport(tran) #设置上传的本地/远程文件路径 localpath="123.txt" ##本地文件路径 remotepath="/opt/123.txt" ##上传对象保存的文件路径 #执行上传动作 sftp.put(localpath,remotepath) tran.close()
python3 14-2.py
使用sftp下载文件(基于用户名和密码)
import paramiko #获取Transport实例 tran = paramiko.Transport("10.0.0.32",22) #连接SSH服务端 tran.connect(username = "root", password = "000000") #获取SFTP实例 sftp = paramiko.SFTPClient.from_transport(tran) #设置上传的本地/远程文件路径 localpath="456.txt" ##本地文件路径 remotepath="/opt/456.txt" ##下载对象保存的文件路径 #执行下载动作 sftp.get(remotepath,localpath) tran.close()
基于公钥的上传
# -*- coding: utf-8 -*- #Time: 2018/8/23 22:28:37 #Description: 实现公钥登陆 #File Name: transport_public_key.py import paramiko # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,提供password参数即可,如无 则不提供 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') #建立连接 tran = paramiko.Transport(('10.0.0.32',22)) tran.connect(username='root',pkey=pkey) #获取SFTP实例 sftp = paramiko.SFTPClient.from_transport(tran) #设置上传的本地/远程文件路径 localpath="123.txt" ##本地文件路径 remotepath="/opt/789.txt" ##上传对象保存的文件路径 #执行上传动作 sftp.put(localpath,remotepath) # 关闭连接 tran.close()
基于公钥的下载
# -*- coding: utf-8 -*- #Time: 2018/8/23 22:28:37 #Description: 实现公钥登陆 #File Name: transport_public_key.py import paramiko # 指定本地的RSA私钥文件,如果建立密钥对时设置的有密码,提供password参数即可,如无 #则不提供 pkey = paramiko.RSAKey.from_private_key_file('/root/.ssh/id_rsa') #建立连接 tran = paramiko.Transport(('10.0.0.32',22)) tran.connect(username='root',pkey=pkey) #获取SFTP实例 sftp = paramiko.SFTPClient.from_transport(tran) #设置上传的本地/远程文件路径 localpath="012.txt" ##本地文件路径 remotepath="/opt/789.txt" ##下载对象保存的文件路径 #执行下载动作 sftp.get(remotepath,localpath) # 关闭连接 tran.close()