把yes/no取消掉

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"

猜你喜欢

转载自blog.csdn.net/weixin_53150440/article/details/127591997