<命令>expect脚本批量进行ssh-copy-id

时间:Dec. 1, 2016 分类:

目录:

环境介绍

其他三台需要ssh-copy-id的机器禁止root的ssh连接,需要连接why用户,端口为54321

安装expect

[why@nfs ~]$ sudo yum install -y expect

expect脚本

expect脚本内容

[root@nfs ~]# vi fenfa.exp
#!/usr/bin/expect
if { $argc != 1 } {
  send_user "you needed post a arg"
  exit
}
set hostname [lindex $argv 0]
set password "why19940416"
spawn ssh-copy-id -i /home/why/.ssh/id_rsa.pub "-p 54321 why@$hostname"
expect {
        "yes/no"    {send "yes\r";exp_continue}
        "*password" {send "$password\r"}
}
expect eof

详解

  • #!/usr/bin/expect1 指定操作系统使用expect执行脚本
  • if判断是否为一个参数
  • spawn是exprct环境执行expect的内部命令
  • "yes/no" {send "yes\r";exp_continue} yes/no为判断条件,send "yes\r"为交互的输入,\r为异常状态的检查

参考博客 http://zyp88.blog.51cto.com/1481591/1615029

shell脚本批量执行

脚本内容

[root@nfs ~]# vi fenfa.sh 
#!/bin/sh
. /etc/init.d/functions
for ip in 192.168.0.181 192.168.0.182 192.168.0.184
do
  expect fenfa.exp $ip > /dev/null 2>&1
  if [ $? -eq 0 ];
  then
    action "$ip" /bin/true
  else
    action "$ip" /bin/false
  fi
done

详解

. /etc/init.d/functions是给/etc/init.d里的文件使用的,提供了一些基础功能

  • checkpid:检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录)
  • daemon:启动某个服务。/etc/init.d目录部分脚本的start使用到这个
  • killproc:杀死某个进程。/etc/init.d目录部分脚本的stop使用到这个
  • pidfileofproc:寻找某个进程的pid
  • pidofproc:类似上面的,只是还查找了pidof命令
  • status:返回一个服务的状态
  • echo_success,echo_failure,echo_passed,echo_warning分别输出各类信息
  • success,failure,passed,warning分别记录日志并调用相应的方法
  • action:打印某个信息并执行给定的命令,它会根据命令执行的结果来调用 success,failure方法
  • strstr:判断$1是否含有$2
  • confirm:显示 "Start service $1 (Y)es/(N)o/(C)ontinue? [Y]"的提示信息,并返回选择结果

详情可以参考http://www.cnblogs.com/sunfie/p/5149678.html

执行情况

[root@nfs ~]# sh fenfa.sh 
192.168.0.181                                              [确定]
192.168.0.182                                              [确定]
192.168.0.184                                              [确定]