web-dev-qa-db-ja.com

SFTP、SCP、FISHプロトコルの違いは何ですか?

SCPはSSH経由でファイルをコピーするツールであり、SSH経由でファイルをコピーすることはSFTPと呼ばれ、それ自体がFISHの同義語でした。

しかし、Windowsでこれを行うためのTotal Commanderプラグインを探していたとき、そのページに「セキュアFTP(SSH経由のFTP)を介したリモートサーバーへのアクセスを許可します。SSH2が必要です。これは同じではありません。 SCPとして!」.

それが同じでない場合、私は何を誤解していますか?

67
Ivan

[〜#〜] sftp [〜#〜] はsshを介したFTPプロトコルではなく、SSH2(および一部のSSH1実装)に含まれるSSHプロトコルの拡張です。 SFTPはFTPに類似したファイル転送プロトコルですが、ネットワークプロトコルとしてSSHプロトコルを使用します(認証と暗号化を処理するためにSSHを離れることからの利点も)。

SCPはファイルの転送のみを目的としており、リモートディレクトリの一覧表示やファイルの削除など、SFTPが行うことはできません。

FISHは まだ別のプロトコル のようであり、SSHまたはRSHを使用してファイルを転送できます。

63
jsbillings

SSHプロトコルは、双方向ストリームを転送できる安全なトンネルを作成し、そのストリームを使用して、任意の2つのプロセスを接続できます。

最も一般的な2つのプロセスは、シェル(サーバー)と対話型ターミナルエミュレータ(クライアント)です。これは、サーバーにsshしてリモートシェルのプロンプトでコマンドを入力するときに使用します。

[〜#〜] scp [〜#〜]は、そのシェルとリモートコマンドのみを使用して実行されるファイル転送です。 SCPでは、クライアントがサーバーに接続され、すべての認証と承認が行われると、クライアントはリモートシェルにscp -f myfile.txtのようなコマンドを送信し、ファイルmyfile.txtの内容をストリーム(クライアントが読み取るため)またはscp -t myfile.txtはストリームから読み取り、myfile.txtに書き込みます。

-fと-t( "from"と "to"の)がscpマンページにないことに気づくでしょう。それらは内部と見なされます。軽量の確認応答スキームと、ファイルの内容を単純なヘッダーでラップすることによりディレクトリを転送するスキームがあります。しかし、ほとんどの場合、SCPはファイルのバイトをSSHトンネルに書き込むという基本的な問題であり、SSHが圧縮や整合性などの複雑なものを処理できるようにします。

[〜#〜] sftp [〜#〜]は、はるかに複雑なファイル転送プロトコルで、SSHを介してトンネルされます。

SFTPでは、要求と応答の両方が「SSH_FXP_OPEN」、「SSH_FXP_STAT」、「SSH_FXP_READ」、「SSH_FXP_DATA」、「SSH_FXP_CLOSE」のような名前のバイナリエンコードされたパケットです。

このプロトコルの興味深い特徴の1つは、コマンドをパイプライン化できることと、応答がどのような順序で届くかです。これは、セッションが応答の待機に費やす時間が短縮されることを意味し、さまざまな速度のデータソースを使用して1つのサーバーからの同時転送を最適化する機会があります-私はそれらの機会がどの程度取られたかはわかりませんが。

SFTPには、SCPが対応していない多くのことを実行するコマンドがあります。削除、名前変更、切り捨て、移動など。

すべての詳細は IETFドラフト で入手できます。

新しいSSHパッケージは、ユーザーscpバイナリをSFTPバイナリへのシンボリックリンクに置き換えることに注意してください。このSFTPはscpのルックアンドフィールを持っていますが、内部ではSFTPプロトコルを使用しています。

引用-O'ReillySSH:The Secure Shell、The Definitive Guide、section 5.7 "Subsystems:

警告:sshd2_configからsubsystem-sftp行を削除しないでください:scp2とsftpが機能するために必要です。内部的には、どちらのプログラムもssh2 -s sftpを実行してファイル転送を実行します。

Fishは興味深い歴史の一部です。 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'

Fishサーバーと通信している場合は、#RETRコマンドを解釈します。ただし、リモートサーバーにFishサーバーがインストールされていない場合、コマンドはシェルによって解釈されます。最初にコメント、次にファイルに関する情報を出力するコマンド、続いていくつかのマーカーで囲まれたファイルの内容。

事実上、scpまたはfishがない場合、クライアントは「独自の」scp相当をロールしましたが、名前の変更、移動、切り捨てなどのシェルコマンドを同様に送信できます。

魚の詳細は、Midnight Commanderのソース here にあります。

これはエンドユーザーの観点からどういう意味ですか?

  • 古いSSHサーバーの実装はscpをサポートしていますが、SFTPはサポートしていません。これらではSFTPクライアントを使用できません
  • パフォーマンス、信頼性、柔軟性のためにSFTPを使用する
  • あなたの "scp"クライアントは変装したSFTPクライアントかもしれません(引用が必要です
  • 魚はニッチな状況で役立つかもしれませんが、それ以外の場合はより標準的なSFTPを使用します。
34
slim

簡単に言えば:

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) 
21
c2h2

FISHとSFTPは似ており、どちらもSSHで動作するため、SFTPは転送を容易にするためにSSHサーバーでの特定のサポートと構成が必要ですが、少し安全で、SysAdminがSFTPのみを許可できるようにします(このような状況ではFISHが勝ちます動作しません)。

FISHはシェル(たとえば、sh/rsh)をコピーする必要があるため、マシンへの完全なSSHアクセスを必要とするので、セキュリティを確保するのは難しいと思います(これまで客観的にコメントすることはできなかったので、これについてはコメントできません)。

可能であれば、SFTP、scp、FISHをこの順序でお勧めします。

ウィキペディアFISH記事

11
N J