如何使用来自 Java 文本字段的用户输入运行 .sh 脚本?

Posted

技术标签:

【中文标题】如何使用来自 Java 文本字段的用户输入运行 .sh 脚本?【英文标题】:How run .sh script with user input from textfield in Java? 【发布时间】:2020-02-07 13:57:42 【问题描述】:

我尝试使用来自 txtfield 的用户输入来启动 .sh 脚本。 思路:用户在 txt 字段中写入参数。当按下按钮时,脚本以这个参数开始。

我的代码:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) 
                                         
String valueURL;
valueURL = URLtxt.getText().toString();              
ProcessBuilder processBuilder = new ProcessBuilder();
// -- Linux --
// Run a shell command
processBuilder.command("bash", "-c","nikto -h", valueURL,");     

try 

Process process = processBuilder.start();
StringBuilder output = new StringBuilder();
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) 
output.append(line + "\n");         

int exitVal = process.waitFor();
if (exitVal == 0)                                            
 
    this.hide();
    ScanWS sws = new ScanWS() ;
    sws.setVisible(true);

【问题讨论】:

你的代码的结果是什么? 引用显然是错误的。你可能想要processBuilder.command("bash", "-c","nikto -h \"$1\"", "", valueURL); 之类的东西——注意bash -c "script; more script" 之后的第一个参数是一个占位符(它用于填充$0)。 但是bash -c 在这里没有做任何有用的事情;可能简化为processBuilder.command("nikto", "-h", valueURL); 结果是带有参数 -h 和 web url 的命令“nikto”的开始。 如果我使用例如 processBuilder.command("bash", "-c","nikto -h google.com");它工作正常。但我不会将来自我的 GUI 的 jtextfield 中的字符串放在 google.com 的位置 【参考方案1】:

    在 UI 线程中触发了事件监听器,因此处理必须快速。你的监听器实现等待一个外部进程,它可以冻结你的用户界面。所有的进程触发和关心逻辑都必须在一个单独的线程中开始。

    流程是一个相当古老的结构,它存在输入/输出问题。进程在其工作期间将某些内容写入其输出流的缓冲区,当缓冲区全部填满时 - 进程挂起,等待输出流腾出一些空间。 因此,process.inputprocess.output 处理器也必须在单独的线程中工作。

【讨论】:

以上是关于如何使用来自 Java 文本字段的用户输入运行 .sh 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Auth 使用来自不同类的文本输入创建新用户

Java 文本字段输入问题

来自Objective c中数组项的自动完成文本字段

当用户输入通过来自另一个组件的道具的文本时,在反应 js 中不起作用

使用来自单独的表视图控制器的选定单元格填充文本字段

来自动态添加的文本字段的输入未通过 request()->validate() 数组