Java给子进程输入密码,从Java进程访问子进程控制终端

我有一个长期运行的

Java服务器应用程序,它启动一个子进程来执行特定任务(在这种情况下,使用7z命令行实用程序提取7zip文件的内容,但这个特定的细节在这里不应该相关).

>服务器应用程序在Ubuntu 14下使用Java 8运行.

>子流程正在通过Java ProcessBuilder API启动.

>子进程正在访问的文件可能受密码保护.

>如果文件受密码保护且没有提供密码作为命令行参数,则7z程序将尝试向终端显示提示输入密码的消息,然后从终端读取密码.

>此时,子流程挂起并且不会完成,除非我点击< Enter>在控制Java进程的终端中两次.

基本问题似乎是7z实用程序使用getpass系统调用来显示提示和读取用户输入.根据文件:

The getpass() function opens /dev/tty (the controlling terminal of the process), outputs the string prompt, turns off echoing, reads one line (the “password”), restores the terminal state and closes /dev/tty again.

由于这是一个服务器应用程序,因此让子进程块等待来自Java终端的输入是不可接受的.我想要的是以编程方式关闭子进程终端上的输入,以便getpass调用立即返回而没有输入,并且子进程以错误代码退出.不幸的是,我关闭输入到子进程终端的所有尝试都产生了与上面相同的行为:

>我尝试在启动子流程后立即手动关闭Process.getOutputStream()返回的流.

>我尝试使用ProcessBuilder.redirectInput将子进程输入重定向到从空文件和/ dev / null读取.

>为了更好的衡量,我甚至尝试将Redirect.INHERIT传递给ProcessBuilder,即使这看起来不像我想要的远程.

看起来这应该是可行的,因为我已经观察到7z启动时所需的行为与完全相同的命令行作为守护进程的socat进程的子进程,其中终端输入连接到/ dev / null,但是我无法使用我所掌握的工具在Java中实现这一目标.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值