@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を保存することができます。
短所
-fsshのpidを失うと、sshオプションを簡単に使用できません。このメソッドは、フォアグラウンドで実行し、Ctrl + Cで強制終了します。
- はるかに複雑
説明
socat ...& -リモートサーバーでバックグラウンドでsocatを実行する
pid=$! -PIDを保存する
trap kill\ $pid 0kill $pid-bash終了で実行
while :; sleep... -無限ループに座る
echo -ne \ \b-エコースペースとそれに続くバックスペース。これは、sshが切断されるとすぐに失敗します。でsleep 5、これはsocatsshの後に最大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)