โอนไฟล์ระหว่างเครื่องด้วย scp และ sftp

อัปโหลดและดาวน์โหลดไฟล์ระหว่างเครื่องของคุณกับเซิร์ฟเวอร์ Linux ผ่าน SSH ด้วย scp และ sftp บน Linux, macOS และ Windows รวมถึงกรณีใช้พอร์ต SSH อื่นและ SSH Key

โดย ทีมงาน THAI DATA CLOUD อัปเดต อ่าน 11 นาที เข้าชม 13 ครั้ง

แชร์FacebookXLINELinkedIn
โอนไฟล์ระหว่างเครื่องด้วย scp และ sftp
sftp — โอนไฟล์ระหว่างเครื่องด้วย scp และ sftp
โอนไฟล์ระหว่างเครื่องด้วย scp และ sftp

คำตอบสั้น ๆ: อัปโหลดและดาวน์โหลดไฟล์ระหว่างเครื่องของคุณกับเซิร์ฟเวอร์ Linux ผ่าน SSH ด้วย scp และ sftp บน Linux, macOS และ Windows รวมถึงกรณีใช้พอร์ต SSH อื่นและ SSH Key

คู่มือนี้อธิบาย sftp ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย

ถ้าเข้าเซิร์ฟเวอร์ผ่าน SSH ได้ คุณโอนไฟล์ผ่านช่องทางเดียวกันได้ทันทีโดยไม่ต้องเปิด FTP เพิ่ม เครื่องมือหลักมี 2 ตัว คือ scp สำหรับคัดลอกไฟล์ในคำสั่งเดียว เหมาะกับงานที่รู้แน่ชัดว่าจะส่งไฟล์อะไรไปไหน และ sftp ซึ่งเป็นโหมดโต้ตอบคล้าย FTP ใช้เดินดูโฟลเดอร์ก่อนแล้วค่อยเลือกไฟล์ ทั้งสองเข้ารหัสข้อมูลตลอดทางและใช้ผู้ใช้ รหัสผ่าน หรือ SSH Key ชุดเดียวกับ SSH

คำสั่งในบทความนี้ใช้ได้บน Linux, macOS และ Windows 10/11 ซึ่งมี OpenSSH Client ติดตั้งมาแล้ว (เปิดผ่าน PowerShell หรือ Command Prompt) ส่วนผู้ที่ถนัดโปรแกรมแบบกราฟิก สามารถใช้ WinSCP หรือ FileZilla ที่เชื่อมต่อแบบ SFTP ได้เช่นกัน

สิ่งที่ต้องเตรียม

ขั้นตอนที่ 1: อัปโหลดไฟล์ด้วย scp

รูปแบบคือ scp ต้นทาง ปลายทาง ฝั่งที่เป็นเซิร์ฟเวอร์เขียนเป็น ผู้ใช้@โฮสต์:Path

scp backup.sql [email protected]:/home/admin/

ผลที่คาดหวังคือแถบความคืบหน้า เช่น backup.sql 100% 245MB 11.2MB/s 00:21 ถ้าไม่ระบุ Path หลังเครื่องหมาย : ไฟล์จะไปอยู่ในโฮมของผู้ใช้

อัปโหลดทั้งโฟลเดอร์ให้ใส่ -r

scp -r ./website [email protected]:/var/www/example.com/

บน Windows PowerShell ใช้ Path แบบ Windows ได้ตามปกติ เช่น

scp C:\Users\somchai\Downloads\backup.sql [email protected]:/home/admin/

ขั้นตอนที่ 2: ดาวน์โหลดไฟล์จากเซิร์ฟเวอร์

สลับตำแหน่งต้นทางและปลายทาง จุด . หมายถึงโฟลเดอร์ปัจจุบันบนเครื่องของคุณ

scp [email protected]:/var/log/nginx/error.log .
scp -r [email protected]:/home/admin/backups ./server-backups

ถ้า Path มีช่องว่าง ให้ครอบทั้ง Path ฝั่งเซิร์ฟเวอร์ด้วยเครื่องหมายคำพูด เช่น "[email protected]:/home/admin/my files/report.pdf"

ขั้นตอนที่ 3: ระบุพอร์ตและ SSH Key

ถ้าเปลี่ยนพอร์ต SSH แล้ว (ดู วิธีเปลี่ยน SSH Port บน Linux Server) ต้องระบุพอร์ต ข้อที่คนสับสนบ่อยคือ scp ใช้ตัว -P ใหญ่ ส่วน ssh ใช้ -p เล็ก

scp -P 2222 -i ~/.ssh/id_ed25519 backup.sql [email protected]:/home/admin/
Option ของ scpความหมาย
-P 2222พอร์ต SSH ของเซิร์ฟเวอร์
-i ไฟล์Keyใช้ Private Key ที่ระบุ
-rคัดลอกทั้งโฟลเดอร์
-p (เล็ก)รักษาวันที่แก้ไขและสิทธิ์ของไฟล์
-Cบีบอัดระหว่างส่ง ช่วยได้กับไฟล์ข้อความ แต่ไม่ช่วยกับไฟล์ที่บีบอัดแล้ว
-l 8192จำกัดความเร็วเป็น Kbit/s (ตัวอย่างนี้ประมาณ 1 MB/s) เพื่อไม่ให้แย่ง Bandwidth ของเว็บ

ถ้าต้องพิมพ์พอร์ตและ Key ซ้ำบ่อย ให้บันทึกไว้ในไฟล์ ~/.ssh/config แล้วใช้ชื่อย่อแทน เช่น scp backup.sql web1: ดู ใช้ไฟล์ ~/.ssh/config ให้ SSH เข้าเซิร์ฟเวอร์ได้สะดวกขึ้น

ขั้นตอนที่ 4: ใช้ sftp แบบโต้ตอบ

sftp [email protected]
sftp -P 2222 [email protected]

เมื่อเชื่อมต่อสำเร็จจะเห็น Prompt sftp> คำสั่งที่ใช้บ่อยมีดังนี้ คำสั่งที่ขึ้นต้นด้วย l (local) ทำงานกับเครื่องของคุณ

คำสั่งผล
pwd / lpwdแสดงโฟลเดอร์ปัจจุบันบนเซิร์ฟเวอร์ / บนเครื่องของคุณ
ls / llsแสดงรายการไฟล์
cd / lcdเปลี่ยนโฟลเดอร์
put ไฟล์อัปโหลด
put -r โฟลเดอร์อัปโหลดทั้งโฟลเดอร์
get ไฟล์ / get -r โฟลเดอร์ดาวน์โหลด
reget / reputต่อการดาวน์โหลดหรืออัปโหลดที่ขาดไปกลางทาง
mkdir, rm, renameสร้างโฟลเดอร์ ลบไฟล์ เปลี่ยนชื่อบนเซิร์ฟเวอร์
byeออก

ตัวอย่างการทำงานจริง ดาวน์โหลดไฟล์ Backup ล่าสุดลงโฟลเดอร์ Downloads

sftp> cd /home/admin/backups
sftp> ls -l
sftp> lcd ~/Downloads
sftp> get db-2026-09-18.sql.gz
sftp> bye

ขั้นตอนที่ 5: คัดลอกระหว่างเซิร์ฟเวอร์สองเครื่อง

ถ้าเซิร์ฟเวอร์ต้นทางเข้าถึงปลายทางได้ ให้ SSH เข้าเครื่องต้นทางแล้วรัน scp ไปยังปลายทางโดยตรง วิธีนี้เร็วที่สุดเพราะข้อมูลไม่ต้องผ่านเครื่องของคุณ ถ้าเข้าได้เฉพาะจากเครื่องของคุณ ใช้ -3 ให้ข้อมูลส่งผ่านเครื่องของคุณแทน

scp -3 [email protected]:/home/admin/site.tar.gz [email protected]:/home/admin/

สำหรับโฟลเดอร์ใหญ่ที่ต้องซิงก์ซ้ำเป็นประจำ ใช้ rsync จะเหมาะกว่า เพราะส่งเฉพาะส่วนที่เปลี่ยน ดู สำรองข้อมูลไปยังเซิร์ฟเวอร์อื่นด้วย rsync และ Cronjob และถ้าไฟล์ใหญ่มากจนกลัว SSH หลุดระหว่างทาง ให้รันคำสั่งใน tmux

ตรวจสอบผลลัพธ์

เปรียบเทียบ Checksum ของไฟล์ทั้งสองฝั่งเพื่อยืนยันว่าไฟล์ครบและไม่เสียหาย

# บนเครื่อง Linux หรือเซิร์ฟเวอร์
sha256sum backup.sql
# บน macOS
shasum -a 256 backup.sql
# บน Windows PowerShell
Get-FileHash .\backup.sql -Algorithm SHA256

ค่าที่ได้จากทั้งสองฝั่งต้องตรงกันทุกตัวอักษร

ปัญหาที่พบบ่อย

Permission denied ขณะเขียนไฟล์

ผู้ใช้ที่ใช้เชื่อมต่อไม่มีสิทธิ์เขียนโฟลเดอร์ปลายทาง เช่น /var/www ที่เป็นของ root ทางที่ปลอดภัยคืออัปโหลดเข้าโฮมก่อน แล้ว SSH เข้าไปย้ายด้วย sudo mv และปรับเจ้าของไฟล์ให้ถูกต้อง scp และ sftp ใช้ sudo ไม่ได้

Connection refused หรือ Connection timed out

พอร์ตไม่ถูกต้องหรือถูก Firewall บล็อก ตรวจว่าใส่ -P ตรงกับพอร์ต SSH จริง และทดสอบด้วย ssh -p พอร์ต ผู้ใช้@โฮสต์ ก่อน หากเซิร์ฟเวอร์มี Security Group หรือ Firewall ภายนอกจากฝั่งผู้ให้บริการ ให้เปิดพอร์ตนั้นเพิ่มด้วย

scp ไม่ยอมใช้ Path ที่มี ~ หรือ Wildcard ฝั่งเซิร์ฟเวอร์

ตั้งแต่ OpenSSH 9.0 คำสั่ง scp ใช้โปรโตคอล SFTP เป็นค่าเริ่มต้น การตีความ Path บางแบบจึงต่างจากเดิมเล็กน้อย ส่วนใหญ่ยังใช้ได้ตามปกติ ถ้าเชื่อมต่อกับเซิร์ฟเวอร์รุ่นเก่ามากที่ไม่มี SFTP Subsystem ให้เพิ่ม -O เพื่อใช้โปรโตคอลแบบเดิม

Received message too long หรือเชื่อมต่อแล้วหลุดทันที

ไฟล์เริ่มต้นของ Shell บนเซิร์ฟเวอร์ (เช่น ~/.bashrc) พิมพ์ข้อความออกมาตอน Login ซึ่งรบกวนโปรโตคอล SFTP ให้ย้ายคำสั่ง echo หรือข้อความต้อนรับออก หรือครอบไว้ให้ทำงานเฉพาะ Shell แบบโต้ตอบ

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อเซิร์ฟเวอร์ ระบบปฏิบัติการ คำสั่งที่ใช้ และข้อความ Error ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

อ่านเพิ่มเติมเกี่ยวกับ sftp

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน