【问题标题】:Redirect input to a Java application inside a bash script将输入重定向到 bash 脚本中的 Java 应用程序
【发布时间】:2017-08-02 09:45:10
【问题描述】:

我正在使用 Oracle 的 ftm cli。当我运行命令时,它会通过说“输入密码”来询问密码。我正在编写一个使用此命令的脚本,因此我想以编程方式输入密码。 这是我尝试过的 -

echo "password" | java -jar ftmcli.jar list

但这不起作用。知道该怎么做才能让它发挥作用吗?

【问题讨论】:

  • 对 ftm cli 的调用在哪里?
  • 也许你需要使用expect替代
  • @MarkSetchell 我已经用 java 命令替换了对 ftm cli 的调用。实际调用看起来像java -jar ftmcli.jar list
  • 我认为你唯一的希望是@CWLiu 建议的expect - 看看这里的例子admin-magazine.com/Articles/Automating-with-Expect-Scripts
  • @MarkSetchell 期望对 java jar 命令有效吗?

标签: bash shell


【解决方案1】:

由于无法查看ftmcli 的源代码,我推测Oracle 正在使用java.io.Console 类中的Console.readPassword()。但是,此功能存在一个障碍:

公共最终类控制台

访问基于字符的控制台设备的方法,如果有的话, 与当前的 Java 虚拟机关联。

虚拟机是否有控制台取决于 底层平台以及虚拟化的方式 机器被调用。如果虚拟机是从 无需重定向标准输入的交互式命令行和 输出流然后它的控制台将存在并且通常是 连接到虚拟机所在的键盘和显示器 已启动,推出。如果虚拟机是自动启动的,对于 例如后台作业调度程序,那么它通常不会有 一个控制台。

如果此虚拟机有控制台,则它由 此类的唯一实例,可以通过调用 System.console() 方法。如果没有可用的控制台设备,则 调用该方法将返回 null。

通过将echostdout 管道/重定向到JVM,Java 方法System.console() 将返回null,因此不会从您的重定向中读取任何内容。

查看以下处理相同问题但在 Java 方面的问题:"How to handle java passwd reading when System.console() returns null?"How to pipe input to Java program with bash

在你这一边,你或多或少真的无能为力。只要Oracle不改变ftmclistdin读取密码的方式,执行echo $password | java -jar ftmcli.jar listjava -jar ftmcli.jar list <<< $password总是会失败。

【讨论】:

  • 您可以尝试的一件事是在您启动等待输入的ftmcli 之后将密码发送到/proc/$(pgrep -f '-jar ftmcli.jar list)/fd/0(特定进程的stdin)。但是,我没有尝试过,不能保证它会起作用。
  • 不错的答案。有时可以通过设置环境变量来传递密码(例如export FTM_PASSWORD=secret)。不知道这是否可能。
【解决方案2】:

如果您准备好设置一次性密码,请按照以下步骤操作。

  1. 运行 java -jar ftmcli.jar --save-auth-key

  2. 系统将提示您输入密码,一旦输入密码,文件将被上传并在 ftmcli 文件夹下创建一个 ftmclikeystore 文件。

  3. 现在只要不更改用户,ftmcli 就会从此文件中获取密码。

【讨论】:

    【解决方案3】:

    发现这个名为expect 的小而神奇的工具可以发挥作用:

    $ ./expect.script
    spawn java -cp /tmp/brm-test/oraclepki.jar:/tmp/brm-test/BRMActions.jar com.oracle.installer.brm.BRMInstallHelper 7 /tmp/brm-test/client upgC
    Enter Password for the wallet:
    $
    

    也许它在上面的 sn-p 中不是很明显,但它正在工作:

    $ cat /tmp/brm-test/client/.wp
    upgC=MyMag1cPa$$word#
    

    expect.script 中有什么内容?

    $ cat expect.script
    #!/usr/bin/expect
    
    stty -echo
    
    spawn java -cp /tmp/brm-test/oraclepki.jar:/tmp/brm-test/BRMActions.jar com.oracle.installer.brm.BRMInstallHelper 7 /tmp/brm-test/client upgC
    
    expect "Enter Password for the wallet:"
    send "MyMag1cPa$$word#\r"
    
    interact
    

    似乎这也可以在 Chef 中使用,see this cookbook

    希望对你有帮助 贾雷克

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多