Python代碼通過SSH實現遠程文件上傳、下載以及指令傳遞

需要使用庫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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章