python中paramiko远程密码链接

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

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'))ssh

#关闭链接
client.close()ide

2.paramiko批量远程密码链接函数

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

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

from paramiko.ssh_exception import\
NoValidConnectionsError,AuthenticationExceptionip

def connect(cmd,hostname,user,password):
import paramiko
#建立一个ssh对象
client = paramiko.SSHClient()
#解决的问题:若是以前没有链接过的ip(主机),会出现
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:utf-8

链接的服务器

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:ci

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')