shell-expect中回车及永不超时

本文介绍如何使用pktgen工具进行网络性能测试。通过shell脚本自动化执行pktgen,并设置参数如执行时间、流量类型等,实现对网络设备的性能评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#!/bin/bash
echo "Switch Directory : /home/pktgen-2.9.0"
dir="/home/pktgen-2.9.0"
cd $dir
/usr/bin/expect <<EOF   # Shell中通常将EOF与 << 结合使用,表示后续的输入作为子命令或子Shell的输入,直到遇到EOF为止,再返回到主调Shell。
  可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
set timeout -1   # 永不超时  set time  10  执行10秒
spawn ./pktgen_20180410 -c f -n 4 --proc-type auto --socket-mem 512  -b 01:00.1  --file-prefix pg1 -- -T -m 3.0 -s 0:voip-udp.pcap:2 -d 10000 --bps 1500
expect "Pktgen >"
send "start all\r"    # \r回车
expect off
<think>我们正在讨论Expect自动化脚本的使用方法。Expect是一个用于自动化交互式应用程序的工具,特别适用于需要输入密码或应答提示的场景。根据引用,我们可以总结Expect的基本使用流程和常用命令。 Expect脚本通常以#!/usr/bin/expect开头,然后使用spawn启动一个交互式进程,接着用expect来匹配进程的输出,根据匹配到的模式发送相应的响应(使用send命令)。最后用expect eof等待进程结束。 常用命令解释: - spawn: 启动一个新的交互式进程。 - expect: 等待进程的特定输出(可以匹配多个模式,并执行不同的响应)。 - send: 向进程发送字符串(包括回车\r)。 - set timeout: 设置等待超时时间(秒),-1表示永不超时- interact: 将控制权交给用户(有时在自动化结束后需要人工干预时使用)。 - expect eof: 等待进程结束。 下面我们通过一个示例脚本来具体说明。假设我们需要用ssh登录一台远程服务器,并自动输入密码。 ```expect #!/usr/bin/expect # 设置超时时间,单位秒 set timeout 30 # 启动ssh进程 spawn ssh username@hostname # 匹配可能的输出,并作出响应 expect { # 如果第一次连接,可能会询问是否保存指纹 "yes/no" { send "yes\r" exp_continue # 继续等待下一个模式 } # 提示输入密码 "password:" { send "your_password\r" } } # 等待命令执行结束(这里等待远程命令提示符,然后执行一个命令) expect "$ " # 假设远程提示符是'$ ' send "ls -l\r" # 等待上一条命令执行完成,再次出现提示符 expect "$ " send "exit\r" # 退出远程登录 # 等待spawn启动的进程结束 expect eof ``` 注意:在实际使用中,密码最好不要直接写在脚本里,可以通过参数传递或者从安全的地方获取。 另外,引用[4]中展示了一种在shell脚本中内嵌expect代码的方式,使用`expect -c "..."`。这种方式适合在shell脚本中嵌入简单的expect操作。 例如,在shell脚本中嵌入expect实现scp自动上传文件: ```sh #!/bin/sh for item in `cat filelist.txt | grep -v '#'`; do expect -c " set timeout 60 spawn scp $item user@remotehost:/path/ expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password:\" {send \"your_password\r\"} } expect eof " echo "$item uploaded." done ``` 在这个例子中,我们循环读取文件列表,对每个文件使用expect自动完成scp上传。注意,内嵌的expect脚本需要用双引号括起来,且内部的双引号需要转义。 §§相关问题§§ 1. Expect脚本中如何处理多个可能的提示? 2. 如何安全地在Expect脚本中处理密码? 3. Expect脚本中timeout超时后如何处理? 4. 如何在Shell脚本中嵌入Expect代码? 5. Expect的interact命令有什么作用?</think>### Shell Expect自动化脚本使用方法 Expect是一个用于自动化交互式命令行任务的工具,特别适合处理需要人工输入的密码、确认提示等场景。以下是详细使用方法: #### **1. 基本脚本结构** ```expect #!/usr/bin/expect # 设置超时时间(秒) set timeout 30 # 启动交互式进程 spawn ssh user@hostname # 匹配预期输出并响应 expect { "yes/no" { send "yes\r"; exp_continue } # 处理首次连接提示 "password:" { send "your_password\r" } # 输入密码 } # 等待命令结束 expect eof ``` #### **2. 核心命令详解** - **`spawn`**:启动需交互的进程(如`ssh`, `scp`, `ftp`) - **`expect`**:等待进程输出匹配指定模式 - **`send`**:向进程发送指令(`\r`表示回车- **`set timeout`**:设置等待响应时间(`-1`为无限等待) - **`exp_continue`**:继续匹配后续模式 - **`interact`**:交还控制权给用户[^2] #### **3. 实战示例** **场景1:自动SCP文件传输** ```expect #!/usr/bin/expect spawn scp file.txt user@remote:/path/ expect { "yes/no" { send "yes\r"; exp_continue } "password:" { send "P@ssw0rd!\r" } } expect eof puts "文件传输完成" ``` **场景2:多步交互(如数据库配置)** ```expect spawn mysql_secure_installation expect "Enter password for root:" { send "initial_pwd\r" } expect "New password:" { send "New_Str0ngPwd!\r" } expect "Re-enter new password:" { send "New_Str0ngPwd!\r" } expect "Remove anonymous users?" { send "y\r" } # ... 后续步骤 ``` #### **4. 高级技巧** - **参数化输入**:通过变量传递敏感信息 ```expect set username "admin" set passwd [exec get_password.sh] # 从外部获取密码 ``` - **错误处理**: ```expect expect { "success" { puts "操作成功" } timeout { puts "超时错误"; exit 1 } "denied" { puts "权限错误"; exit 2 } } ``` - **Shell集成**:在Bash中嵌入Expect ```bash #!/bin/bash for ip in $(cat servers.txt); do /usr/bin/expect <<EOF spawn ssh admin@$ip expect "Password:" { send "Admin123\r" } expect "#" { send "uptime\r" } ... EOF done ``` #### **5. 安全建议** 1. 避免在脚本中硬编码密码,使用环境变量或加密存储 2. 设置最小必要权限的账户执行脚本 3. 配合`ssh-key`实现免密登录更安全[^4] > 关键点:Expect的核心是**模式匹配-响应**机制,通过精准预测命令行输出实现自动化交互[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值