sshpassとssh -Jジャンプホスト

sshpassとssh -Jジャンプホスト

ジャンプホストを使用する複数のSSHコマンドを含むスクリプトがあります。毎回ジャンプとターゲットサーバーのパスワードを入力したいと思いますが、悲しいことにsshpass「ネスト」を試してみましたが、sshpass成功しなかったようです。

sshpass -p "JumpPass" sshpass -p "ServerPass" ssh -J user@jump admin@server

多くのパスワードを「入れ子にする」ことはできますかsshpass?それとも別のパスワードを提供する特定のオプションはありますか?

答え1

sshpassを使用して2つのパスワードを渡すことができます。 2つのsshpass呼び出しごとに2つの異なるパスワードソース(-eおよび)を使用する必要があります。-d

env SSHPASS="JUMP_PASSWORD" \
  sshpass -d 123 ssh \
  -o ProxyCommand="sshpass -e ssh -W %h:%p JUMP_USER@JUMP_HOST" \
  TARGET_USER@TARGET_HOST \
  123<<<TARGET_PASSWORD

上記のコード例では、ジャンプホストはsshpass()に提供されたJUMP_PASSWORDを使用し、ターゲット-eホストはsshpass()に提供されたTARGET_PASSWORDを使用します-d

sshpass()を使用してパスワードを提供することもできますが、-pパスワードはプロセスリスト(ps)に表示されるため安全ではありません。上記の例では、システムプロセスリストの出力にパスワードが表示されないようにsshpassを使用しています。

環境変数パスワードソース(sshpass -e)は、ジャンプホストのProxyCommandで使用する必要があります。環境変数は "-o ProxyCommand"呼び出しでsshpassに読み込まれますが、ファイル記述子ソース(sshpass -d)を使用している場合は、ProxyCommand参照値にパスワードを指定する必要があります。出力。 (例-o ProxyCommand="sshpass -d 124 ssh -W %h:%p JUMP_USER@JUMP_HOST 124<<<JUMP_PASSWORD":)<-だからこれは欠点です。

注:この方法では、sshpassJUMP_HOSTはイ​​ンストールされません。

修正する このソリューションはrsyncでも動作します。

env SSHPASS="JUMP_PASSWORD" \
rsync -v -a \
  -e "sshpass -d 123 ssh \
    -o ProxyCommand=\"sshpass -e ssh -W %h:%p USER@JUMP_HOST\" USER@TARGET_HOST" \
  :/remote/directory/  /local/directory/  \
123<<<TARGET_PASSWORD

スーパーユーザーに対する私の答えを参照してください。https://superuser.com/questions/1646074/why-rsync-with-jump-host-and-sshpass-not-working/1689136#1689136

答え2

私は通常muruが言及したProxyCommandを使用します。

また、認証にパスワードの代わりにキーを使用するのはどうですか? {Linux の使用を開始したときは常にパスワードを使用していましたが、一度キーを使用すると再び戻ることはできません。}

これを私のSSHプロファイルの下に置き、SSHを介してサーバーに直接接続できますssh server

Host server
    ControlMaster auto
    ProxyCommand ssh -W %h:%p -i your_key_for_Jump user@jump
    IdentityFile your_key_for_server_if_not_idrsa
    User ssh_user_for_server

関連情報