web-dev-qa-db-ja.com

ローカルディレクトリをリモートsshサーバーにマウントします

ローカルディレクトリをリモートのsshサーバーにマウントしたい。特に〜/ .gnupgディレクトリなので、リモートに保存しなくても、どこでもローカルキーリングを使用できます。

だから私はこの解決策だと思います:

  • ローカルのsshサーバーを開いたままにします(必要に応じてファイアウォールで保護します)
  • sshからリモート転送ローカル:22からリモート:10000
  • sshfsを起動してlocalhost:10000:.gnupgを〜/ .gnupgにマウントします

私はこれを私のssh/configに入れました:

Host remote
        HostName remotehost
        RemoteForward 10000 localhost:22
        User user
        PermitLocalCommand yes
        LocalCommand sshfs -p 10000 [email protected]:/Users/remoteuser/.gnupg .gnupg

sshを実行すると、次のようになります。

Fuse: bad mount point `.gnupg': No such file or directory

sshログイン後にsshfsを手動で実行した場合、すべてが正常に機能します。したがって、LocalCommandディレクティブはRemoteForwardの前に実行されると思います。
これを解決する方法は?

7
robert laing

問題:sshLocalCommandは、ローカル(クライアント)側で実行されますが、リモートではありません。 RemoteCommandオプションはありませんが、設定ファイルに機能をハックすることができます。これらはすべて、remotehost:.gnupgディレクトリが事前に存在することを前提としていることに注意してください。

オプション1:~/.ssh/configで2つの別々のホスト仕様を使用します:

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%n-mount -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg

Host remote-mount
    HostName remotehost
    ForwardAgent yes
    RemoteForward 10000 localhost:22

欠点:このマウントポイントが必要なeachホストの両方のエントリを終了する必要があります。

オプション2:sshオプションとポート転送をLocalCommandに結合します。

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg

2つのLocalCommand行の微妙な違いは、最初の例では%nを使用し、2番目の例では%hを使用していることに注意してください。これは機能しますが、1つの巨大な[〜#〜]仮定[〜#〜]があります:あなた[〜 #〜] never [〜#〜]sshは、実際の名前で、.ssh/configファイルに存在する「短い名前」を介してのみホストに送信されます。そうしないと、最終的には終了します。 sshを実行しようとするLocalCommand接続の無限ループで。

オプション3:SSH多重化を使用して、リモートへの接続を1つだけ設定します。

Host remote
    HostName remotehost
    PermitLocalCommand yes
    LocalCommand ssh -f %r@%h -o RemoteForward="10000 localhost:22" -o ForwardAgent=yes -p %p sshfs -p 10000 %u@localhost:%d/.gnupg .gnupg
    ControlMaster auto
    ControlPersist 30m
    ControlPath ~/.ssh/controlmasters/%r@%h:%p

これが唯一の勝利の解決策であり、Host *ルールでも機能し、マイナス面もありません。同じホストへの2番目のsshセッションがsshfsを介して同じディレクトリを再マウントしようとしないという問題も解決します。

警告:私が解決するのに苦労しなかった最後の問題:リモートホストからログアウトした後もリモートsshfsは長く続く。実際、ローカルホストがオフラインになるか、接続が切断されない限り、unmountになることはありません。

おそらく このようなアイデア を使用して、リモートホストからログアウトするときにumountマウントするsshfsの他のオプションを検討できます。または、LocalCommandを使用してゲームをプレイし、トリガーイベントが発生したことを確認した後、監視して自己マウントするものを実行することもできますが、せいぜい壊れやすいようです。

もう1つのオプションは、sshコマンドをシェルでラップするか、ProxyCommandを使用してトリッキーなことを行うことですが、これは読者の練習問題として残しておきます。

5
crimson-egret