Linux expect怎么使用
发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,今天小编给大家分享一下Linux expect怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
千家信息网最后更新 2025年11月07日Linux expect怎么使用
今天小编给大家分享一下Linux expect怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
expect参数
启用选项
-c:执行脚本前先执行的命令,可多次使用。-d:debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。-D:启用交换调式器,可设一整数参数。-f:从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。-i:交互式输入命令,使用"exit"或"EOF"退出输入状态。--:标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --。-v:显示expect版本信息。
expect的4个命令
Expect中最关键的四个命令是send,expect,spawn,interact。
| 命令 | 说明 |
|---|---|
| send | 用于向进程发送字符串 |
| expect | 从进程接收字符串 |
| spawn | 启动新的进程 |
| interact | 允许用户交互 |
常用命令
`# 命令行参数``# $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`
命令介绍
close:关闭当前进程的连接。
debug:控制调试器。
disconnect:断开进程连接(进程仍在后台运行)。
定时读取密码、执行priv_prog
`send_user` `"password?\ "` `expect_user -re` `"(.*)\n"` `for` `{} 1 {} {` `if` `{[fork]!=0} {``sleep` `3600;``continue``}` `disconnect` `spawn priv_prog` `expect Password:` `send` `"$expect_out(1,string)\r"` `. . .` `exit` `}`exit:退出expect。 exp_continue [-continue_timer]:继续执行下面的匹配。 exp_internal [-f file] value:
expect范例
1.远程登录并创建文件后退出
#!/usr/bin/expect ##注意路径,使用 [whereis expect] 查看set user "hadoop" ##设定参数,注意",'的区别set pwd "yangkun"set host "48.93.36.144"set timeout -1 ##;号可有可无spawn ssh -p 2020 $user@$hostexpect { ##expect后有空格 "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$pwd\r"}}expect "]*" ## 通配符,使用 ]* 有效, 使用 *# 无效send "touch /home/hadoop/aa.txt\r"expect "]*"send "echo hello world >> /home/hadoop/aa.txt\r"expect "]*"[interact] ##人为交互send "exit\r" ##退出2.配置免密登录并安装JDK
#!/bin/bash#!/usr/bin/expectSERVERS="114.114.114.114" ##数组以空格分隔,可以为目标ip 或者hostNamePASSWORD="yangkun"## 实现免密登录配置的函数auto_ssh_copy_id() { expect -c "set timeout -1; spawn ssh-copy-id \"-p 2020 $1\"; ## 这里要注意,使用'或\'不可行 expect { *(yes/no)* {send -- yes\r;exp_continue;} *password:* {send -- $2\r;exp_continue;} eof {exit 0;} }";}## 循环执行,配置主机到从节点所有免密ssh_copy_id_to_all() { for SERVER in $SERVERS ## 取值需要加$ do auto_ssh_copy_id $SERVER $PASSWORD done }## 调用循环配置函数ssh_copy_id_to_all## 批量部署for SERVER in $SERVERSdo scp install.sh root@$SERVER:/root ssh root@$SERVER /root/install.shdone读取文件中的host配置
让脚本自动读取slaves文件中的机器名来批量安装cat slaves | while read hostdoecho $hostexpect -c "set timeout -fspawn ssh-copy-id $host"done
3.批量配置JDK,install.sh
#!/bin/bashBASE_SERVER=masterBASE_PATH=/home/hadoop/softTARGET_PATH=/usr/localJAVA_PATH=$TARGET_PATH/java## 1.判断是否存在文件夹,不存在则创建soft文件夹#if [ ! -d "$BASE_PATH" ]; then# mkdir "$BASE_PATH"#fi## 2.从指定host拷贝jdk到目标机器上(已经拷贝文件夹)scp -r $BASE_SERVER:$BASE_PATH $BASE_PATH## 2.解压jdk到指定目录if [ ! -d "$JAVA_PATH" ]; then sudo -S mkdir -p "$JAVA_PATH"fi## 赋予权限sudo -S chmod -R hadoop:hadoop $JAVA_PATHtar -zxvf $BASE_PATH/jdk1.8.0_121.tar.gz -C $JAVA_PATH#### 3.配置环境变量sudo -S cat>>/etc/profileexport JAVA_HOME=$JAVA_PATH/jdk1.8.0_121export PATH=\$PATH:\$JAVA_HOME/binEOF
自动telnet会话
#!/usr/bin/expect -fset ip [lindex $argv 0 ] # 接收第1个参数,作为IPset userid [lindex $argv 1 ] # 接收第2个参数,作为useridset 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
4.自动建立FTP会话
#!/usr/bin/expect -fset ip [lindex $argv 0 ] # 接收第1个参数,作为IPset userid [lindex $argv 1 ] # 接收第2个参数,作为Useridset mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码set timeout 10 # 设置超时时间# 向远程服务器请求打开一个FTP会话,并等待服务器询问用户名spawn ftp $ip expect "username:" # 输入用户名,并等待服务器询问密码 send "$userid\r" expect "password:" # 输入密码,并等待FTP提示符的出现 send "$mypassword\r" expect "ftp>" # 切换到二进制模式,并等待FTP提示符的出现 send "bin\r" expect "ftp>" # 关闭ftp的提示符 send "prompt\r" expect "ftp>" # 下载所有文件 send "mget *\r" expect "ftp>" # 退出此次ftp会话,并等待服务器的退出提示EOF send "bye\r" expect eof
自动登录ssh执行命令
#!/usr/bin/expectset IP [lindex $argv 0]set USER [lindex $argv 1]set PASSWD [lindex $argv 2]set CMD [lindex $argv 3]spawn ssh $USER@$IP $CMDexpect { "(yes/no)?" { send "yes\r" expect "password:" send "$PASSWD\r" } "password:" {send "$PASSWD\r"} "* to host" {exit 1} }expect eof5.自动登录ssh
#!/usr/bin/expect -f set ip [lindex $argv 0 ] # 接收第1个参数,作为IPset username [lindex $argv 1 ] # 接收第2个参数,作为usernameset mypassword [lindex $argv 2 ] # 接收第3个参数,作为密码set timeout 10 # 设置超时时间spawn ssh $username@$ip # 发送ssh请求expect { # 返回信息匹配"*yes/no" { send "yes\r"; exp_continue} # 第一次ssh连接会提示yes/no,继续 "*password:" { send "$mypassword\r" } # 出现密码提示,发送密码 }interact # 交互模式,用户会停留在远程服务器上面6.批量登录ssh服务器执行操作范例,设定增量的for循环
#!/usr/bin/expectfor {set i 10} {$i set timeout 30 set ssh_user [lindex $argv 0] spawn ssh -i .ssh/$ssh_user abc$i.com expect_before "no)?" { send "yes\r" } sleep 1 expect "password*" send "hello\r" expect "*#" send "echo hello expect! > /tmp/expect.txt\r" expect "*#" send "echo\r"}exit7.批量登录ssh并执行命令,foreach语法
#!/usr/bin/expectif {$argc!=2} { send_user "usage: ./expect ssh_user password\n" exit}foreach i {11 12} { set timeout 30 set ssh_user [lindex $argv 0] set password [lindex $argv 1] spawn ssh -i .ssh/$ssh_user root@xxx.yy.com expect_before "no)?" { send "yes\r" } sleep 1 expect "Enter passphrase for key*" send "password\r" expect "*#" send "echo hello expect! > /tmp/expect.txt\r" expect "*#" send "echo\r"}exit8.另一自动ssh范例,从命令行获取服务器IP,foreach语法,expect嵌套
#!/usr/bin/expect# 使用方法: script_name ip1 ip2 ip3 ...set timeout 20if {$argc "Usage: script IPs" exit 1}# 替换你自己的用户名set user "username"#替换你自己的登录密码set password "yourpassword"foreach IP $argv {spawn ssh $user@$IPexpect \ "(yes/no)?" { send "yes\r" expect "password:?" { send "$password\r" } } "password:?" { send "$password\r"}expect "\$?"# 替换你要执行的命令send "last\r"expect "\$?"sleep 10send "exit\r"expect eof}9.批量ssh执行命令,用shell调用tclsh方式、多进程同时执行
* tclsh - Simple shell containing Tcl interpreter1#!/bin/sh# -*- tcl -*- \exec tclsh $0 "$@"package require Expectset username [lindex $argv 0]set password [lindex $argv 1]set argv [lrange $argv 2 end]set prompt "(%|#|\\$) $"foreach ip $argv { spawn ssh -t $username@$ip sh lappend ids $spawn_id}expect_before -i ids eof { set index [lsearch $ids $expect_out(spawn_id)] set ids [lreplace $ids $index $index] if [llength $ids] exp_continue}expect -i ids "(yes/no)\\?" { send -i $expect_out(spawn_id) yes\r exp_continue} -i ids "Enter passphrase for key" { send -i $expect_out(spawn_id) \r exp_continue} -i ids "assword:" { send -i $expect_out(spawn_id) $password\r exp_continue} -i ids -re $prompt { set spawn_id $expect_out(spawn_id) send "echo hello; exit\r" exp_continue} timeout { exit 1}10.ssh登录过程常规提示文字
The authenticity of host '192.168.17.35 (192.168.17.35)' can't be established.RSA key fingerprint is 25:e8:4c:89:a3:b2:06:ee:de:66:c7:7e:1b:fa:1c:c5.Are you sure you want to continue connecting (yes/no)?Warning: Permanently added '192.168.17.35' (RSA) to the list of known hosts.Enter passphrase for key '/data/key/my_dsa':Last login: Sun Jan 26 13:39:37 2014 from 192.168.11.143[root@master003 ~]#root@192.168.16.90's password:Last login: Thu Jan 23 17:50:43 2014 from 192.168.11.102[root@lvsmaster ~]#
11.ssh自动登录expect脚本:ssh.expect
#!/usr/bin/expect -f# Auther:YuanXing# Update:2014-02-08if {$argc "Usage:\n $argv0 IPaddr User Passwd Port Passphrase\n" puts stderr "argv error!\n" sleep 1 exit 1}set ip [lindex $argv 0 ]set user [lindex $argv 1 ]set passwd [lindex $argv 2 ]set port [lindex $argv 3 ]set passphrase [lindex $argv 4 ]set timeout 6if {$port == ""} { set port 22}#send_user "IP:$ip,User:$user,Passwd:$passwd,Port:$port,Passphrase:$passphrase"spawn ssh -p $port $user@$ipexpect_before "(yes/no)\\?" { send "yes\r"}expect \"Enter passphrase for key*" { send "$passphrase\r" exp_continue} " password:?" { send "$passwd\r" exp_continue} "*\[#\\\$]" { interact} "* to host" { send_user "Connect faild!" exit 2} timeout { send_user "Connect timeout!" exit 2} eof { send_user "Lost connect!" exit}12.Mikrotik backup script using ssh and expect
#!/bin/bash# TAG: mikrotik, ssh, expect, lftpBACKUP_DIR="/var/backups"HOSTNAME="192.168.88.1"PORT="22"USER="admin"PASS="123456"TMP=$(mktemp)TODAY=$(date +%F)FILENAME="$HOSTNAME-$TODAY"PATH="/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"# create expect scriptcat > $TMP #exp_internal 1 # Uncomment for debugset timeout -1spawn ssh -p$PORT $USER@$HOSTNAMEmatch_max 100000expect -exact "password:"send -- "$PASS\r"sleep 1expect " > "send -- "/export file=$FILENAME\r"expect " > "send -- "/system backup save name=$FILENAME\r"expect " > "send -- "quit\r"expect eofEOF# run expect script#cat $TMP # Uncomment for debugexpect -f $TMP# remove expect scriptrm $TMP# download and remove backup files# "xfer:clobber on" means overwrite existing filescd ${BACKUP_DIR}echo " set xfer:clobber on get ${FILENAME}.rsc rm ${FILENAME}.rsc get ${FILENAME}.backup rm ${FILENAME}.backup" |lftp -u $USER,$PASS $HOSTNAME以上就是"Linux expect怎么使用"这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注行业资讯频道。
参数
命令
密码
文件
服务器
服务
登录
用户
提示
进程
输入
配置
脚本
用户名
运行
内容
时间
知识
篇文章
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
实时及历史数据服务器
宣传网络安全知识 信息
开票系统更新数据库失败
oracle数据库 版本
银行网络安全整改计划
河南高云网络技术有限公司
广东全城优推互联网科技
app云数据库
存取实况数据库
服务器打开软件慢1秒
服务器链接速度
hp服务器配置管理账号密码
软件开发怎么说方便
泰州口碑好的网络技术哪家好
北京软件开发 外包公司
部署dns服务器
北京光蓝网络技术有限公司
深圳网络技术转移平台
数据库分页查询的参数
巅峰网络安全比赛
网络安全宣传长漫
linux时钟服务器
网吧代理服务器是主机吗
杭州废旧ktv服务器
上网行业管理服务器
计算机三级网络技术通关指南
软件开发平台是什么语言
湖南品质软件开发创意
校园网络服务器
谁制定网络安全