<命令>expect脚本批量进行ssh-copy-id
目录:
环境介绍
其他三台需要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 [确定]