パスワードを複数回入力する代わりにpssh
、その-A
スイッチを使用してパスワードを1回要求し、リスト内のすべてのサーバーにパスワードを入力できます。
注:ssh-copy-id
ただし、この方法を使用してもを使用することはできないため、リモートアカウントの~/.ssh/authorized_keys
ファイルにSSH pubキーファイルを追加する独自の方法をロールする必要があります。
例
これが仕事をする例です:
$ 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ファイル内のサーバー間で同じユーザー名を持っていると想定しています)
-A
pssh
パスワードを要求し、接続するすべてのサーバーで再利用するように指示します
-i
pssh
出力をファイルに保存するのではなく、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...)
作成して動的コンテンツを提供する必要がなくなるか、別pssh
ののスイッチを使用してIPのリストを作成できます-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
上記のように使用したくない場合は、他のオプションも利用できます。