Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การ Copy ไฟล์ระหว่าง Server ใน Python (SCP)

คล้ายบทก่อนหน้า: ใช้ scp command ผ่าน subprocess หรือ paramiko + scp module

วิธีที่ 1: subprocess + scp

import subprocess
import os

p = subprocess.Popen(["scp", "my_file.txt", "username@server:/path"])
sts = os.waitpid(p.pid, 0)  # รอ copy เสร็จ

# Python 3.5+ ใช้ run() สะดวกกว่า
subprocess.run(["scp", "my_file.txt", "username@server:/path"], check=True)

วิธีที่ 2: Paramiko + SCPClient (แนะนำสำหรับ Production)

from paramiko import SSHClient
from scp import SCPClient

ssh = SSHClient()
ssh.load_system_host_keys()
ssh.connect('user@server:path')

with SCPClient(ssh.get_transport()) as scp:
    scp.put('my_file.txt', 'my_file.txt')  # Upload
    # scp.get('remote.txt', 'local.txt')     # Download

ssh.close()

Copy หลายไฟล์/โฟลเดอร์

# SCPClient รองรับ recursive
with SCPClient(ssh.get_transport()) as scp:
    scp.put('local_folder', 'remote_folder', recursive=True)
    scp.get('remote_folder', 'local_folder', recursive=True)

# หรือใช้ wildcard กับ subprocess (ต้องการ shell=True)
subprocess.run("scp *.txt user@server:/path", shell=True, check=True)

Progress Callback (SCPClient เท่านั้น)

>> def progress(filename, size, sent):
...     print(f"{filename}: {sent}/{size} bytes ({sent/size*100:.1f}%)")
>>> 
>>> with SCPClient(ssh.get_transport(), progress=progress) as scp:
...     scp.put('large_file.iso', 'large_file.iso')