shell脚本和expect脚本完成批量操作

下面是完成公钥分发的一个过程

第一个方法

[root@centos ~]# useradd test -u 9999 #增加名为test的用户,并且指定用户ID号为9999

[root@centos ~]# echo "test"|passwd --stdin test #设置用户test的密码为 test
Changing password for user test.
passwd: all authentication tokens updated successfully.
[root@centos ~]# /bin/cp /etc/sudoers /etc/sudoers.bak #备份sodoer文件
[root@centos ~]# echo "test ALL=(root) NOPASSWD:/usr/bin/rsync" >>/etc/sudoers #使普通用户可以具有超级用户权限而又不用输密码,当执行rsync命令时,请输入sudo rsync
[root@centos ~]# tail -1 /etc/sudoers #检查是否正确输入到sudoers文件中
test ALL=(root) NOPASSWD:/usr/bin/rsync
切换到test用户创建密钥


安装expect
[root@centos ~]# yum install expect* -y


编写脚本
[test@centos ~]$ vim test.exp
#!/usr/bin/expect
if {$argc != 2}  {
send_user "usage: expect xxxx.exp file host\n"
exit
}
#define var
set file [lindex $argv 0]
set host [lindex $argv 1]
set password "123456"
spawn ssh-copy-id -i $file  test@$host
expect {
        "yes/no"   {send "yes\r";exp_continue}
         "password" {send "$password\r"}
}
expect eof
[test@centos ~]$ vim test_key.sh
#!/bin/sh
. /etc/init.d/functions
for ip in `cat hostslist.txt`
do
    expect test.exp ~/.ssh/id_dsa.pub $ip >/dev/null 2>&1
    if [ $? -eq 0 ];then
       action "$ip" /bin/true
    else
       action "$ip" /bin/false
    fi
done
执行脚本结果如下


[test@centos ~]$ sh test_key.sh


[root@centos ~]# su - test
[test@centos ~]$ ll /home/test/.ssh/
total 4
-rw------- 1 test test 602 Sep 21 12:14 authorized_keys


脚本的作用是依据hostslist.txt文件中所列的主机地址(用换行标识),向每一台主机分发公钥。
中间加入下,这里解释下action 内置函数
action() {
local STRING rc
STRING=$1
echo -n "$STRING "
shift
"$@" && success $"$STRING" || failure $"$STRING"
rc=$?
echo
return $rc
}
$# 是传给脚本的参数个数 
$0 是脚本本身的名字 
$1 是传递给该shell脚本的第一个参数 
$2 是传递给该shell脚本的第二个参数 
$@ 是传给脚本的所有参数的列表 
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个 
$$ 是脚本运行的当前进程ID号 
\$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
测试代码
#!/bin/bash
. /etc/init.d/functions
action_test()
{
    rs=0
    [ $rs -eq 0  ] && action "action_test status" /bin/true
}
action_test


运行后

action_test status                                         [  OK  ]

写一段测试代码

该测试代码存为free_test.exp,加上执行权限,chmod +x free_test.exp

#!/usr/bin/expect
send_user $argc
if { $argc == 1 } { 
    puts "ok"
}
set host [lindex $argv 0]
spawn ssh 用户名@$主机名
expect {
    "$" {send "free -m\r"}
}

expect eof

运行 ./free_test.ext 主机名 ,应该可以顺利执行 free -m 命令

第二个方法 

需要在系统中安装sshpass,具体代码如下,

#!/bin/bash
for hostname in $(cat hostslist.txt)
    do 
        #sshpass -p "密码" ssh-copy-id -o StrictHostKeyChecking=no 用户名@${主机名}
        
        /usr/bin/sshpass -p "密码" /usr/bin/ssh-copy-id -i /home/用户名/.ssh/id_rsa.pub -o StrictHostKeyChecking=no 用户名@${主机名}
        echo "ssh-copy-id to $主机名"

    done

其中 hostslist.txt 格式为

1.1.1.1

2.2.2.2

3.3.3.3

你可能感兴趣的:(运维)