Files transferred over shell protocol

Files transferred over shell protocol（FISH）とは、SSHやRSHを使ってコンピュータ間でファイルを転送したり、遠隔のファイルを管理するための通信プロトコルである。

FISHの利点は、サーバ側で必要となるのがSSHまたはRSHと、シェルおよびUNIXの標準ユーティリティ（ls、cat、dd）だけという点である。オプションとして、FISHサーバ専用プログラム（start_fish_server）もあり、UNIXのシェルを使わずにFISHコマンドを実行するため、操作が高速化される。

このプロトコルは1998年、Pavel Machek が Midnight Commander 向けに設計したものである。

プロトコルのメッセージ 
クライアントは、以下のようなテキスト形式の要求を送る。

 #FISH_COMMAND 引数列...
 等価なシェルコマンド群
 複数行にまたがることもある

FISHコマンドには優先順位がある。サーバは理解できるFISHコマンドを実行する。理解できない場合は、等価なシェルコマンドを実行しようとする。専用サーバプログラムが動作していない場合、UNIXのシェルはFISHコマンドをコメント行として無視し、等価なシェルコマンドだけを実行する。

サーバの応答は複数行にまたがるが、常に以下の行が末尾に付く。

 ### xyz<オプションテキスト>

### はプレフィックス、xyz はリターンコードである。リターンコードはftpで使われているもののスーパーセットである。コード000と001は特殊で、その意味は最終行以前にサーバの出力があったかどうかで変わってくる。

セッション開始 
クライアントは echo FISH:;/bin/sh をリモートのマシンでコマンドとして実行することでSSHまたはRSHのコネクションを開始する。これにより、サーバ側で通常のRSHやSSHのコネクションとFISHのコネクションを区別することができる。

まず、サーバに対して FISH と VER という2つのコマンドを送る。

 #FISH
 echo; start_fish_server; echo '### 200'

 #VER 0.0.2 <feature1> <feature2> <...>
 echo '### 000'

サーバは VER コマンドに対して、次のような応答を返す。
 VER 0.0.0 <feature2> <...>
 ### 200
これは、サポートされているFISHプロトコルのバージョンと、サポートされている拡張機能を示している。

実装 
Midnight Commander
Lftp
fish:// KDE kioslave (with Konqueror)

外部リンク 
 README.fish from Midnight Commander
 kio_fish page
 KDE documentation
 Tutorial for the kioslave

通信プロトコル
ファイル転送プロトコル
長大な項目名