คล้ายบทก่อนหน้า: ใช้ 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')