@mpontes '/ @ javierの答えの別の修正は、
ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
クリーナー
ssh user@remoteserver -L 9999:localhost:9999 '
socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
pid=$!
trap "kill $pid" 0
while echo -ne " \b"; do
sleep 5
done
'
長所
- 6.7より前のopensshで動作します(CentOS 7など)
- リモートサーバーに再sshする代わりに、ssh終了時にsocatを強制終了します。
- 非公開のsshログインを許可します(ijkソリューションとは異なります)
特徴
- この
-f
オプションは使用されないため、公開キーを使用してバックグラウンドで実行する&
か、対話的にログインしてCtrl + Zを使用し$!
てpidを保存することができます。
短所
-f
sshのpidを失うと、sshオプションを簡単に使用できません。このメソッドは、フォアグラウンドで実行し、Ctrl + Cで強制終了します。
- はるかに複雑
説明
socat ...&
-リモートサーバーでバックグラウンドでsocatを実行する
pid=$!
-PIDを保存する
trap kill\ $pid 0
kill $pid
-bash終了で実行
while :; sleep...
-無限ループに座る
echo -ne \ \b
-エコースペースとそれに続くバックスペース。これは、sshが切断されるとすぐに失敗します。でsleep 5
、これはsocat
sshの後に最大5秒実行できることを意味します
注:実際にドッキングウィンドウ、ポート使用してテスト2375
、/var/run/docker.sock
および環境変数をDOCKER_HOST='tcp://localhost:2375'
すべて同じが、MySQLのために働く必要があります
更新
使用するSSHコントロールを、あなたは使用することができる-f
だけで、次のフラグを追加し、私の方法を使用してフラグを
-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto
そして、あなたは得るでしょう
ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'
これで、次を使用してすべての制御セッションを終了できます。
ssh -o ControlPath=~/.ssh/%C -O exit remoteserver
-o
オプションは、あなたの中に保存することができ.ssh/config
、ファイル、またはあなたは-S代わりに使用することができます(しかし、あなたはまだ必要があります-o ControlMaster
)