โปรโตคอล SFTP, SCP และ FISH ต่างกันอย่างไร


59

ฉันเคยคิดว่า SCP เป็นเครื่องมือในการคัดลอกไฟล์ผ่าน SSH และการคัดลอกไฟล์ผ่าน SSH นั้นเรียกว่า SFTP ซึ่งเป็นคำพ้องกับ FISH

แต่ตอนนี้เมื่อฉันกำลังมองหาปลั๊กอิน Total Commander ที่จะทำสิ่งนี้ใน Windows ฉันได้สังเกตเห็นว่าในหน้านั้นระบุว่า "อนุญาตให้เข้าถึงเซิร์ฟเวอร์ระยะไกลผ่านทาง FTP ที่ปลอดภัย (FTP ผ่าน SSH) ต้องการ SSH2 ไม่เหมือนกัน ในฐานะ SCP! "

หากไม่เหมือนกันฉันจะเข้าใจผิดอย่างไร


5
นี้เป็นส่วนขยายของคำถามก่อนหน้านี้ (@Ivan: จะเป็นประโยชน์เมื่อพูดถึงเรื่องนี้)
Gilles

ดูเพิ่มเติมsuperuser.com/q/134901/133844
Pere

คำตอบ:


57

SFTPไม่ใช่โปรโตคอล FTP บน ssh แต่เป็นส่วนขยายของโปรโตคอล SSH ที่รวมอยู่ใน SSH2 (และการใช้งาน SSH1 บางส่วน) SFTP เป็นโปรโตคอลการถ่ายโอนไฟล์ที่คล้ายกับ FTP แต่ใช้โปรโตคอล SSH เป็นโปรโตคอลเครือข่าย (และประโยชน์ที่ได้รับจากการออกจาก SSH เพื่อจัดการการตรวจสอบและการเข้ารหัส)

SCP นั้นใช้สำหรับการถ่ายโอนไฟล์เท่านั้นและไม่สามารถทำสิ่งอื่นเช่นรายการรีโมตไดเร็กทอรีหรือลบไฟล์ซึ่ง SFTP ทำ

FISH ดูเหมือนจะเป็นโปรโตคอลอื่นที่สามารถใช้ SSH หรือ RSH เพื่อถ่ายโอนไฟล์


11
มูลค่าเพิ่ม: นอกจากนี้ยังมี FTPS ซึ่งเป็น FTP ผ่าน TLS
mikemaccana

3
@mikemaccana จากนั้นคุณสามารถเพิ่มแม่มด FTPES เป็นไปได้ที่จะใช้ ftps อย่างชัดเจนผ่านการเชื่อมต่อ ftp ปกติ
Kiwy

26

โปรโตคอล SSH สร้างอุโมงค์ที่ปลอดภัยซึ่งคุณสามารถถ่ายโอนสตรีมแบบสองทิศทางและคุณสามารถใช้สตรีมนั้นเพื่อเชื่อมต่อสองกระบวนการที่คุณต้องการ

สองกระบวนการที่คุ้นเคยที่สุดคือเชลล์ (ที่เซิร์ฟเวอร์) และตัวจำลองเทอร์มินัลแบบโต้ตอบ (ที่ไคลเอ็นต์) นั่นคือสิ่งที่คุณกำลังใช้เมื่อคุณ ssh ไปยังเซิร์ฟเวอร์และพิมพ์คำสั่งที่พรอมต์ของเชลล์ระยะไกล

SCPเป็นการถ่ายโอนไฟล์ทำได้โดยใช้เชลล์และคำสั่งรีโมตเท่านั้น ใน SCP เมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์และการรับรองความถูกต้องและการอนุญาตเสร็จเรียบร้อยแล้วไคลเอ็นต์จะส่งคำสั่งเชลล์ระยะไกลเช่นscp -f myfile.txtซึ่งเพิ่งเขียนเนื้อหาของไฟล์ myfile.txt ไปยังสตรีม (สำหรับลูกค้า เพื่ออ่าน) หรือscp -t myfile.txtที่อ่านจากสตรีมและเขียนไปยัง myfile.txt

คุณจะสังเกตเห็นว่า -f และ -t (สำหรับ "จาก" และ "ถึง") ไม่ได้อยู่ใน managed ของ scp พวกเขาถือว่าเป็นภายใน มีรูปแบบการรับรู้ที่มีน้ำหนักเบาและรูปแบบสำหรับการถ่ายโอนไดเรกทอรีโดยการห่อเนื้อหาของไฟล์ในส่วนหัวที่เรียบง่าย แต่ส่วนใหญ่แล้ว SCP เป็นเรื่องพื้นฐานของการเขียนไบต์ของไฟล์ลงในอุโมงค์ SSH ทำให้ SSH จัดการกับสิ่งที่ซับซ้อนเช่นการบีบอัดและความสมบูรณ์

SFTPเป็นโปรโตคอลการถ่ายโอนไฟล์ที่มีความซับซ้อนมากขึ้นซึ่งจะถูกส่งผ่าน SSH อีกครั้ง

ใน SFTP ทั้งคำขอและการตอบกลับเป็นแพ็กเก็ตที่เข้ารหัสด้วยเลขฐานสองที่มีชื่อเช่น "SSH_FXP_OPEN", "SSH_FXP_STAT", "SSH_FXP_READ", "SSH_FXP_DATA", "SSH_FXP_CLOSE"

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

SFTP มีคำสั่งให้ทำหลายสิ่งที่ SCP ไม่ได้พูด เช่นลบเปลี่ยนชื่อตัดทอนย้าย ฯลฯ

รายละเอียดทั้งหมดที่มีอยู่ในร่าง IETF

เป็นที่น่าสังเกตว่าแพคเกจ SSH ที่ใหม่กว่าจะแทนที่scpไบนารีผู้ใช้ด้วย symlink เป็นไบนารี SFTP SFTP นี้มีรูปลักษณ์และความรู้สึกของ scp แต่ภายใต้ฝาครอบมันใช้โปรโตคอล SFTP

การอ้างอิง - O'Reilly SSH: The Secure Shell, The Definitive Guide , ส่วน 5.7 "ระบบย่อย":

คำเตือน: อย่าลบบรรทัดระบบย่อย -sftp ออกจาก sshd2_config: จำเป็นสำหรับ scp2 และ sftp เพื่อให้ทำงานได้ ภายในโปรแกรมทั้งสองเรียกใช้ ssh2 -s sftp เพื่อทำการถ่ายโอนไฟล์

ปลาเป็นประวัติศาสตร์ที่น่าสนใจ สมมติว่าคุณต้องการถ่ายโอนไฟล์ผ่าน SSH แต่ระบบระยะไกลของคุณไม่มี SCP หรือบางทีคุณอาจต้องการใช้ไฟล์ที่ซับซ้อนกว่า SCP แต่ระบบรีโมตของคุณไม่มี SFTP สถานการณ์เหล่านี้ไม่น่าจะเกิดขึ้นในปัจจุบัน แต่เมื่อปลาถูกประดิษฐ์ขึ้น

ดังนั้นผู้พัฒนาMidnight Commanderของลูกค้าจึงตั้งค่าเกี่ยวกับการสร้างโซลูชันของตนเอง มันคล้ายกับ scp ในหลักการ แต่มีคำสั่งมากกว่านี้ ไคลเอนต์ส่งคำสั่งที่มีลักษณะดังนี้:

 #RETR /some/name
 ls -l /some/name | ( read a b c d x e; echo $x ); echo '### 100'; cat /some/name; echo '### 200'

หากคุณกำลังพูดคุยกับเซิร์ฟเวอร์เซิร์ฟเวอร์มันจะตีความ#RETRคำสั่ง อย่างไรก็ตามหากเซิร์ฟเวอร์ระยะไกลไม่ได้ติดตั้งเซิร์ฟเวอร์ Fish คำสั่งจะถูกตีความโดยเชลล์ ความคิดเห็นแรกจากนั้นคำสั่งที่พิมพ์ข้อมูลเกี่ยวกับไฟล์ตามด้วยเนื้อหาไฟล์ที่ล้อมรอบในเครื่องหมายบางอย่าง

อย่างมีประสิทธิภาพในกรณีที่ไม่มี scp หรือปลาลูกค้ามี "scp เทียบเท่า" ของตัวเอง - แต่มันสามารถส่งคำสั่งเชลล์เพื่อเปลี่ยนชื่อย้ายตัดทอน ฯลฯ ได้อย่างเท่าเทียมกัน

รายละเอียดของปลาในแหล่งบัญชาการเที่ยงคืนที่นี่

ทั้งหมดนี้หมายความว่าอย่างไรจากมุมมองของผู้ใช้ปลายทาง

  • การใช้งานเซิร์ฟเวอร์ SSH รุ่นเก่ารองรับ scp แต่ไม่ใช่ SFTP คุณไม่สามารถใช้ไคลเอ็นต์ SFTP กับสิ่งเหล่านี้
  • ใช้ SFTP เพื่อประสิทธิภาพความน่าเชื่อถือและความยืดหยุ่น
  • ลูกค้า "scp" ของคุณอาจเป็นไคลเอนต์ SFTP ที่ปิดบัง ( จำเป็นต้องมีการอ้างอิง )
  • ปลาอาจมีประโยชน์ในสถานการณ์เฉพาะ แต่ใช้ SFTP มาตรฐานมากขึ้น

20

ทำให้มันง่าย:

SFTP = SSH + SFTP-server on server
SCP  = SSH + `scp` on server side
FISH = SSH + `dd` (and some other basic Unix utilities on the server side only) 

1
แต่sftpและscpต้องการโปรแกรมพิเศษทางฝั่งเซิร์ฟเวอร์ซึ่งแตกต่างจาก FISH ซึ่งใช้เฉพาะ Unix utuilities พื้นฐานใน remote shell
imz - Ivan Zakharyaschev

ตามคำอธิบายของ FISH คุณสมบัติที่โดดเด่นของ FISH คือมันไม่ต้องการอะไรเป็นพิเศษในฝั่งระยะไกล (ไม่มีโปรแกรมเซิร์ฟเวอร์เช่นscpscp หรือ sftp-server) และก็มีหลายกรณีเมื่อด้านระยะไกลเป็น Unix แบบ "จำกัด " ซึ่งคุณไม่สามารถติดตั้งสิ่งที่คุณต้องการ: สำหรับการถ่ายโอนไฟล์ไปยัง Android ผ่าน SSH (ผ่าน WiFi) ฉันได้เขียนชุดสคริปต์rpush-cat - บางทีลูกค้าของ FISH ก็ใช้งานได้ ( tramp-fish.elใน Emacs ก็ทำได้เช่นกัน: ลูกค้า TRAMP ปกติไม่ทำงานเพราะstatไม่มีใน Android)
imz - Ivan Zakharyaschev

2
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับscpความจำเป็นของฝั่งเซิร์ฟเวอร์ได้อย่างไรนอกเหนือจากฝั่งไคลเอ็นต์? ด้วยการค้นหา google อย่างรวดเร็วฉันไม่พบสิ่งใดที่ยืนยันว่าscpเป็นสิ่งจำเป็นสำหรับฝั่งเซิร์ฟเวอร์
Johannes Bittner

11

FISH และ SFTP มีความคล้ายคลึงกันและเมื่อสังเกตเห็นว่าทั้งสองทำงานผ่าน SSH, SFTP ต้องการการสนับสนุนและการกำหนดค่าเฉพาะในเซิร์ฟเวอร์ SSH เพื่ออำนวยความสะดวกในการถ่ายโอน แต่มันค่อนข้างปลอดภัยมากขึ้นและอนุญาตให้ SysAdmins อนุญาต SFTP เท่านั้น ไม่ทำงาน)

FISH ต้องการเปลือก (sh / rsh เป็นต้น) เพื่อคัดลอกและด้วยเหตุนี้จึงต้องใช้ SSH เต็มรูปแบบในการเข้าถึงเครื่องฉันคิดว่ามันจะปลอดภัยกว่า (ฉันไม่สามารถแสดงความคิดเห็นเชิงวัตถุเกี่ยวกับเรื่องนี้ได้ในขณะที่ฉันไม่เคยทำ)

หากเป็นไปได้ฉันขอแนะนำ SFTP, scp, FISH (ตามลำดับ)

บทความ Wikipedia FISH


ตามคำอธิบายที่เชื่อมโยงคุณลักษณะที่โดดเด่นของ FISH ก็คือมันไม่ต้องการอะไรเป็นพิเศษในด้านระยะไกล (ไม่มีโปรแกรมเซิร์ฟเวอร์เช่นscpสำหรับ scp หรือ sftp-server) และก็มีหลายกรณีเมื่อด้านระยะไกลเป็น Unix แบบ "จำกัด " ซึ่งคุณไม่สามารถติดตั้งสิ่งที่คุณต้องการ: สำหรับการถ่ายโอนไฟล์ไปยัง Android ผ่าน SSH (ผ่าน WiFi) ฉันได้เขียนชุดสคริปต์rpush-cat - บางทีลูกค้าของ FISH ก็ใช้งานได้ ( tramp-fish.elใน Emacs ก็ทำได้เช่นกัน: ลูกค้า TRAMP ปกติไม่ทำงานเพราะstatไม่มีใน Android)
imz - Ivan Zakharyaschev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.