ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

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

โอนไฟล์ระหว่างเครื่องด้วย scp และ 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 ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security