pip install paramiko
作用:实现ssh远程连接
1、执行远程命令,ssh root@1.1.1.1 命令
2、文件上传、下载:scp
import paramiko
# 执行远程命令
def exeCMD():
#与远程服务器建立ssh连接
ssh_client = paramiko.SSHClient()
# 自动接收远端设备的ssh密钥
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh_client.connect(hostname="192.168.183.10",username="root",password="xxx",port="22")
# 依次按顺序返回3个文件,标准输入、标准输出、标准错误
stdin,stdout,stderr = ssh_client.exec_command("lsblk")
#默认返回的数据类型是bytes,需要转换成字符串 字节.decode() 解码
result = stdout.read().decode(encoding="UTF-8")
print(result)
print(type(result))
ssh_client.close()
if __name__ == '__main__':
exeCMD()
import os.path
import pymysql
import paramiko
import sys
from utils import fileManager as fm
#从后台数据库获取服务器ssh连接信息
def get_server_ssh_info_from_db():
try:
dbconn = pymysql.connect(host="192.168.183.10",user="admin",password="xxx",database="it")
except Exception as e:
print("数据库连接失败")
sys.exit()
cr.dbconn.cursor()
query_sql = "select ip,name,password,port from servers"
cr.execute(query_sql)
servers = cr.fetchall()
cr.close()
dbconn.close()
#print(servers)
return servers
#连接任意服务器,执行任意命令
def exeCMD(ip,name,password,cmd,port=22):
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
ssh_client.connect(hostname=ip,username=name,password=password,port=port)
stdin,stdout,stderr = ssh_client.exec_command(cmd)
result = stdout.read().decode(encoding="UTF-8")
print("服务器[%s]执行[%s]操作的结果:" % (ip,cmd))
print(result)
print("............" * 8)
#批量执行命令
def MultiExeCMD():
servers = get_server_ssh_info_from_db()
cmd = input("执行的操作:").strip()
for ip,name,password,port in servers:
exeCMD(ip=ip,name=name,password=password,port=port,cmd=cmd)
#批量上传文件
def MultiUploadFile():
src_file = input("源文件:").strip()
server_dir = input("服务器目录:").strip()
#显示源文件的校验码
src_file_md5 = fm.fileMD5(src_file)
print("源文件 [%s]的校验码: %s" % (src_file,src_file_md5))
print("......." * 8)
servers = get_server_ssh_info_from_db()
for ip,name,password,port in servers:
uploadFile(ip=ip,name=name,password=password,port=port,src_file=src_file,server_dir=server_dir)
server_file_name = uploadFile(ip=ip,name=name,password=password,port=port,src_file=src_file,server_dir=server_dir)
remoteFileMD5(ip=ip,name=name,password=password,port=port,file=server_file_name)
print("服务器[%s] 文件 [%s]的校验码:%s" % (ip,server_file_name,server_file_md5))
if server_file_md5 == src_file_md5:
print("上传成功")
else:
print("上传失败")
#上传文件功能 server_dir 服务器目录(如/tmp)
def uploadFile(ip,name,password,src_file,server_dir,port=22):
#拼接服务器上的完整目的文件名
if server_dir.endswith("/"):
server_file_name = server_dir + os.path.basename(src_file)
else:
server_file_name = server_dir + "/" + os.path.basename(src_file)
try:
ssh_conn = paramiko.Transport((ip,port))
except Exception as e:
print("服务器[%s] ssh连接失败,检查ip,port是否正确" % ip)
sys.exit()
ssh_conn = paramiko.Transport((ip,port))
ssh_conn.connect(username=name,password=password)
sftp = paramiko.SFTPClient.from_transport(ssh_conn)
sftp.put(src_file,server_file_name)
sftp.close()
ssh_conn.close()
return server_file_name
if __name__ == '__main__':
uploadFile(ip="192.168.183.10",name="root",password="xxx",port="22"),src_file=r"D:/project/aa.txt",server_dir="/tmp"
#连接任意服务器,获取任意文件的校验码
def remoteFileMD5(ip,name,password,file,port=22):
md5sum = "md5sum %s | awk '{print $1}'" % file
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy)
try:
ssh_client.connect(hostname=ip,name=name,password=password,port=port)
except Exception as e:
print("服务器 [%s] 连接失败" % ip)
sys.exit()
stdin,stdout,stderr = ssh_client.exec_command(md5sum)
result = stdout.read().decode(encoding="UTF-8").strip()
ssh_client.close()
return result
if __name__ == '__main__':
remoteFileMD5(ip="192.168.183.10",name="root",password="xxxx",port=22,file="/etc/passwd")
#文件上传、下载
def uploadFile():
# 与服务器建ssh连接
ssh_conn = paramiko.Transport(("192.168.183.10",22))
ssh_conn.connect(username="root",password="xxxx")
# 基于ssh连接创建一个ftp客户端
sftp = paramiko.SFTPClient.from_transport(ssh_conn)
#上传文件,目的文件必须写完整路径
sftp.put(r"D:/project/aa.txt","/tmp/aa.txt")
sftp.close()
ssh_conn.close()
#下载文件,目的文件必须写完整路径
sftp.get(r"/etc/fstab",r"D:/project/fstab")
sftp.close()
ssh_conn.close()
if __name___ = '__main__':
uploadFile()
# MultiExeCMD()
# exeCMD(ip="192.168.183.10",name="root",password="xxxx",port=22,cmd="free -m")
# get_server_ssh_info_from_db()
# cmd = input("执行的操作:").strip()