ControlMaster
のssh
機能により、複数のssh
-コマンドに同じチャネルを使用できます。 オープンなssh接続を維持し、シェルスクリプトから使用するにはどうすればよいですか?
ControlMaster
を使用するには、これらの行を~/.ssh/config
に追加しました。
Host example.com
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
ControlPersist 5m
ssh example.com
を実行すると、次のエラーが表示されます。
$ ssh example.com
bind: No such file or directory
unix_listener: cannot bind to path: /home/peter/.ssh/sockets/[email protected]
これを修正するには、mkdir ~/.ssh/sockets
を実行します:
$ mkdir ~/.ssh/sockets
$ ll ~/.ssh/sockets
total 8
drwxrwxr-x 2 peter peter 4096 Dec 28 17:51 ./
drwx------ 3 peter peter 4096 Dec 28 17:51 ../
ご覧のとおり、ディレクトリ~/.ssh/sockets
にはパーミッションrwxrwxr-w
があります。 ~/.ssh/sockets
のパーミッションは何ですか? sockets
は~/.ssh
にも含まれている必要がありますか?
sockets
ディレクトリは好きな場所に置くことができます(そこに書き込むための適切な権利がある限り)が、.ssh
の中に置くことは賢明なアイデアのようです(非常にまれな特定の場合を除く私がかつて持っていたようなケース:パス名が長すぎました)
.ssh
はすでにdrwx------
のようなものでなければならないので、.ssh/sockets
の権利は同じか、より寛大である可能性があり、これは影響を与えません。
しかし、これがあなたの問題だとは思いません。エラーメッセージが設定ファイルと一致していません。構成ファイルのControlPath
には@
があります(それでも構いません)が、エラーメッセージにはありません。
テスト時には、特定のホストに対して実行中のssh
インスタンスをすべて強制終了するようにしてください。一部は構成ごとに保持され、変更すると予期される動作が得られない場合があります。
PS:文書化のためにダミーのホスト名が必要な場合はexample.com
を使用してください