公開鍵をlinuxサーバに一括アップロード
1611 ワード
従来、ssh-copy-idで公開鍵を手動でアップロードしており、何千台ものサーバが公開鍵をアップロードする必要があるなら、この方法でいいと考えています.次の公開鍵をサーバに一括アップロードして、本人が試した方法を紹介してみましょう.
1:pythonスクリプトでマシンを試します.pythonスクリプトは次のとおりです.
2:上のpythonはshellと組み合わせて一括アップロードを実現
サーバのipとパスワードをtxtファイルにリストします.たとえば(b.txt):
192.168.1.1 password1
192.168.1.2 password2
192.168.1.3 password3
一括アップロードを実現するshellプログラムは以下の通りです.
a.txtのフォーマットで、最初のパラメータはipで、2番目はパスワードです.中央はスペースで区切られており、一般的にこの公開鍵をサーバに一括アップロードするのは問題ありません.
公開鍵がデフォルトの位置にない場合、pythonスクリプトのこの文p=pexpect.spawn('ssh-copy-id%s'%ip)は、ssh-copy-idをssh-copy-id-i公開鍵位置に変更すればよい.
また、上記のプログラムは、実行前に公開鍵とパスワードssh-keygen-t rsaを生成します(2回返送すればいいです)
1:pythonスクリプトでマシンを試します.pythonスクリプトは次のとおりです.
#!/usr/bin/python
import sys
import pexpect
ip = sys.argv[1]
password = sys.argv[2]
expect_list = ['(yes/no)', 'password:']
p = pexpect.spawn('ssh-copy-id %s' % ip)
try:
while True:
idx = p.expect(expect_list)
print p.before + expect_list[idx],
if idx == 0:
print "yes"
p.sendline('yes')
elif idx == 1:
print password
p.sendline(password)
except pexpect.TIMEOUT:
print >>sys.stderr, 'timeout'
except pexpect.EOF:
print p.before
print >>sys.stderr, '<the end>'
使用方法:python sendpublic.py 192.168.2.10 password#ユーザー名とパスワードは間違いなく普通です.2:上のpythonはshellと組み合わせて一括アップロードを実現
サーバのipとパスワードをtxtファイルにリストします.たとえば(b.txt):
192.168.1.1 password1
192.168.1.2 password2
192.168.1.3 password3
一括アップロードを実現するshellプログラムは以下の通りです.
cat a.txt |while read line;do
ip=`echo $line | awk '{print $1}' # ip
password=`echo $line | awk '{print $2}'` # password
python sendpublic.py $ip $password
done
前述したように、次の点に注意してください.a.txtのフォーマットで、最初のパラメータはipで、2番目はパスワードです.中央はスペースで区切られており、一般的にこの公開鍵をサーバに一括アップロードするのは問題ありません.
公開鍵がデフォルトの位置にない場合、pythonスクリプトのこの文p=pexpect.spawn('ssh-copy-id%s'%ip)は、ssh-copy-idをssh-copy-id-i公開鍵位置に変更すればよい.
また、上記のプログラムは、実行前に公開鍵とパスワードssh-keygen-t rsaを生成します(2回返送すればいいです)