Expect概述

Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)

Expect使用

Expect通过匹配关键字自动推送参数到脚本中,将人机交互操作转化为自动执行。

1.基本例子(设置文件权限)

#!/usr/bin/expect -f

set timeout 10

set dbf_dir [lindex $argv 0]

set passwd [lindex $argv 1]

spawn su - oracle

expect "*Password*"

send "$passwd\r"

expect ">"

send "chmod 750 $dbf_dir/tbs_test_*.dbf\r"

expect ">"

send "exit\r"

expect eof

2.明文密码处理(敏感参数通过流的方式传递到脚本中,ps -ef获取到的进程信息中便不会显示敏感信息)

expect脚本获取敏感参数

expect_user -re "(.*)\n"

set oracle_passwd $expect_out(1,string)

shell脚本获取敏感参数

INPUT_PWD=""

read -p "Enter Password :" INPUT_PWD

expect举例

#!/usr/bin/expect -f

set timeout 10

set ip_addr [lindex $argv 0]

spawn ssh oracle@$ip_addr

expect_user -re "(.*)\n"

set oracle_passwd $expect_out(1,string)

expect {

"Are you sure you want to continue connecting" {

send "yes\r"

expect "*Password*"

send "$oracle_passwd\r"

}

"*Password*" {

send "$oracle_passwd\r"

}

}

expect ">"

send "sqlplus / as sysdba\r"

expect ">"

send "purge dba_recyclebin;\r"

expect ">"

send "exit\r"

expect ">"

send "exit\r"

expect eof

//调用脚本,传入敏感参数的公共类

public static int executeCmd(String cmdType, String cmdFile, List normalParas, List pwdParas)

{

int result = 0;

try

{

ArrayList allParas = new ArrayList();

allParas.add(cmdType);

allParas.add(cmdFile);

allParas.addAll(normalParas);

ProcessBuilder builder = new ProcessBuilder();

builder.command(allParas);

Process process = builder.start();

OutputStream os = process.getOutputStream();

for (int i = 0; i < pwdParas.size(); i++)

{

os.write((pwdParas.get(i) + "\n").getBytes("UTF-8"));

}

os.flush();

StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");

errorGobbler.start();

StreamGobbler outGobbler = new StreamGobbler(process.getInputStream(), "STDOUT");

outGobbler.start();

result = process.waitFor();

}

catch (Exception e){...}

return result;

}

//调用方式

RuntimeUtil.executeCmd("expect", "脚本路径", normalParas, pwdParas);

//读取输出流的公共类

public class StreamGobbler extends Thread

{

private static final int MAX_BLOCK_SIZE = 8192;

private static final int INPUT_BUFFER_SIZE = 2048;

InputStream is;

String type;

public StreamGobbler(InputStream isPt, String typePt)

{

this.is = isPt;

this.type = typePt;

}

public void run()

{

BoundedInputStream bisPt = null;

BufferedReader brPt = null;

try

{

bisPt = new BoundedInputStream(is, StreamGobbler.MAX_BLOCK_SIZE);

brPt = new BufferedReader(new InputStreamReader(bisPt, "UTF-8"), StreamGobbler.INPUT_BUFFER_SIZE);

while ((brPt.readLine()) != null)

{//NOPMD

}//NOPMD

}

catch (IOException ioe){...}

finally

{

if (brPt != null)

{

try

{

brPt.close();

}

catch (IOException e){...}

}

if (bisPt != null)

{

try

{

bisPt.close();

}

catch (IOException e){...}

}

}

}

}

java expect_Java调用expect、shell脚本时,明文密码处理与Expect使用举例相关推荐

  1. linux js脚本无法响应,执行Linux shell脚本时出错

    我想执行一个shell脚本来在dhtmlx实时更新的框架中启动nodejs服务器.根据dhtmlx文档,nodejs服务器将被放入web根目录.我已经写了位于/ var/WWW(其中的NodeJS文件 ...

  2. Java程序定时执行shell脚本

    第一次写博客,写的不好还请见谅. 之前在Linux环境中想定期执行某个脚本,第一反应就是将这个task加入到crontab里(crontab的知识点这里就不具体介绍了),当然,这种做法一般情况下是可行 ...

  3. Shell中要如何调用别的shell脚本

    在Shell中要如何调用别的shell脚本,或别的脚本中的变量,函数呢? 方法一: . ./subscript.sh 方法二: source ./subscript.sh 转载于:https://bl ...

  4. java grabcut_求教,在用OpenCV java接口调用GrabCut图像分割函数时出现错误

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 求教,在用OpenCV java接口调用GrabCut图像分割函数时出现错误 代码为: import org.opencv.core.*; import ...

  5. python 调用shell 不阻塞_遇到问题---python调用shell脚本时subprocess.check_call不阻塞

    遇到的问题 使用命令 subprocess.check_call(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) ...

  6. java -jar 停止_推荐:Linux启动Java程序jar包Shell脚本

    每次启动Java程序jar包的时候,难道你还在手敲java -jar xxserver.jar--?边敲边想着都需要追加哪些参数? 今天就推荐给大家一个几乎通用的Shell脚本,它支持Java程序Ja ...

  7. linux启动java jar文件_推荐:Linux启动Java程序jar包Shell脚本

    #!/bin/sh# 该脚本为Linux下启动java程序的脚本## author: luandy# date: 2021/1/15## 特别注意:# 该脚本使用系统kill命令来强制终止指定的jav ...

  8. php调用shell脚本安全,从PHP调用的shell脚本问题

    TLDR; 我有一个shell脚本,从命令行运行时工作正常,但如果从PHP脚本中调用(通过Web访问)则不行. 在这两种情况下,主叫用户都是www-data. 线路失败是这样的: openssl ge ...

  9. Unity调用外部Shell脚本或exe

    有时候项目里需要执行一些shell脚本,来完成诸如文件移动,命令行打包,自己转换文件 格式什么的工作,省去一些手工劳动,然后这时候就需要用shell了. 网上也有一些关于调用方法的文章,这里就说一下我 ...

最新文章

  1. VS中的 MD/MT设置
  2. Java开发-Redis客户端Jedis
  3. 使用SAP Cloud Platform fullstack WebIDE创建SAP UI5应用并部署
  4. font face如何导入自定义字体
  5. Linux基础篇_01_计算机概论
  6. MySQL之练习题5
  7. 通俗易懂!视觉slam第五部分——slam数学表示二
  8. spring boot入门之——2.0新特性以及模块化构建
  9. 迷你linux主机,ECS推出两款迷你主机新品:支持Linux系统,可输出4K视频
  10. 点云入门笔记(一):点云数据及获取
  11. Ionic 安卓兼容性问题解决
  12. Unity获取摄像机的视口区域(透视相机模式)
  13. 【小程序】IDEA实现qq邮件的发送
  14. 《聪明人和傻子和奴才》鲁迅
  15. 移动应用中的AR开发,6款最受欢迎工具推荐
  16. 极速进阶,小i智慧学堂联合复旦大学教授推出人工智能冬令营
  17. 品Spring:详细解说bean后处理器
  18. codevs奇怪的梦境(拓扑排序)
  19. sota和fota区别_SOTA与FOTA的区别
  20. VB编写简易动态按钮控件

热门文章

  1. Python绘画五角星
  2. 创新型金融产品“续期宝”——互联网平台建设系列...
  3. JZOJ5937. 【NOIP2018模拟10.30】斩杀计划
  4. MyBatis框架的作用
  5. Html form表单小知识method action multiple selected checked type=password/text/submit/reget/radio/checkbox
  6. ffmpeg解码内存缓冲区
  7. python五子棋大作业报告_Python 大作业之五子棋游戏(附代码)
  8. 科沃斯扫地机器人风扇模块_科沃斯扫地机风扇不转不能关机等故障处理办法
  9. 大道至简,看数睿数据企业级无代码里的场景化智能
  10. JavaScript change 事件