パスワードを繰り返し入力せずにSSH公開鍵をサーバーリストに伝播するにはどうすればよいですか?

パスワードを繰り返し入力せずにSSH公開鍵をサーバーリストに伝播するにはどうすればよいですか?

私は最近サーバーリストへのユーザー名/パスワードアクセス権を取得しており、簡単にログインできるように、私のSSH公開鍵をこれらのサーバーに伝播したいと思います。

だから明らかです:

  • リモートサーバーには、それを自動化するために利用できる既存の公開鍵はありません。
  • このサーバーに初めてログインするので、サーバーにアクセスするために資格情報を入力する必要はありません。
  • ssh-copy-idまた、forループでパスワードを繰り返し入力したくありません。

ベストアンサー1

パスワードを複数回入力する代わりに、スイッチを使用してパスワードをpssh一度-A入力してから、リスト内のすべてのサーバーにパスワードを提供できます。

メモ:ただし、この方法では許可されないため、ssh-copy-idSSH公開鍵ファイルをリモートアカウントのファイルに追加する独自の方法を見つける必要があります~/.ssh/authorized_keys

はい

以下は、タスクを実行する例です。

$ cat ~/.ssh/my_id_rsa.pub                    \
    | pssh -h ips.txt -l remoteuser -A -I -i  \
    '                                         \
      umask 077;                              \
      mkdir -p ~/.ssh;                        \
      afile=~/.ssh/authorized_keys;           \
      cat - >> $afile;                        \
      sort -u $afile -o $afile                \
    '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

上記のスクリプトの一般的な構造は次のとおりです。

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

高レベルpsshの詳細

  • cat <pubkey>公開鍵ファイルを次にエクスポートします。pssh
  • pssh-Iスイッチを使用したSTDINによるデータ収集
  • -l <remote user>リモートサーバーのアカウントです(IPファイルのサーバーに同じユーザー名があるとします)。
  • -Apsshパスワードを要求してから、接続されているすべてのサーバーにパスワードを再利用するように指示します。
  • -ipssh出力をファイルに保存するのではなく、STDOUTに送信するように指示します(デフォルトの動作).
  • '...cmds to add pubkey...'- この部分が最もトリッキーな部分なので別途分析いたします。(下記参照)

リモートサーバーで実行するコマンド

pssh各サーバーで実行されるコマンドは次のとおりです。

'                                         \
  umask 077;                              \
  mkdir -p ~/.ssh;                        \
  afile=~/.ssh/authorized_keys;           \
  cat - >> $afile;                        \
  sort -u $afile -o $afile                \
'
のための:
  • リモートユーザーのumaskを077に設定して、作成したいすべてのディレクトリまたはファイルに次のように適切な権限を設定します。

    $ ls -ld ~/.ssh ~/.ssh/authorized_keys
    drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
    -rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
    
  • ディレクトリを作成~/.sshし、すでに存在する場合は警告を無視します。

  • $afileパスがAuthorized_keysファイルである変数を設定します。
  • cat - >> $afile- STDINから入力を受け取り、Authorized_keysファイルに追加
  • sort -u $afile -o $afile- Authorized_keys ファイルを一意にソートして保存します。

メモ:最後のポイントは、同じサーバーに対して上記のコマンドを複数回実行することを処理することです。これにより、公開鍵が複数回接続される状況が排除されます。

個々のダニに注意してください!

また、これらのすべてのコマンドが一重引用符に入れ子になっていることに特に注意してください。これは、$afileリモートサーバーで実行する前に評価したくないので重要です。

'               \
   ..cmds...    \
'

ここで読みやすくするために上記の内容を拡張しましたが、通常は次のように1行ですべて実行します。

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

ボーナス資料

を使用すると、psshファイルをビルドし、を使用して動的コンテンツを提供する必要はありません。あるいは、他のスイッチを使用して-h <(...some command...)IPリストを作成することもできます。pssh-H "ip1 ip2 ip3"

たとえば、

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

~/.ssh/config上記を使用して、自分のファイルからIPリストを抽出できます。もちろん、これを使用してprintf動的コンテンツを作成することもできます。

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

たとえば、

$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09

また、seqそれを使用してフォーマットされた数値シーケンスを生成することもできます。

参考資料と同様のツールpssh

pssh上記のように使用したくない場合は、いくつかの他のオプションを使用できます。

おすすめ記事