Chinaunix

标题: 求一个脚本 [打印本页]

作者: tomer    时间: 2013-03-12 11:21
标题: 求一个脚本
本帖最后由 tomer 于 2013-03-29 15:45 编辑

   条件:有n台主机,这n台主机的IP,用户名/密码已知
   需一脚本,在这n台主机中的一台运行,运行后的结果是:这n台主机随便俩俩都互信,也就是说ssh登录不需要密码
   
   这位领导的脚本被证实是好用的,但需要略作一下修改,chmod 700 ~/.ssh;这样就完美了
作者: iamhere2007    时间: 2013-03-12 11:21
本帖最后由 iamhere2007 于 2013-03-21 07:03 编辑

在RHEL6.0上openssh实现,未考虑移植性.另外,欢迎大家提出问题与改进意见.
说明(1)思路很简单,就是共享公钥,语言用expect(2)selinux要关闭,原因待探讨(3)不能用于已经存有ssh认证的机器上,否则会覆盖原先的认证(4)此脚本不一定要在内部结点上运行,也可以在认证群组之外的主机上执行(5)认证没有passphrase

用法:sh scriptFile -f hostFile
其中hostFile格式为
IP1   user1   pass1   FQDN1
IP2   user2   pass2   FQDN2
.
.
.
  1. #!/bin/sh
  2. ####################################
  3. #OS:RHEL 6.0
  4. #Packages needed:expect;openssh,openssh-clients,openssh-server
  5. #Some warnings:
  6. #(1)rsa type is chosen,which,howerer,can be changed by modifying the script or by providing some available options in future improvements
  7. #(2)No ever .ssh direcotry should exist, or the previous key pairs will be destroyed
  8. #(3)selinux should be set permissively,and the reason still needs investigation
  9. #(4)The script doesn't have to be executed in one of the internal node, but also functions well in external host
  10. #####################################


  11. #arguments processing
  12. usage()
  13. {
  14.       cat<<EOF
  15.               Usage:  $0 -f hostListFile
  16.                       $0 -h
  17. EOF
  18.       exit 1
  19. }

  20. if [ $# -eq 0 ]
  21. then
  22.     usage
  23. fi
  24. while getopts :f:h option
  25. do
  26.      case "$option" in
  27.      h)
  28.         uage
  29.         ;;
  30.      f)
  31.         hostFile=$OPTARG;
  32.         ;;
  33.      *)
  34.         echo "invalid option"
  35.         usage
  36.         ;;
  37.      esac
  38. done

  39. if [ -z $hostFile ]
  40. then
  41.     usage
  42. fi



  43. echo "script starts to execute..."
  44. echo "gererating keys and some preparation..."
  45. mkdir keys
  46. while read IP user _ hostname
  47. do
  48.    ssh-keygen -t rsa -P "" -f keys/$IP
  49.    sed -i "s/ [^ ]\+$/ ${user}@$hostname/" keys/${IP}.pub
  50.    cat keys/${IP}.pub>>keys/commonKeys
  51.    
  52.    echo $IP>>IPs  #IPs is temporary file for storing IP lists to be used by
  53.                   #ssh-keyscan
  54. done< $hostFile >/dev/null 2>&1


  55. #using environment variables simply for feeding shell variable to expect
  56. export commonKeys=`cat keys/commonKeys`
  57. export knownHosts=`ssh-keyscan -t rsa -f IPs 2>/dev/null` #``only capture the stard output

  58. echo -e "gererating keys and all preparation completed successfully!\n"



  59. while read f1 f2 f3 _
  60. do
  61.    echo "authenticating for host $f1..."

  62.    export IP="$f1"
  63.    export user="$f2"
  64.    export pass="$f3"
  65.    export public=`cat keys/${IP}.pub`
  66.    export private=`cat keys/$IP`

  67.    expect -c '
  68.                    log_file expect.log
  69.                    log_user 0
  70.                   
  71.                    set prompt "(%|#|\\$) $"
  72.                    set IP $env(IP)
  73.                    set user $env(user)
  74.                    set pass $env(pass)
  75.                   
  76.                    spawn -noecho ssh $user@$IP
  77.                    expect {
  78.                              "(yes/no)\?" { send "yes\r";exp_continue;}
  79.                              "password:" {send "$pass\r"}
  80.                    }
  81.                   
  82.                    #manully build the ~/.ssh directory
  83.                    expect -re "$prompt" {
  84.                            send "if \[ ! -e ~/.ssh \];then mkdir ~/.ssh;fi;echo \"$env(public)\">~/.ssh/id_rsa.pub;echo \"$env(private)\">~/.ssh/id_rsa;echo \"$env(commonKeys)\">~/.ssh/authorized_keys\r"
  85.                    }
  86.                    expect -re "$prompt" {
  87.                            send "ssh-keyscan -t rsa localhost>~/.ssh/known_hosts;echo \"$env(knownHosts)\">>~/.ssh/known_hosts;chmod 600 ~/.ssh/*\r"
  88.                    }
  89.                    expect -re "$prompt" exit
  90.    '
  91.    echo "authentication for host $IP completed successfully!";
  92. done<$hostFile

  93. #trace cleaning
  94. rm -rf keys
  95. rm -f IPs
  96. unset IP
  97. unset user
  98. unset pass
  99. unset public
  100. unset private

  101. unset knownHosts
  102. unset commonKeys
复制代码

作者: seesea2517    时间: 2013-03-12 14:32
光是这功能说明就听起来很牛B啊!坐等高人接分。
作者: Shell_HAT    时间: 2013-03-12 17:00
本帖最后由 Shell_HAT 于 2013-03-12 17:01 编辑

expect + ssh 自动建立双机信任关系
http://blog.chinaunix.net/uid-10038128-id-2759648.html
http://bbs.chinaunix.net/thread-3625109-1-1.html
作者: zhaopingzi    时间: 2013-03-12 17:34
本帖最后由 zhaopingzi 于 2013-03-12 17:37 编辑

回复 3# Shell_HAT


楼主要求的是多机,GP有一个类似的功能,里面有一个gpssh-exkeys命令,很好用!!
作者: seesea2517    时间: 2013-03-12 17:57
回复 3# Shell_HAT


    其实你回过lz了,他不是也自己努力了一下,然后想想,还是直接“悬赏”比较厉害。
作者: reyleon    时间: 2013-03-12 19:28
配置ssh key,打开每台主机的代理转发功能可以么?
作者: tomer    时间: 2013-03-13 09:01
回复 6# reyleon


只要能实现,就行,最好简单一些;我原来的思路是把所有的机器的公钥都弄到一个文件authorized_keys里,然后把这个文件再弄到其他的机器里;
但是水平有些,代码写不出来。
   
作者: py超级菜鸟    时间: 2013-03-13 09:09
mark 学习
作者: FaintKnowledge    时间: 2013-03-13 12:58
本帖最后由 FaintKnowledge 于 2013-03-13 13:11 编辑

回复 1# tomer


pssh -h host_file "cmd"
pscp ......
作者: 关阴月飞    时间: 2013-03-13 14:36
回复 7# tomer


    话说,ssh key 都已经生成好了么?
作者: wild_li    时间: 2013-03-13 15:09
本帖最后由 wild_li 于 2013-03-13 15:24 编辑

看上面的两个帖子即可.
作者: statemood    时间: 2013-03-13 15:22
主机之间互相都能SSH将会有安全隐患:任一台失守则全部完蛋
作者: tony201288    时间: 2013-03-14 12:05
#coding:utf-8
import paramiko

CMD=("mkdir -p /root/.ssh/ ; echo 'your_key'> /root/.ssh/authorized_keys ;chmod 600 /root/.ssh/authorized_keys")

IPS=['1.1.1.1','2.2.2.2']

def Remote_control(IP):
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(IP, username='jesse', password='lol')
        ssh.exec_command("%s" %CMD)

for i in IPS:
   Remote_control(i)

作者: zhsh87    时间: 2013-03-15 14:00
同意12楼的观点,其实有一台可以登录其他服务器就可以了,没必要所有的机器都要互相走密钥吧
作者: tomer    时间: 2013-03-20 10:11
不互走也行,那1对N互信也行啊!!
作者: pitonas    时间: 2013-03-21 08:34
很牛B这功能
作者: tomer    时间: 2013-03-29 11:13
本帖最后由 tomer 于 2013-03-29 11:26 编辑

回复 16# iamhere2007


    脚本运行没有问题,
$ more hostFile
192.168.100.1 abc zcxc123 JQ1
192.168.100.2 abc zcxc123 JQ2
192.168.100.3 abc zcxc123 JQ3

# sh a -f hostFile
script starts to execute...
gererating keys and some preparation...
gererating keys and all preparation completed successfully!

authenticating for host 192.168.100.1...
authentication for host 192.168.100.1 completed successfully!
authenticating for host 192.168.100.2...
authentication for host 192.168.100.2 completed successfully!
authenticating for host 192.168.100.3...
authentication for host 192.168.100.3 completed successfully!

   我看用户的.ssh下也生成了 authorized_keys
   
   但是ssh登录,还要求输入密码

$ssh 192.168.100.3
abc@192.168.100.3's password:

作者: tomer    时间: 2013-03-29 11:35
回复 16# iamhere2007


    我刚才试了一下,root的可以
   普通用户不可以
作者: tomer    时间: 2013-03-29 13:55
找到原因了,需要做下权限设置
chmod 700 ~/.ssh
chmod 600 authorized_keys


作者: tomer    时间: 2014-02-10 15:35
回复 2# iamhere2007


    sed -i "s/ [^ ]\+$/ ${user}@$hostname/" keys/${IP}.pub
    这句是什么意思啊?我试了一下,执行这条语句貌似没有替换什么




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2