0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sftp-server と sshfs のプロセス間通信について

Posted at

概要

コンテナや仮想マシンとホストマシンの間で、ファイルシステムを共有するにはどうすればいいのかを知りたくて、いくつかのOSSのソースコードを読んでみた。

今回は sftp-serversshfs の組み合わせを題材に、その方法をまとめていく。
なお sshfs は現在積極的な開発が行われていないようなのでご注意。

結論

ローカルで sftp-server を立てて、リモートからの sshfs(ローカルからのsshコマンドとして実行)と接続できるようにする。

そのために両プロセスの入出力を相互に接続してプロセス間通信を行う。
sshfs の manページの表現を借りると、passive オプションにある communicate over stdin and stdout bypassing network というもの。

例えば Golang だとコマンドの入出力を宣言的に記述できるが、これをシェルで行う場合は名前付きパイプ(FIFO)を使って実現する。

fifo=/tmp/fifo-$$
mkfifo -m600 "$fifo"

これであたかも存在するファイルのようにパイプを扱うことができる。
この名前付きパイプへの write/read は他プロセスからの read/write があるまで、待機してくれるようなイメージ。

このパイプを使って、sftp-serversshfs の入出力を接続し、プロセス間通信を行うには、このように書く。

< "$fifo" /usr/libexec/sftp-server -e -d /path/to/dir | ssh -p <port> <host> -- sshfs ":/path/to/dir" "/path/to/mountpoint" -o slave -o allow_other > "$fifo"

これで、リモートとローカルのファイルシステムを同期できる。
ざっくり同期には1秒ほどかかり、同期されない場合はどちらかのディレクトリで ls などを叩くと反映される。

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?