
私は最近サーバーリストへのユーザー名/パスワードアクセス権を取得しており、簡単にログインできるように、私のSSH公開鍵をこれらのサーバーに伝播したいと思います。
だから明らかです:
- リモートサーバーには、それを自動化するために利用できる既存の公開鍵はありません。
- このサーバーに初めてログインするので、サーバーにアクセスするために資格情報を入力する必要はありません。
ssh-copy-id
また、forループでパスワードを繰り返し入力したくありません。
答え1
パスワードを複数回入力する代わりに、スイッチを使用してパスワードをpssh
一度-A
入力してから、リスト内のすべてのサーバーにパスワードを提供できます。
メモ:ただし、この方法では許可されないため、ssh-copy-id
SSH公開鍵ファイルをリモートアカウントのファイルに追加する独自の方法を見つける必要があります~/.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ファイルのサーバーに同じユーザー名があるとします)。-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...)
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
上記のように使用したくない場合は、いくつかの他のオプションを使用できます。
答え2
代替用途xargs
とsshpass
:ssh-copy-id
生きていると仮定すると資格情報.txtフォーマット user:password@server
:
$ cat credentials.txt
root:[email protected]
foo:[email protected]
bar:[email protected]
次のことができます。
tr ':@' '\n' < credentials.txt \
| xargs -L3 sh -c 'sshpass -p $1 ssh-copy-id $0@$2'
注:削除することを忘れないでください。資格情報.txt使用後!
答え3
使用アンシプールとても簡単です。<USER>
実際のログイン名に変更してください。
$ cd /path/to/public/key
$ cat<<END > hosts
host1.example.com
10.10.10.10
END
$ ansible -i hosts all --ask-pass -u <USER> -m authorized_key \
-a "user=<USER> key='$(cat id_rsa.pub)'"
答え4
いくつかの点がその請求書に適している可能性があります。
- 機能的には、ServerFault は同じ質問を提出します。SSH - コピーIDの自動化。
- Perlモジュールがありますが、あまり維持されていないようです。https://github.com/Ruyk/pssh-copy-id。
他の答えで述べたように、sshpass
これはおそらく最も簡単な解決策です。