linux下expect命令实现批量ssh免密

有时候我们需要批量发送ssh命令给服务器,但是有可能有些服务器是新加入的,还没有配置ssh免密,这个时候就会提示我们输入yes/no 或者password等,expect脚本命令就是用于在提示这些的时候,自动为我们输入相应的文字

expect脚本

先看一段shell脚本,实现了ssh自动连接

#!/usr/bin/expect
spawn ssh  192.168.1.241
expect "password"
send "123456\r"
expect "]#" {send "ls -la\r"}
interact

  注意第一行使用的是#!/usr/bin/expect而不是普通的bash脚本那样

  • spawn就是用来启动新的进程
  • expect “password"  ,注意这个是expect脚本里面内部的命令,代表用来等待进程反馈,可以接受字符串和正则表达式,这段的意思就是将spawn启动的进程的输出当作expect命令的输入,如果包含password脚本,就会向着标准输出 输出123456\r

,注意\r代表换行,跟我们输入完一个命令换行是一个道理。

  • send:发送交互值,代替我们手动输入
  • 接着我们进入了241的服务器里面, 窗口会输出[[email protected] ~]#  ,跟我们的]# 匹配上了,于是向控制台输出 ls -la命令并且换行。这里我们的expect后面是带了大括号,跟上面的写在两行的效果一直。可以理解为另一种写法。
  • interact的作用很特殊,代表等待spawn命令结束,并且停留在241服务端进行继续交互,如果没有这个,那么有可能expect对应的刚匹配上还没执行send就已经结束了。对应的我们可以使用expect eof,替代interact代表等待spawn结束后退出(在spawn进程结束后会向expect发送eof)

多分支语法

上面的这种expect属于单一分支模式,代表就匹配这一种,如果匹配的不是,那么就要自己输入了,但是我们有可能在第一次有不同的提示,这个时候就需要使用多分支语法

expect 只要匹配到aaa 或者password其中的一种就会输出。

#!/usr/bin/expect
spawn ssh  192.168.1.241
expect {
 "aaa" {send "bbb\r"}
 "password" { send "nf123456\r"}
}
expect "]#" {send "ls -la\r"}
interact

expect命令行参数

上面的expect脚本功能可能都达到了,为了避免有很多expect脚本,我更推荐使用expect命令

 1 #!/bin/bash
 2
 3 SERVER="192.168.1.241"
 4 PASSWD=nf123456
 5
 6 expect -c "
 7         set timeout -1;
 8         spawn ssh $SERVER;
 9         expect {
10                 \"yes/no\" { send \"yes\r\" ;exp_contine; }
11                 \"password:\" { send \"$PASSWD\r\"; }
12         };
13
14         expect \"]#\" { send \"ls -la \r\" };
15         expect \"]#\" { send \"exit \r\" };
16         expect eof;
17         "

上面的shell功能和expect脚本实现的功能一致,都是通过ssh登录进去后输入,ls -la 命令

  • set timeout -1 设置超时时间
  • expect 后面需要加上-c
  • expect 命令用“双引号包围起来的,这点要注意
  • 里面如果有”需要用\"转义。
  • 第15行代表ls -la 命令结束后发送一个退出命令,一般需要加上,防止阻塞
  • expect eof 匹配spawn结束

ssh批量免密demo

#!/bin/bash
SERVERS="192.168.1.241 192.168.1.242"
PASSWD="123456"

function sshcopyid
{
        expect -c "
                set timeout -1;
                spawn ssh-copy-id $1;
                expect {
                        \"yes/no\" { send \"yes\r\" ;exp_contine; }
                        \"password:\" { send \"$PASSWD\r\";exp_continue; }
                };
                expect eof;
        "
}

for server in $SERVERS
do
        sshcopyid $server

done

shell基础知识传送门

时间: 2025-01-11 12:34:56

linux下expect命令实现批量ssh免密的相关文章

【Linux】ssh-copy-id三步实现ssh免密登陆

一.本地机器上使用ssh-keygen产生公钥私钥对 ssh-keygen -t rsa -C "[email protected]" --->执行完会在~/.ssh/下生成公钥私钥对 查看公钥私钥对: wucaiyundeMacBook-Pro:~ wucaiyun$ cd ~/.ssh/ wucaiyundeMacBook-Pro:.ssh wucaiyun$ ll total 24 899401 0 drwx------ 5 wucaiyun staff 160 12 18

SSH免密登录设置

分享/朱季谦 最近在搭建linux集群,做了SSH免密登录的设置,正好把过程记录一下: 一.用搭建好的两台虚拟机做演示,A机器:192.168.200.129,B机器:192.168.200.128 二.分别在两台机器上执行以下步骤: 1.使用root登录A服务器:su – root 2.在登录的A服务器上通过指定加密算法指令ssh-keygen -t rsa来生成秘钥,执行完该指令一直回车即可. 说明:(1)ssh-keygen –t rsa是指定加密的算法是rsa (2)(/root/.ss

Shell脚本实现SSH免密登录及批量配置管理

本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们通常还是工作在,几十台上百台服务器这样的环境,而使用ansible或者puppet这样的自动化运维工具则显得大材小用,并且最终的效果可能还不如几个小工具达到的效果好.像ssh免密登录在配合pssh这样的推送工具,在配合自动化配置脚本,可以说是即方便也使用.这一节将详细带大家以shell脚本的形式实现

批量实现ssh免密登录

本节索引 场景分析 ssh免密登录 pssh工具批量管理 SHELL自动化脚本 本篇总结 场景分析 作为一个运维工程师,不是每个人工作的环境都想阿里.腾讯那样,动不动就上亿的PV量,上万台服务器.我们通常还是工作在,几十台上百台服务器这样的环境,而使用ansible或者puppet这样的自动化运维工具则显得大材小用,并且最终的效果可能还不如几个小工具达到的效果好.像ssh免密登录在配合pssh这样的推送工具,在配合自动化配置脚本,可以说是即方便也使用.这一节将详细带大家以shell脚本的形式实现

linux(十)配置ssh免密登录实现

知道ssh的朋友应该知道它是用来干什么的,如果你不知道什么是ssh远程登录的话,可以去看一下我的上一篇博客,关于linux的网络基础的知识.备注:ssh是用于远端登入.执行ssh指令开启终端机阶段作业,并登入远端主机. 一.ssh远程登录 今天要和大家说的是,当我们一台客户机要远程登录到服务器的时候,输入密码才能登录成功. 过程流程图: 所以我们在想能不能我们不需要输入密码,直接使用ssh 用户名@服务器ip就可以登录呢? 二.ssh免密登录原理 看到这个图可能大家有一点蒙逼.我给大家解释一下.

Linux主机SSH免密设置解析

为了保证一台Linux主机的安全,所以我们每个主机登录的时候一般我们都设置账号密码登录.但是很多时候为了操作方便,我们都通过设置SSH免密码登录.那么该如何设置?是不是免密码登录就不安全了呢? 一.被访问主机的秘钥存储机制 在被SSH登录的主机中,其实都有一个存储来登录的主机的秘钥的文件,它的名字叫做authorized_keys,它的位置就在root/下面的隐藏目录.ssh中(注:如果这台主机没有被设置任何免秘钥登录,这个文件缺省是不存在的) 在authorized_keys文件中,存储着能够

ssh免密登录linux服务器

Ssh免密登录 sshd服务 sshd简介: SSH 密钥为登录 Linux 服务器提供了更好且安全的机制.运行 ssh-keygen 后,将会生成公私密钥对.你可以将公钥放置到任意服务器,从持有私钥的客户端连接到服务器的时,会用它来解锁.两者匹配时,系统无需密码就能解除锁定. 官方维护文档:https://www.ssh.com/ssh/ 参考文档:https://www.cnblogs.com/ioveNature/p/7919115.html https://www.cnblogs.com

linux上ssh免密登录原理及实现

因为我的服务器集群需要回收日志到中央进行统一处理,所以需要建立ssh互信关系实现免密登录.关于ssh的使用大家可能都很熟悉了,我们今天主要来讲下ssh连接和免密登录的原理. scp 传输文件 scp(secure copy)是linux系统下基于ssh登录进行安全的远程文件拷贝的命令. # 传递文件到远程 scp local_file remote_username@remote_ip:remote_file # 传递文件夹到远程 scp -r local_folder remote_usern

linux下常用命令备忘

转自:Linux 命令集锦 linux下查看监听端口对应的进程 # lsof -i:9000 # lsof -Pnl +M -i4 如果退格键变成了:"^h". 终端连接unix删除退格键,按住CTL键同时按delete Linux搜索 # find / -name "xxx.conf" 查看linux是32位还是64位的命令 #file /sbin/init #getconf LONG_BIT #getconf -a 在Linux和Windows下都可以用nslo