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