expect 编程语言
本身是一门编程语言,它有自己的语法可以独立编程语言,凡是非交互式的变成交互式的先想想如果没有就只有expect
让它永远没有yes/no,改客户端
#cat /a.sh 写在脚本,执行一下。
sed -i 's/# StrictHostKeyChecking ask/StrictHostKeyChecking no/' /etc/ssh/ssh_config
sed -i 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/' /etc/ssh/ssh_config
取消ssh客户端访问ssh服务器的时候让输入yes/no,直接输入密码:
/usr/bin/expect <<EOF (expect解释器)
set timeout 300 设置一个超时时间
spawn ssh-keygen 生成一条指令
expect "Enter file in which to save the key (/root/.ssh/id_rsa):" (这里的expect是捕获)
send "\n" 发送一个回车
expect "Enter passphrase (empty for no passphrase):" (再去捕获)
send "\n" 发送回车
expect "Enter same passphrase again:" 捕获
send "\n" 发送回车
expect是用来做捕获的,原来是捕获一句话,因为这句话是固定的,自己手动尝试的时候永远长这样,下面做的是捕获的字符串可能不存在,所以需要判断一下,能不能捕获到第一个关键字,捕获到怎么样,捕获不到怎么样,捕获不到就接着捕获下一个,下一个捕获到怎么样,这就是一个条件判断。我举的是ssh-copy ssh的时候也一样。
spawn ssh-copy-id 192.168.22.251 如果是批量换成变量
expect {
"yes/no" { send "yes\n"; exp_continue }
"[email protected]'s password:" { send "liuliu\n"}
}
expect eof
EOF
ssh-add
ssh 192.168.22.251
ssh的时候会有yes/no,第二次可能就没有了。在用expect处理这件事的时候得做一个判断,判断它捕获的是带yes/no的还是带密码的。完全可以把它取消掉。
捕获的时候判断它关键字里是不是带yes/no如果是就发送一个yes,继续发送一个exp_continue。
如果它没有捕获到yes/no,它就会尝试下面的关键字是不是捕获到了password,如果捕获到password就发生密码+回车。相当于多条件判断。
单个拷贝
send下面写密码,这就拷过去了,再拷一遍就报错了。
方式一: 如果拷贝过去了,代码会报错,解决不了就不解决了,因为已经拷完了。
方式二:去捕获一下关键字比如有没有warning,或者是关键字,如果捕获到就啥也不干了。
批量拷贝,
首先得有一个文件,hosts.txt要存放所有的ip地址。这几个ip我要读到它们,把它的内容读过来,交给一个变量,如何把它写到一个for循环里,变量里面是存放的是所有ip地址,用i去从里面一个一个执行取ip,取到一个执行。
执行脚本,
远程卸载软件:ssh 192.168.22.10 "yum erase lftp -y"
远程安装软件:ssh 192.168.22.10 "yum install lftp -y"