1.什么是paramiko是什么?
基于ssh用于连接远程服务器做操作:
远程执行命令
上传文件

import paramiko 导入模块

#ssh username@ip
#创建一个ssh对象
client = paramiko.SSHClient() 创建一个ssh对象,使用变量client 接收
#解决的问题:如果之前没有连接过的ip(主机),会出现
"""
The authenticity of host '172.25.0.101 (172.25.0.101)' can't be established.
ECDSA key fingerprint is 9d:37:08:8e:a4:ad:45:b5:eb:69:6f:d2:88:d3:da:8c.
Are you sure you want to continue connecting (yes/no)? yes
"""
#自动选择yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
client.connect(
hostname='172.25.0.101',
username='root',
password='redhat'
)
#执行操作
#标准输入 标准输出 标准错误输出
stdin,stdout,stderr = client.exec_command('')
#获取命令的执行结果
print(stdout.read().decode('utf-8'))

#关闭连接
client.close()

2.paramiko批量远程密码连接

当需要处理的主机比较多的时候,可以使用批量连接的方式。将需要连接的主机ip,用户名称以及密码等信息,按照固定的格式保存在文件中,通过读取文件中的内容实现批量自动连接进行操作。

主要步骤:
1 将上述的远程密码连接主机进行操作,定义成一个函数。
2 将需要批量连接处理的主机信息,写在文件中,文件对象也是一个可迭代的对象,使用循环遍历对所有的主机进行连接操作。

from paramiko.ssh_exception import\
NoValidConnectionsError,AuthenticationException

def connect(cmd,hostname,user,password):
import paramiko
#创建一个ssh对象
client = paramiko.SSHClient()
#解决的问题:如果之前没有连接过的ip(主机),会出现
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:

连接的服务器

    client.connect(
        hostname=hostname,
        username=user,
        password=password
    )
except NoValidConnectionsError as e:
    return '主机%s连接失败' %(hostname)
except AuthenticationException as e:
    return '主机%s密码错误' %(hostname)
except Exception as e:
    return '未知错误:',e

#执行操作
stdin,stdout,stderr = client.exec_command('hostname')
#获取命令的执行结果
print(stdout.read().decode('utf-8'))

#关闭连接
client.close()

if name == 'main':
with open('hosts') as f:
for line in f:

172.25.0.250:root:dd

        hostname,username,password = line.strip().split(':')
        res = connect('pwd',hostname,username,password)
        print(hostname.center(50,'*'))
        print('主机名:',res)

3.paramiko基于公钥和私钥的连接

要注意的是:我们当前用户(执行此程序的用户)要免秘连接的一台主机、
用户拿到的是私钥 要连接的主机要挂载公钥

连接的前提是,需要提前将公钥放置被连接主机的指定用户~/.ssh 目录中。将私钥放置在客户端主机的指定用户~/.ssh 中 设置ssh服务公钥以及私钥

连接操作步骤与第一个所以密码连接基本一致,值守在连接主机的时候,不在使用密码,而是使用生成的私钥对象。

import paramiko
client = paramiko.SSHClient()
#创建一个私钥对象
private_key = paramiko.RSAKey.\
from_private_key_file('/home/kiosk/.ssh/id_rsa')
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接服务器
client.connect(
hostname='172.25.0.250',
username='root',
pkey=private_key
)
#执行操作
#标准输入 标准输出 标准错误输出
stdin,stdout,stderr = client.exec_command('')
#获取命令的执行结果
print(stdout.read().decode('utf-8'))
#关闭连接
client.close()

4.paramiko基于用户和密码的上船和下载文件

import paramiko
from paramiko import AuthenticationException,SSHException

def put(hostname,password,source_name,target_name):
try:

类似于ssh+ftp命令

    #建立与远程主机的通道
    tarnsport = paramiko.Transport((hostname,22))
    #验证用户名和密码是否正确
    tarnsport.connect(username='root',password=password)
    #根据创建并验证成功的通道
    sftp = paramiko.SFTPClient.from_transport(tarnsport)
except AuthenticationException as e:
    return '主机%s密码错误' %(hostname)
except Exception as e:
    return '未知错误:',e
else:
    # 上传文件
    sftp.put(source_name,target_name)
    #下载文件
    #sftp.get('/mnt/name')

finally:
    # 关闭两台主机建立的通道
    tarnsport.close()

put('172.25.254.250','dd','/etc/passwd','/mnt/172.25.254.250')