expect spawn、linux expect 用法

2023-05-16

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。
  脚本代码如下:
  ##############################################
  #!/usr/bin/expect
  set timeout 30
  spawn ssh -l username 192.168.1.1
  expect "password:"
  send "ispass\r"
  interact
  ##############################################
  1. [#!/usr/bin/expect]
  这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。
  注意:这一行需要在脚本的第一行。
  2. [set timeout 30]
  基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒
  3. [spawn ssh -l username 192.168.1.1]
  spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。
  它主要的功能是给ssh运行进程加个壳,用来传递交互指令。
  4. [expect "password:"]
  这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒
  5. [send "ispass\r"]
  这里就是执行交互动作,与手工输入密码的动作等效。
  温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。
  6. [interact]
  执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行
  #!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下
  # Change a login shell to bash
  set user [lindex $argv 0]
  spawn bash $user
  expect "]:"
  send "/bin/bash "
  expect eof
  exit


使用expect自动登录

一,什么是expect?
在做系统管理时,我们很多时候需要输入密码,例如:连接 ssh,连接ftp,
那么如何能做到不输入密码吗?
我们需要有一个工具,能代替我们实现与终端的交互,
那么,就是它:expect,管理员的最好的朋友之一
它能够代替我们实现与终端的交互,我们不必再守候在电脑旁边输入密码,
或是根据系统的输出再运行相应的命令,
这些都可以由expect代替我们来完成

说明:expect到底是什么?
expect是一种脚本语言,使用起来非常简单,我们看后面的例子即可以了解到了

三,安装expect

备注:因为expect是基于tcl的,所以需要你的系统中安装有tcl
如何检查?
[root@dev ~]# whereis tcl
tcl: /usr/lib/tcl8.4 /usr/share/tcl8.4
如果看不到结果,请先安装tcl
安装,
[root@dev ~]# yum install expect
也可以从http://rpm.pbone.net下载for相应发行版的rpm包

四,使用expect自动登录的例子
1,程序例子的内容 :
先做功能 上的说明
此程序ssh登录到作为参数传递过来的ip地址上
然后执行: df -h
free -m
uptime
来检查系统的情况


[root@dev ~]# cat monitor_auto
#!/usr/bin/expect -f

#-------------------------------------------------- about us
# product: monitorone
# Author: liuhongdi <hongdi.liu@chinafotopress.com>
# Last Modified: 2008-05-13
# version: 0.3.2
# user:this script will help you to monitor many linux(unix) machine
# license: this script is based GPL

#-------------------------------------------------- set the variable,you can modify the value

set loginuser "root"
set loginpass {passwordonthishost}

set ipaddr [lrange $argv 0 0]
set timeout 300
set cmd_prompt "]#|~]?"

#-------------------------------------------------- login by ssh
spawn ssh $loginuser@$ipaddr
set timeout 300
expect {
-re "Are you sure you want to continue connecting (yes/no)?" {
send "yes\r"
} -re "assword:" {
send "$loginpass\r"
} -re "Permission denied, please try again." {
exit
} -re "Connection refused" {
exit
} timeout {
exit
} eof {
exit
}
}

expect {
-re "assword:" {
send "$loginpass\r"
}
-re $cmd_prompt {
send "\r"
}
}

#---------------------------------------------------- now,we do some commands
exec sleep 1
expect {
-re $cmd_prompt {
send "df -h\r"
}
}

exec sleep 1
expect {
-re $cmd_prompt {
send "free -m\r"
}
}

exec sleep 1
expect {
-re $cmd_prompt {
send "uptime\r"
}
}
exec sleep 1


#--------------------------------------------------
expect {
-re $cmd_prompt {
send "exit\r"
}
}


exit
#interact

2,程序 运行的显示结果

[root@dev ~]# ./monitor_auto 209.209.94.107
spawn ssh root@209.209.94.107
root@209.209.94.107's password:
Last login: Sun Feb 15 01:42:39 2009 from 201.103.105.49

[root@ws ~]#
[root@ws ~]# df -h
Filesystem ÈÝ ÒÑÓÃ ¿ÉÓÃ ÒÑÓÃ% ¹ÒÔصã
/dev/mapper/VolGroup00-LogVol00
133G 72G 55G 57% /
/dev/sda1 99M 13M 82M 14% /boot
none 1014M 0 1014M 0% /dev/shm
209.209.94.109:/www/pics
5.9T 5.6T 138G 98% /bank/bank1
[root@ws ~]# free -m
total used free shared buffers cached
Mem: 2026 1955 71 0 72 1621
-/+ buffers/cache: 261 1764
Swap: 1983 68 1915
[root@ws ~]# uptime
01:48:00 up 561 days, 8:53, 2 users, load average: 0.13, 0.09, 0.07
[root@ws ~]# [root@dev ~]#


四,对此程序的详细说明:
1,set loginuser "root"
set用来定义变量,定义之后的代码中可以使用所定义的变量
使用时注意需添加$符号
使用时的例子: spawn ssh $loginuser@$ipaddr 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

expect spawn、linux expect 用法 的相关文章

  • 何时用引号将 shell 变量括起来?

    我应该或不应该在 shell 脚本中用引号括住变量吗 例如 下列说法正确的是 xdg open URL eq 2 or xdg open URL eq 2 如果是这样 为什么 一般规则 如果它可以为空或包含空格 或实际上任何空格 或特殊字符
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 使用 shell 脚本发送 HTML 邮件

    如何使用 shell 脚本发送 HTML 电子邮件 首先 您需要撰写消息 最低限度由这两个标头组成 MIME Version 1 0 Content Type text html 以及适当的消息正文 p Hello world p 获得后
  • Vagrant 遇到问题 - “404 - 未找到”

    我正在尝试使用 Vagrant 制作一个 LAMP 盒子 有人告诉我它使用起来非常简单 我对网络和虚拟机完全陌生 对 Linux Ubuntu 的经验也很少 我目前已尝试按照官方文档页面上的教程进行操作 http docs vagrantu
  • 如何从 Bash 命令行在后台 Vim 打开另一个文件?

    我正在从使用 Gvim 过渡到使用控制台 Vim 我在 Vim 中打开一个文件 然后暂停 Vim 在命令行上运行一些命令 然后想返回到 Vim Ctrl Z 在正常模式下 暂停 Vim 并返回到控制台 fg可用于将焦点返回到 Vim job
  • Docker忽略limits.conf(试图解决“打开文件太多”错误)

    我正在运行一个 Web 服务器 该服务器正在处理数千个并发 Web 套接字连接 为了实现这一点 在 Debian linux 我的基本镜像是 google debian wheezy 在 GCE 上运行 上 打开文件的默认数量设置为 100
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • “git add”返回“致命:外部存储库”错误

    我刚刚进入 git 的奇妙世界 我必须提交我对程序所做的一系列更改 位于名为的目录中 var www myapp 我创建了一个新目录 home mylogin gitclone 从这个目录中 我做了一个git clone针对公共回购 我能够
  • 使用 libusb 输出不正确

    我用libusb编写了一个程序 我怀疑输出是否正确 因为所有条目都显示相同的供应商和产品 ID 以下是代码 include
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 如何在 Linux 上通过 FTP 递归下载文件夹 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe

随机推荐

  • VNC连接Ubuntu 16.04桌面灰色的问题解决

    1 安装gnome apt get install no install recommends ubuntu desktop gnome panel gnome settings daemon metacity nautilus gnome
  • Linux用diff比较两个文件的差异

    功能 xff1a 比较两个文件的差异 xff0c 并把不同地方的信息显示出来 语法 xff1a diff options FILES FILES的格式 xff1a FILE1 FILE2 xff1a 源是一个文件 xff0c 目标也是文件
  • 基于Qt的GPS导航系统软件源代码

    博主按 xff1a 这是我当初为了学习C 43 43 而给自己定的一个项目 xff0c 基本上实现了 通过这个项目可以说基本上掌握了C 43 43 和Qt的编程 现在将源码贡献出来给初学Qt的同志一些参考 当然其中肯定有不少地方是有问题的
  • (二十)ATP应用测试平台——websocket实现微服务版在线客服聊天室实战案例

    前言 在前面的博客内容中我们介绍了如何使用websocket实现一个网页版的在线客服聊天室 xff0c 众所周知 xff0c 由于websocket是一个长连接 xff0c 要和服务端保持会话连接 xff0c 所以其本身并不适用于微服务环境
  • 启动vncserver服务,并设置开机自启

    systemctl start vncserver 64 1 service amp amp systemctl enable vncserver 64 1 service 无论你是做网站工作 xff0c 还是运行一个家庭远程服务器 xff
  • "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

    参考资料 xff1a https blog lmlphp com archives 437 PHP 7 3 classic error continue targeting switch 找到代码那一行 xff0c 修改 xff0c 保存即
  • SLAM学习笔记2:Kalman Filter(卡尔曼滤波) 与Least Square(最小二乘法) 的比较

    对于一个问题的解决 xff0c 最根本在于怎样对它进行数学建模 对SLAM问题的建模 xff0c 基本上是基于filter和graph两大类 xff0c 今天整理了一下 xff0c 对比两种模型的区别及共性 主要参考这篇讲解 xff1a h
  • RTC实时时钟特征与原理

    RTC定义 RTC是个独立的定时器 RTC模块拥有一个连续计数的计数器 xff0c 在相应的软件配置下 xff0c 可以提供时钟日历的功能 修改计数器的值可以重新设置当前时间和日期 RTC模块和时钟配置系统 RCC BDCR寄存器 是在后备
  • 树莓派配置,小白教程,无键盘显示屏鼠标

    树莓派配置 xff0c 小白教程 xff0c 无键盘显示屏鼠标 实验步骤 xff1a xff08 1 xff09 在树莓派官网下载树莓派的系统 树莓派官网下载地址 xff1a http www raspberrypi org downloa
  • CAN总线综述-转发一篇关于CAN总线的详细介绍文章

    CAN总线 一 原文出处 xff1a http www cnblogs com jacklu p 4729638 html 嵌入式的工程师一般都知道CAN总线广泛应用到汽车中 xff0c 其实船舰电子设备通信也广泛使用CAN xff0c 随
  • Python 安装 MaxMind GeoLite City

    1 先安装 geoip c library geoip c library gt 61 1 4 6 installed on your machine gt 61 1 4 6 installed on your machine wget h
  • 华为MA5626-8密码恢复

    设备型号 xff1a 华为MA5626 8 display version VERSION MA5626V800R308C00 PATCH SPC500 SPH505 HP5105 PRODUCT MA5626 准备工作 xff1a 超级终
  • SNMP 获取交换机端口相关信息

    我们想用snmpwalk查看网络设备的端口 xff0c MIB库中相关定义的信息如下 xff1a root 64 redcock lifeng snmpwalk v 2c c lifeng 192 168 100 100 注意后面的点 xf
  • phpMyAdmim和Yii 连接Mysql报错。

    故障 xff1a 之前phpMyAdmim和Yii连接Mysql都好着的 xff0c 某天 xff0c 同时出现如下报错 xff1a 1 linux下phpMyAdmin 出现 缺少 mysqli 扩展 xff0c 请检查 PHP 配置 2
  • linux shell 执行多个命令的方法

    xff08 1 xff09 在每个命令之间用 xff1b xff08 分号 xff09 隔开 xff08 2 xff09 在每个命令之间用 amp amp 隔开 amp amp 表示 xff1a 若前一个命令执行成功 xff0c 才会执行下
  • ARP 属于哪层协议

    教材上把ARP 协议划到网络层 xff0c 是因为 ARP 协议属于 TCP IP 协议簇 在TCP IP 模型中 xff0c 它所有定义的协议是在网际层上的 再看按照OSI 的标准 xff0c 数据在传递时每层会加上自己的信息 当网络层的
  • 什么叫一层交换机,二层交换机,三层交换机?

    转自 xff1a http blog csdn net happypolo article details 5934429 简单地说 xff1a 一层交换机 只支持物理层协议 电话程控交换机可以算一个 二层交换机 支持物理层和数据链路层协议
  • Linux Shell 脚本中字符串的连接方法

    Linux Shell 脚本中字符串的连接方法 如果想要在变量后面添加一个字符 xff0c 可以用一下方法 xff1a value1 61 home value2 61 value1 34 61 34 echo value2 把要添加的字符
  • linux 如何将路径加入环境变量

    PATH 61 PATH 后面加路径 PATH是环境变量 要大写那几个目录是你放置linux命令的目录 输入命令后系统会去PATH中寻找是否存在该命令 查看当前环境变量 echo PATH也可以用set命令看一下设置 export PATH
  • expect spawn、linux expect 用法

    使用expect实现自动登录的脚本 xff0c 网上有很多 xff0c 可是都没有一个明白的说明 xff0c 初学者一般都是照抄 收藏 可是为什么要这么写却不知其然 本文用一个最短的例子说明脚本的原理 脚本代码如下 xff1a usr bi