expect结合shell批量免密配置脚本

1. 先在本机安装expect命令

 yum -y install expect

2. 在需要配置免密登录的主机上做ssh服务优化

在本实验中需要做免密登录的主机ip为:

192.168.153.136 
192.168.153.137

优化设置
链接>> https://blog.csdn.net/m0_46674735/article/details/112168847?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161036223716780258084964%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161036223716780258084964&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_v1~rank_blog_v1-11-112168847.pc_v1_rank_blog_v1&utm_term=ssh&spm=1018.2226.3001.4450

2. 编写脚本内容如下:

#!/bin/bash
#将要配置主机的ip定义为数组
IP=(192.168.153.136 192.168.153.137)
#判断本机的公钥是否生成
if [ ! -f /root/.ssh/id_rsa.pub ];then
expect << EOF
    spawn ssh-keygen
    expect "ssh/id_rsa):" {send "\r"}
    expect "passphrase):" {send "\r"}
    expect "again:" {send "\r"}
    expect eof
EOF
fi
#发送公钥到远程主机
for i in ${IP[*]}
do
expect << EOF
    spawn ssh-copy-id root@$i
    expect {
    "(yes/no)" {send "yes\r";exp_continue}
    "password:" {send "jundong\r"}
    }
    expect eof
EOF
done

3. 给脚本增加执行权限

chmod +x plssh.sh

4. 执行脚本

[root@host-135 ~]# sh plssh.sh 
spawn ssh-copy-id root@192.168.153.136
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.153.136's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.153.136'"
and check to make sure that only the key(s) you wanted were added.

spawn ssh-copy-id root@192.168.153.137
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.153.137's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'root@192.168.153.137'"
and check to make sure that only the key(s) you wanted were added.

5. 验证实验效果

[root@host-135 ~]# ssh root@192.168.153.136
Last login: Wed Jan  6 09:15:41 2021 from 192.168.153.1
[root@host-136 ~]# exit
logout
Connection to 192.168.153.136 closed.
[root@host-135 ~]# ssh root@192.168.153.137
Last login: Mon Jan 11 10:49:29 2021 from 192.168.153.1
[root@host-137 ~]# exit
logout
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在expect中执行shell脚本,可以使用spawn命令来启动一个新的shell进程,然后使用send命令向该进程发送需要执行的shell命令或脚本。例如: ``` #!/usr/bin/expect spawn sh /path/to/script.sh expect "Enter your name:" send "John\r" expect "Enter your age:" send "30\r" expect eof ``` 以上脚本会启动一个新的shell进程,并执行指定的脚本。然后,它会等待脚本输出"Enter your name:",然后向该进程发送"John\r",表示输入名字为John并回车。接着,它会等待脚本输出"Enter your age:",然后向该进程发送"30\r",表示输入年龄为30并回车。最后,它会等待该进程结束并退出。 ### 回答2: 在Python中,可以使用subprocess的Popen方法以及其他相关方法来执行shell脚本。而在expect中也可以使用spawn方法来执行相应的shell脚本。 在使用Python的subprocess方法时,需要指定shell=True的参数,否则执行的脚本将会被认为是一个外部命令。同时,需要指定执行脚本的路径、参数等相关信息,并设定stdin、stdout、stderr的对象,并使用communicate方法来启动和终止进程。 而在expect中,使用spawn方法可以指定要执行的脚本,同时可以设定相应的参数、环境变量等,还可以通过interact方法来与执行过程进行交互。可以通过设置timeout等参数来控制执行时间,并通过send方法来向执行的脚本发送指令。 需要注意的是,在执行shell脚本时,需要注意脚本本身的权限问题,同时也需要注意shell脚本中的命令是否存在依赖关系,以保证脚本的正确执行。 总的来说,在Python中执行shell脚本还是比较方便的,同时也可以通过使用expect来处理交互式的脚本执行过程。无论是使用哪种方法,都需要注意安全性和有效性,并进行充分的测试和验证。 ### 回答3: 在使用expect语言时,可以通过调用shell脚本实现比较复杂的操作或自动化流程。下面就对expect里执行shell脚本进行一些详细的阐述。 首先,使用expect调用shell脚本的方法很简单,只需要使用spawn命令来启动一个shell,然后使用send或者sendline来给shell传递命令,就可以实现执行shell脚本的功能。 其次,在使用expect执行shell脚本时,有一些需要注意的地方,如需要对执行结果进行判断处理、需要跟踪执行过程、需要输出日志等等。 在处理执行结果方面,expect提供了一些操作用来判断执行的结果,如expect语句中的"expect eof"和"expect timeout",这两条命令分别用于判断shell脚本执行完成和执行超时,而在执行结果中可能还需要对执行过程中的输出进行解析和判断,可以使用expect中的正则表达式来提取所需信息。 另外,在进行自动化操作时,需要对执行过程进行跟踪和监控,可以使用expect的log命令来实现。这个命令可以将执行过程中的输出写入指定文件中,用于后续的查看和分析。可通过命令“log_file filename”实现。 最后,总结一下,expect里执行shell脚本可以通过spawn命令启动一个shell,通过send和sendline命令来向shell中传递命令。执行结果可以通过expect语句中的"expect eof"和"expect timeout"命令判断,执行过程中的输出可以使用正则表达式提取信息,并使用log_file命令将输出记录到日志文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值