Python代码通过SSH实现远程文件上传、下载以及指令传递

本文介绍如何利用Python的paramiko库实现SSH连接,进行远程文件的上传、下载以及执行命令操作,详细讲解了每个步骤的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要使用库paramiko

import paramiko # 用于SSH
import os 
  1. 文件传输

1.1 在目标主机上创建文件夹

def MakeFilePathOnBench(ip,port_number,user_name,private_key):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(hostname = ip, port=port_number, username=user_name, pkey=private_key)
	
    stdin, stdout, stderr = ssh.exec_command('find /fs/Test/SDKTest')
    result = stdout.read().decode('utf-8')
    if (len(result) != 0):
        stdin, stdout, stderr = ssh.exec_command('rm -r /fs/Test/SDKTest')
	
    CreareNewPathOnbench(ip,port_number,user_name,private_key)
    ssh.close()

def CreareNewPathOnbench(ip,port_number,user_name,private_key):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(hostname = ip, port=port_number, username="root", pkey=private_key) 
    stdin, stdout, stderr = ssh.exec_command('mkdir /fs/Test/SDKTest/')	
    ssh.close()

1.2 向目标主机上传文件

def PutFileToBench(ip,port_number,user_name,private_key):
    transport = paramiko.Transport((ip, port_number))
    transport.connect(username=user_name, pkey=private_key) 
    sftp = paramiko.SFTPClient.from_transport(transport)
    sftp.put('test_utils','/fs/Test/SDKTest/test_utils') #将可执行文件test_utils拷贝到目标路径下,并创建了同名文件
    sftp.put('test.so','/fs/Test/SDKTest/test_1.so')#将动态链接库test.so 上传到目标主机,文件名为test_1.so
    sftp.close()
    transport.close()

1.3 从目标主机下载文件

def GetLogFill(ip,port_number,user_name,private_key):
    transport = paramiko.Transport((ip, port_number))
    transport.connect(username=user_name, pkey=private_key) 
    sftp = paramiko.SFTPClient.from_transport(transport)
	
    local_dir = os.getcwd()
    remote_dir = "/fs/Test/SDKTest/"
    files = sftp.listdir(remote_dir) #files存放/fs/Test/SDKTest下的所有文件,可理解为list类型
	
    print('******************* file copy from bench ****************************')
    for f in files:
        sftp.get(os.path.join(remote_dir, f), os.path.join(local_dir, f)) #将files中的所有文件下载到当前主机的当前路径下
        print(f) #打印files中文件名
    sftp.close()
    transport.close()

2.指令传输

def execuateSDKTest(ip,port_number,user_name,private_key):
    MakeFilePathOnBench(ip,port_number,user_name,private_key)
    PutFileToBench(ip,port_number,user_name,private_key)
	
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(hostname = ip, port=port_number, username=user_name, pkey=private_key)
    chmod_cmd = "chmod -R 777 /fs/Test/SDKTest/*"
    stdin, stdout, stderr = ssh.exec_command(chmod_cmd)

    cd_cmd = "cd /fs/Test/SDKTest"
    pwd_cmd = "pwd"
    ls_cmd = "ls /fs/Test/SDKTest"
    exec_cmd = "./test_utils"

    stdin, stdout, stderr = ssh.exec_command(cd_cmd+';'+pwd_cmd+';'+exec_cmd) 
    print('******************* Gtest log information ****************************')
    for i in stdout.readlines():
        print(i)
		
    ssh.close()

3.测试程序主函数



if __name__ == '__main__':
    ip = '192.168.1.26'
    port = 22
    username = 'root'
	
    env_dist = os.environ
    private_key_path = env_dist.get('KEY_DEV') #KEY_DEV为环境变量,存放SSH链接的公钥的文件地址
	
    private_key = paramiko.RSAKey.from_private_key_file(private_key_path)
	
    execuateSDKTest(ip,port,username,private_key)
    GetLogFill(ip,port,username,private_key)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xinran0703

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值