首页 > 其他分享 >expect实现交互式输入

expect实现交互式输入

时间:2023-06-18 23:35:04浏览次数:41  
标签:set lindex send 参数 argv 交互式 输入 expect

1.常用命令

选项:
-c:执行脚本前先执行的命令,可多次使用。
-d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
-D:启用交换调式器,可设一整数参数。
-f:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
-i:交互式输入命令,使用"exit"或"EOF"退出输入状态。
--:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。
-v:显示expect版本信息。

# 命令行参数 
# $argv,参数数组,使用[lindex $argv n]获取,$argv 0为脚本名字
# $argc,参数个数
set username [lindex $argv 1]  # 获取第1个参数
set passwd [lindex $argv 2]    # 获取第2个参数
 
set timeout 30 # 设置超时
 
# spawn是expect内部命令,开启ssh连接
spawn ssh -l username 192.168.1.1
 
# 判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间(timeout)后返回
expect "password:"
 
# 发送内容ispass(密码、命令等)
send "ispass\r"
 
# 发送内容给用户
send_user "$argv0 [lrange $argv 0 2]\n"
send_user "It's OK\r"
# 执行完成后保持交互状态,控制权交给控制台(手工操作)。否则会完成后会退出。
interact

2.例子

2.1自动telnet会话

#!/usr/bin/expect -f
set ip [lindex $argv 0 ]         # 接收第1个参数,作为IP
set userid [lindex $argv 1 ]     # 接收第2个参数,作为userid
set mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码
set mycommand [lindex $argv 3 ]  # 接收第4个参数,作为命令
set timeout 10                   # 设置超时时间
 
# 向远程服务器请求打开一个telnet会话,并等待服务器询问用户名
spawn telnet $ip
    expect "username:"
    # 输入用户名,并等待服务器询问密码
    send "$userid\r"
    expect "password:"
    # 输入密码,并等待键入需要运行的命令
    send "$mypassword\r"
    expect "%"
    # 输入预先定好的密码,等待运行结果
    send "$mycommand\r"
    expect "%"
    # 将运行结果存入到变量中,显示出来或者写到磁盘中
    set results $expect_out(buffer)
    # 退出telnet会话,等待服务器的退出提示EOF
    send "exit\r"
    expect eof

2.2其他

#!/usr/bin/expect

expect {
	"Are you sure you want to continue connecting (yes/no)?" {send "yes\r"; exp_continue}
  "Password" {send "${PWD}\r"}
}

expect "sftp>" {send "get /home/tools/123.zip\r"}
expect "sftp>" {send "quit\r"}

expect eof
EOF

参考文献

  1. expect - 自动交互脚本:https://xstarcd.github.io/wiki/shell/expect.html

标签:set,lindex,send,参数,argv,交互式,输入,expect
From: https://www.cnblogs.com/devin1024/p/17490013.html

相关文章

  • 跟据键盘输入控制输出
    importkeyboardimporttimewhileTrue:ifkeyboard.is_pressed('w'):print('Forward')elifkeyboard.is_pressed('s'):print('Backward')elifkeyboard.is_pressed('a'):pr......
  • Git:解决报错:fatal: The remote end hung up unexpectedly
    问题描述:Git在推送项目时报错:fatal:Theremoteendhungupunexpectedly。问题原因:推送的文件太大。解决方法:1.修改设置gitconfig文件的postBuffer的大小。(设置为500MB)$gitconfig--localhttp.postBuffer524288000注:--local选项指定这个设置只对当前仓库生效。......
  • 不想每次执行命令都输入sudo
    1.将用户加入sudo组sudousermod-a-Gsudo<username>注意需要注销重新登录skill-KILL-uusername2.修改sudoers(不是特别推荐)2.1打开sudovisudo该文件在/etc/sudoers,无需切换目录,直接输入上述快捷指令即可打开2.2更改#Userprivilegespecification我们可以在......
  • cmd输入任何npm命令空白无反应
    输入node命令没有问题,输入npm命令就空白原因:使用了其他命令(例如:npmconfigsetprefix)使npm的config乱掉了,删掉.npmrc文件就可以了这里要注意,不是nodejs安装目录npm模块下的那个npmrc文件而是在C:\Users\用户\下的.npmrc文件......
  • elementui 输入框 自定义图标
    <el-form-itemprop="visitorpath"><el-inputv-model="formData.visitorpath":placeholder="t('EnterName')"class="input-wit......
  • JavaScript中将字符串转换为数字的七种方法总结 乘以数字: str = '2344'; console.lo
    JavaScript中将字符串转换为数字的七种方法总结乘以数字:str='2344';console.log(str*1)//expectedresult:2344https://www.jb51.net/article/261613.htm+目录1.使用parseInt()2.使用Number()3.使用一元运算符(+)4.使用parseFloat()5.使用Math.floor()6.乘......
  • Qt编写精美输入法(历时十年迭代/可换肤/支持Qt4/5/6/win/linux/mac/嵌入式等)
    一、前言大概是从2012年就开始研究用Qt写输入法,因为项目需要,嵌入式板子上,没有对应的输入法,当初使用过很多NVR,里面也是鼠标按下弹出输入法面板进行输入,可以切换数字和字母及中文,于是借鉴着操作交互流程,用纯QWidget代码实现一个,当然最初的版本是非常简单和丑陋的,而且功能单一,能打字......
  • 【论文阅读】MONAI Label:人工智能辅助的 3D 医学图像交互式标注框架
    Abstract缺乏带注释的数据集是训练监督AI算法的主要挑战,因为手动注释既昂贵又耗时。为了解决这个问题,我们提出了MONAILabel,这是一个免费的开源平台,有助于开发基于AI的应用程序,旨在减少注释3D医学图像数据集所需的时间。通过MONAILabel,研究人员可以开发专注于其专业领域的......
  • 分散输入和集中输出------readv() 、 writev()
    参考:https://blog.csdn.net/zhizhengguan/article/details/117173049//功能:将数据从文件描述符读到分散的内存块中,即分散读。ssize_treadv(intfd,conststructiovec*iov,intiovcnt);//iovcnt代表选择iov中的几块内存,而不是选择第几块内存//功能:将多块分散的内存数......
  • 浏览器输入URL到网页完全呈现的过程
    前言临近计算机网络期末考试,最近在复习(预习),写一遍博客讲解加深印象.浏览器输入URL过程图浏览器输入URL过程:当用户在网页上输入网址URL后,浏览器会对网址进行DNS域名解析获得对应的ip地址.之后,浏览器客户端向服务器尝试建立连接,进行TCP三次握手.......