想搞一个使用ssh登录批量ip地址执行命令,自动输入密码的脚本,但是ssh不能使用标准输入来实现自动输入密码,于是了解到了expect这个可以交互的命令

  1. 是什么

    • 查看使用man查看expect,是这么说的,使用谷歌翻译一下

      1. Expect is a program that "talks" to other interactive programs according to a script. Following the script, Expect knows what can be expected from a program and what the correct response should be. An interpreted language provides branching and high-level control structures to direct the dialogue.
      2. In addition, the user can take control and interact directly when desired, afterward returning control to the script.
    • 我是这么理解的,expect是一个程序,更准确来讲是一个解释型语言,用来做交互的
  2. 命令
    • 常用命令

      1. spawn:开启一个进程,后面跟命令或者程序(需要做交互的,比如ssh
      2. expect:匹配进程中的字符串
      3. exp_continue:多次匹配时用到
      4. send:当匹配到字符串时发送指定的字符串信息
      5. set:定义变量
      6. puts:输出变量
      7. set timeout:设置超时时间
      8. interact:允许交互
      9. expect eof
  3. 简单用法
    • ssh登录ip,自动输入密码,vim ~/sshlogin

      1. #!/usr/bin/expect #使用expect解释器
      2.  
      3. spawn ssh root@192.168.56.101 #开启一个进程ssh
      4. expect {
      5. "yes/no" { send "yes\r"; exp_continue } #当匹配到"yes/no时,就是需要你输入yes or no时,发送yes字符串,\r带表回车;exp_continue继续匹配
      6. "password:" { send "sanshen6677\r" } #当匹配到password,就是该输入密码,发送密码,并\r回车。注意{之前要有空格。
      7. }
      8. interact #允许交互,这样你就会留在登录之后的窗口,进行操作,没有interact程序执行完成后就跳回当前用户ip。
    • 脚本使用方法
      1. chmod +x sshlogin #添加权限直接执行
      2. ./sshlogin
      3.  
      4. 或者
      5. expect sshlogin #使用expect解释器执行
    • 一般情况下用户名,ip,密码是需要作为参数传进去的,因为和bash不一样,所以使用$1接收是错误的。
      1. #!/usr/bin/expect
      2. set user [lindex $argv 0] #定义变量,接收从0开始,bash是从1开始
      3. set ip [lindex $argv 1]
      4. set password [lindex $argv 2]
      5. spawn ssh $user@$ip
      6. expect {
      7. "yes/no" {send "yes\r"; exp_continue}
      8. "password" {send "$password\r"}
      9. }
      10. interact
    • 执行一下
      1. ./sshlogin root 192.168.56.101 password123
    • ssh执行命令,需要在尾部加expect eof
      1. #!/usr/bin/expect
      2. set user [lindex $argv 0]
      3. set ip [lindex $argv 1]
      4. set password [lindex $argv 2]
      5. spawn ssh $user@$ip "df -Th" #执行一条命令
      6. expect {
      7. "yes/no" {send "yes\r"; exp_continue}
      8. "password" {send "$password\r"}
      9. }
      10. expect eof
    • 也可以使用bash,内部调用expect
      1. #!/usr/bin/bash 使用#bash解释器
      2. user=$1
      3. ip=$2
      4. password=$3
      5. expect << EOF
      6.  
      7. spawn ssh $user@$ip "df -Th"
      8. expect {
      9. "yes/no" {send "yes\r"; exp_continue}
      10. "password" {send "$password\r"}
      11. }
      12. expect eof
      13.  
      14. EOF
      1. bash sshlogin root 192.168.56.101 sanshen6677 #使用bash执行

linux ssh自动输入密码,expect使用的更多相关文章

  1. ssh自动输入密码脚本 切换目录脚本

    利用expect的,首先查看expect,命令:which expect #!/usr/bin/expect -f spawn ssh 用户名@ip地址 expect "assword:&q ...

  2. 用expect实现SCP/SSH自动输入密码登录

    在命令行ssh远程登录服务器和scp远程传输文件都需要交互式输入密码,无法像mysql登录数据库 mysql -uroot -p123456一样直接完成. 其实可以用脚本依赖expect来达到这一目的 ...

  3. Linux远程自动输入密码抓取远程资源

    #!/usr/bin/expect -fset timeout 3000set sys_date [lindex $argv 0] #要抓取的文件日期spawn scp /data3/xiaorui/ ...

  4. Shell脚本交互之:自动输入密码

    Shell脚本交互之:自动输入密码 2016年04月09日 19:41:26 zhangjikuan 阅读数:58208 标签: Shell交互自动输入密码expect重定向管道 更多 个人分类: A ...

  5. linux expect详解(ssh自动登录)

    shell脚本实现ssh自动登录远程服务器示例: #!/usr/bin/expect spawn ssh root@192.168.22.194 expect "*password:&quo ...

  6. ssh采用expect实现自动输入密码登录、拷贝

    1. 引言 最近做了一个项目,需要频繁与另一台主机进行文件的传输:中间想到了很多方式:FTP.samba.curl等,但是还是感觉scp最好用. SCP使用教程可参阅:http://www.jb51. ...

  7. linux 之 expect 交互操作(自动输入密码)

    场景 需要实现执行一个命令,并自动输入密码. 实现 通过expect命令实现 spawn               交互程序开始后面跟命令或者指定程序expect               获取匹 ...

  8. linux ssh 不用密码自动登录的几种方法

    1. 自动ssh/scp方法== A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux 在A上运 ...

  9. Linux远程ssh执行命令expect使用及几种方法

    expect命令实现脚本免交互 一.Linux下SSH无密码认证远程执行命令 在客户端使用ssh-keygen生成密钥对,然后把公钥复制到服务端(authorized_keys). 实现步骤: 1.客 ...

随机推荐

  1. 最全总结 | 聊聊 Python 数据处理全家桶(Mysql 篇)

    1. 前言 在爬虫.自动化.数据分析.软件测试.Web 等日常操作中,除 JSON.YAML.XML 外,还有一些数据经常会用到,比如:Mysql.Sqlite.Redis.MongoDB.Memch ...

  2. node.js conditionDebug VScode 配置

    launch.json { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.microsoft.com/f ...

  3. linux操作指南-01

    目录 1.1 MBR 1.2 装双系统的坑 1.3 主机硬盘的主要规划 前言:记录下最近在看的鸟哥Liunx私房菜,虽然不是第一次看了..想记录几章开发中用的比较多的部分大致是以下几个章节 第3章 主 ...

  4. dubbo学习(三)配置dubbo API方式配置

    provider(生产者) import com.alibaba.dubbo.config.ApplicationConfig; import com.alibaba.dubbo.config.Pro ...

  5. java并发编程--Synchronized的理解

    synchronized实现锁的基础:Java中每一个对象都可以作为锁,具体表现为3种形式. (1)普通同步方法,锁是当前实例对象 (2)静态同步方法,锁是当前类的Class对象 (3)同步方法块,锁 ...

  6. spring:bean的生命周期

    1.spring中bean的生命周期 (1)概念 在spring框架中,所有的bean对象都有生命周期,就是指bean的创建.初始化.服务.销毁的一个过程. (2)bean的生命周期 bean的定义 ...

  7. Django-发送注册、忘记密码邮件验证-send_mail

    用户邮箱注册.发送验证码流程图 那,如何解决? 1.  setting配置邮箱参数 # 邮箱设置,需要在邮箱中开启smtp服务 # 提供服务的主机域名 EMAIL_HOST = 'smtp.163.c ...

  8. spring-boot-route(一)Controller接收参数的几种方式

    Controller接收参数的常用方式总体可以分为三类.第一类是Get请求通过拼接url进行传递,第二类是Post请求通过请求体进行传递,第三类是通过请求头部进行参数传递. 1 @PathVariab ...

  9. MarkDown系列教程

    编辑了一个Markdown的系列教程,前一部分是摘编自 菜鸟教程 网站 目录 第一篇 Markdown 使用教程 入门

  10. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...