Linux expect怎么使用
发表于:2024-12-03 作者:千家信息网编辑
千家信息网最后更新 2024年12月03日,今天小编给大家分享一下Linux expect怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一
千家信息网最后更新 2024年12月03日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 eof
5.自动登录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"}exit
7.批量登录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"}exit
8.另一自动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安全错误
数据库的锁怎样保障安全
九一融互联网科技有限公司
网络安全讲话提纲
服务器内外线束种类
网络安全证书怎么让男生
专长软件开发
饥荒服务器收费事件
江门工控网络安全
苹果13服务器错误怎么解决
充电桩的网络安全
江西app软件开发流程
阿克苏im即时通讯软件开发
华为云数据库架构师
网络安全官兵
数据库志愿者管理系统实训报告
ec服务器申请管理员
2019软件开发工作好找吗
mycat异构数据库
粤教版 网络技术应用教案
ff14国服连接服务器失败
vb.net 数据库 类
厦门二手服务器回收多少钱
软件开发视频案例
同花顺选股服务器失败
十九大网络安全感悟
公安市一级数据库是什么意思
我国哪个节目讲到了网络安全
服务器硬件怎么看
网络安全小行家
比较常用数据库
网络技术基础是学什么的