paramiko是什么?
基于ssh用于连接远程服务器
远程执行命令
上传文件
在我们使用ssh连接服务器的时候,每连接一次就要重新输入命令,十分的麻烦,所以是写成一个脚本,连接的时候 只需要执行脚本就行
paramiko远程密码连接
#展开模块,调用模块
import paramiko
#创建一个ssh对象,使用变量client接受
client = paramiko.SSHClient()
# 在这里需要解决的是在两台机器使用ssh连接的时候,会直接跳过,已经表明选择了yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
client.connect(
hostname='192.168.100.200', 服务器的ip
username='root', 服务器的用户名
password='redhat' 连接服务的密码
)
# 执行操作 标准输入,标准输出,标准错误输出
stdin,stdout,stderr =client.exec_command('hostname')
# 获取命令的执行结果 decode('utf-8')解决的是返回结果中存在中文能够正常显示
print(stdout.read().decode('utf-8'))
# 关闭连接,在所有的连接完毕之后,关闭。
client.close()
在企业中,一个运维工程师 可能管理的不只是一台电脑,有可能是几百台或者几千台电脑,所以一台一台的连接操作是特别浪费财力和物力,所以就可以使用paramiko批量连接操作
paramiko批量远程密码连接
将需要批量处理的主机信息,写在文件中,文件对象也是一个可迭代的对象,使用循环边历对所有的主机进行连接操作
# 写出异常,自己先提前预警可能会出现的错误,将异常提前写入到python文件中
from paramiko.ssh_exception import NoValidConnectionsError,AuthenticationException
# 使用函数编辑,将所需要的写入到函数中
def connect(cmd,hostname,user,password):
import paramiko
# 创建一个ssh对象
client = paramiko.SSHClient()
在这里需要解决的是在两台机器使用ssh连接的时候,会直接跳过,已经表明选择了yes
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 写出异常
try:
# 连接服务器
client.connect(
hostname=hostname,
username=user,
password=password
)
# 全部是异常的可能会出现的情况
except NoValidConnectionsError as a:
return '主机%s连接失败'%(hostname)
except AuthenticationException as a:
return '主机%s连接失败'%(hostname)
except Exception as a:
return '未知错误',a
# 执行操作
stdin, stdout, stderr = client.exec_command('hostname')
# 获取命令的执行结果
print(stdout.read().decode('utf-8'))
client.close()
# 连接服务器的设定,以及连接服务器的内容文件
if __name__== '__main__':
with open('bbofile') as e: 此处的bbofile是提前将所有的IP 以及所有的用户和密码写入到一个文件中去的
for line in e:
hostname,username,password = line.strip().split(':')
ask = connect('pwd',hostname,username,password)
print(hostname.center(50,'*'))
print('主机名',ask)
实验效果
server.westos.com
*****************192.168.100.200******************
主机名 None
*****************192.168.100.190******************
主机名 主机192.168.100.190连接失败
*****************192.168.100.180******************
主机名 主机192.168.100.180连接失败
*****************192.168.100.100******************
主机名 主机192.168.100.100连接失败
*****************192.168.100.220******************
主机名 主机192.168.100.220连接失败
这个就是bbofile的文件内容,在用python连接的时候 会调用里边的内容
192.168.100.200:root:redhat
192.168.100.190:root:redaht
192.168.100.180:root:westos
192.168.100.100:root:westos
192.168.100.220:root:redhat
在企业中我们需要管理的机器成千上百台,由于每次连接的时候,都需要输入密码,导致其工作量巨大,所以需要paramiko进行免密连接
paramiko基于公钥和私钥的连接
由于paramiko是基于ssh进行连接的,所以可以使用公钥和私钥是指定的用户对指定主机的指定用户免密连接。
连接的前提,需要提前将公钥放置被连接主机的用户中**~/.shh** 目录中。将私钥放置在客户端汉主机的指定用户~/.ssh目录中 设置ssh服务公钥以及私钥
# 导入模块
import paramiko
# 创建一个SSH对象,使用变量client接受
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.254.120',
username='root',
pkey=private_key # 连接的时候使用私钥对象进行验证
)
# 执行操作
# 标准输入 标准输出 标准错误输出
stdin,stdout,stderr=client.exec_command('pwd')
print(stdout.read().decode('utf-8'))
client.close()
实验效果
/root
由于paramkio是基于ssh连接的,而我们在已知用户和密码的情况下,可以使用paramkio 远程操作上传和下载文件
paramiko基于用户和密码的上传和下载文件
上传
import paramiko #导入模块
#建立与远程主机的通道
tarnsport = paramiko.Transport('172.25.47.104',22)
#建立与远程主机的通道
#验证用户名和密码是否正确,连接SSH服务端
tarnsport.connect(username='root',password='redhat')
#获取SFTP 对象
sftp = paramiko.SFTPClient.from_transport(tarnsport)
#执行上传动作 本地文件路径,远程文件路径
sftp.put('/etc/passwd','/mnt/172.25.47.250')
#关闭通道
tarnsport.close()
下载
import paramiko # 导入模块
tarnsport = paramiko.Transport('172.25.47.104',22) #建立与远程主机的通道
#验证用户名和密码是否正确,连接SSH服务端
tarnsport.connect(username='root',password='redhat')
#获取SFTP 对象
sftp = paramiko.SFTPClient.from_transport(tarnsport)
#执行上传动作,远程文件路径 , 本地文件路径
sftp.get('/mnt/172.25.47.104' , '172.25.47.104')
#关闭通道
tarnsport.close()