複数の「ssh」セッションが開始され、それぞれが異なるポートに転送されます。

複数の「ssh」セッションが開始され、それぞれが異なるポートに転送されます。

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

関連情報