ssh
次のように、ポート転送を使用してカスタムコマンドを実行するエイリアスがあります。
ssh -Y -L 8888:localhost:8888 hostname
もちろん、これは同じホストに対して開始された最初のセッションでは正常に機能しますが、その後はポート8888がすでに使用中であるため、転送は失敗します。
私が望むのは、ssh
同じサーバーへの接続が開始されるたびにポートが自動的に調整され、それぞれの異なる接続が転送するssh
別々のポートを持つ方法を見つけることです。
たとえば、初めてコマンドを実行すると、次のようになります。
ssh -Y -L 8888:localhost:8888 hostname
2番目は次のとおりです。
ssh -Y -L 8889:localhost:8889 hostname
など。
私はPythonや他のものを使ってこれを行うことができることを知っていますが、私自身の(おそらく少し複雑な)スクリプトを書くよりも簡単な解決策があるかどうか疑問に思います。それは可能ですか?
PS:これは手動で簡単に実行できることを知っていますが、毎日これらの作業を数回開始するので、より多くの入力が必要になるだけでなく、すでに使用されているポートと未使用のポートを追跡する必要があります。
答え1
以下は、あなたが説明するタスクを実行する短いスクリプトです。ポート番号と呼ばれるファイルをロックするように機能し、失敗した場合はポート番号を増やして再試行します。
ポートロックファイルは$HOME/.ssh/ports
作成後にクリーンアップされませんが、ファイルロックを取得していることを確認しません。
スクリプトは、毎回同じサーバーに接続するのか、別のサーバーに接続するのかは関係ありません。
#!/bin/bash
PORTPATH="$HOME/.ssh/ports"
port=8888
while :; do
# We use the -E option to specify a custom exit code so that we can
# differentiate between "failed to lock file" and "ssh failed for some
# reason".
flock -n -E 121 "$PORTPATH/$port" \
ssh -Y -L "${port}:localhost:${port}" "$@" && break
exitcode=$?
if (( exitcode == 121 )); then
(( port++ ))
continue
fi
exit $exitcode
done
このスクリプトをというファイルに保存portfw.sh
し、次のように3回実行すると:
sh portfw.sh remote.example.com
出力に次のプロセスが表示されますps
。
flock -n -E 121 /home/lars/.ssh/ports/8888 ssh -Y -L 8888:localhost:8888 remote.example.com
flock -n -E 121 /home/lars/.ssh/ports/8889 ssh -Y -L 8889:localhost:8889 remote.example.com
flock -n -E 121 /home/lars/.ssh/ports/8890 ssh -Y -L 8890:localhost:8890 remote.example.com