当前位置: 首页 > 面试题库 >

使用Linux Terminal运行命令的Java程序

曹骞仕
2023-03-14
问题内容

我的问题是,我正在通过终端运行一些adb命令。我写了一个工具;这将使事情变得容易。回到问题所在,为了使命令运行,我必须在终端上输入“密码”。那么,我该如何做才能使“密码”部分出现在JOptionPane.showInputDialog框上?

这是我到目前为止的内容:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;


public class flash implements ActionListener {
    private File runfile;
    @Override
    public void actionPerformed(ActionEvent arg0) {
        {


            JFileChooser adbflashfile = new JFileChooser("/home/local/ANT/arthm/Desktop/os"); 
           FileNameExtensionFilter filter = new FileNameExtensionFilter(".py", "py");

                adbflashfile.setFileFilter(filter);

            int returnVal = adbflashfile.showOpenDialog(null);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                runfile = adbflashfile.getSelectedFile();

                try {
                    Runtime.getRuntime().exec("sudo python ./flashimage.py");
                } catch (IOException e1) {

                    e1.printStackTrace();
                }
                //This is where a real application would open the file.
                System.out.println("File: " + runfile.getName() + ".");    
            } else {
                JOptionPane.showMessageDialog(null, "Open command cancelled by user.");
            }
            System.out.println(returnVal);
        }
    };
    }

问题答案:

您可以“读取”过程输入,并在“检测到”密码提示时显示,JOptionPane并要求用户输入密码。

在开始该过程之前,您“可以”提示用户输入密码,因为您知道需要将其发送给该过程。

您可能仍然需要监视进程的输出,以确定何时需要发送密码。

让我们从…开始

Runtime.getRuntime().exec("sudo python ./flashimage.py");

您完全忽略了Process。您也不处理输出,但是您没有办法向流程提供输入…

通常,Runtime#exec充其量是有问题的。您最好使用ProcessBuilder....

// Build the command to be executed.  Note that each parameter becomes
// it's own argument, this deals with parameters that contain spaces
// much better then Runtime#exec alone...
ProcessBuilder pb = new ProcessBuilder("sudo", "python", "./flashimage.py");
pb.redirectError();

InputStream is = null;
try {
    Process p = pb.start();
    is = p.getInputStream();
    StringBuilder output = new StringBuilder(80);
    int in = -1;
    while ((in = is.read()) != -1) {
        if (in != '\n') {
            output.append((char)in);
            // You will need to define PASSWORD_PROMPT
            if (PASSWORD_PROMPT.equals(output.toString())) {
                String text = JOptionPane.showInputDialog("Password");
                OutputStream os = p.getOutputStream();
                os.write(text.getBytes());
            }
        } else {
            System.out.println(output.toString());
            output.delete(0, output.length());
        }
    }
} catch (IOException exp) {
    exp.printStackTrace();
} finally {
    try {
        is.close();
    } catch (Exception e) {
    }
}

现在,毫无疑问,有人会指出(至少)这种方法有两个问题……

  1. JOptionPane.showInputDialog("Password");将显示一个法线JTextField,不会隐藏密码字符和
  2. String 不是最安全的密码存储方式…

相反,我们应该使用JPasswordField并将结果char数组转换为byte数组…

JPasswordField password = new JPasswordField(10);
JLabel label = new JLabel("Password: ");
JPanel panel = new JPanel();
panel.add(label);
panel.add(password);

int option = JOptionPane.showConfirmDialog(null, panel, "Password", JOptionPane.OK_CANCEL_OPTION);
if (option == JOptionPane.OK_OPTION) {
    char[] userPassword = password.getPassword();
    byte[] bytes = new byte[userPassword.length * 2];
    for (int i = 0; i < userPassword.length; i++) {
        bytes[i * 2] = (byte) (userPassword[i] >> 8);
        bytes[i * 2 + 1] = (byte) userPassword[i];
    }
    os.write(bytes);
}


 类似资料:
  • 问题内容: 所以我在这里有一个菜鸟般的时刻,我以前从未使用过命令行来运行Java程序,但现在我需要。我遇到的问题是,当我尝试运行程序时,出现ClassNotFoundException。我的课叫做OmadUpdate。我已经使用javac命令将OmadUpdate.java文件编译为OmadUpdate.class。我已经检查了目录,并且它们都绝对存在,但是当我运行java OmadUpdate命

  • 我下载了一个java程序,它由两个文件夹src和classes组成,分别包含源文件和类文件。现在,src和classes文件夹包含几个嵌套的子文件夹,其中最后一个子文件夹分别包含源文件和类文件。更准确地说,源文件和类文件的路径是src/edu/univ/。java和classes/edu/univ/。班假设包含main函数的文件是main。java,如何从命令行运行此程序。 我尝试过: 我也尝试过

  • 问题内容: 我对Java的经验不是很丰富,这使我发疯。我编写了一个Java程序,需要从命令行运行它。 我可以从命令行编译它,它将在该文件夹中创建所有类,但是当我尝试时说: 线程“主”中的异常java.lang.NoClassDefFoundError:FileManagement / Main 事实是,我已经在远程计算机上尝试了相同的过程,并且工作正常。它不适用于我的。 问题答案: 如果您的课程在

  • 我在从命令行运行一个java程序时遇到了严重的麻烦。我觉得我已经接近弄清楚哪里出了问题,但我只是不知所措,我需要帮助。 我正在尝试用以下命令运行一个简单的Hello World程序(在windows上的VSCode中,使用bash terminal): 这根本不起作用,但是,写入文件的完整路径确实起作用,所以像这样的东西是起作用的。 此外,使用F5运行文件也可以正常工作。我希望用命令行参数运行我的

  • 当我在终端中点击curl代码时,我得到了200,所以我假设我编写testStytch的方式到目前为止还可以。但是,一旦我试图集成到java文件中,我就会收到错误的请求响应。我现在有点不知所措。https://github.com/libetl/curl这就是我所说的转换curl代码。 这是我得到的错误。https响应代理{HTTP/1.1 400错误请求[日期:星期四,2021 23:21:424

  • 问题内容: Scenerio:我想通过ssh从Java程序在远程机器上运行命令(我在开发机器上使用OpenSSH)。我也想通过传递密码来建立ssh连接,而不是像使用“期望”那样设置密钥。 问题:尝试执行“期望”之类的密码登录时,使用ProcessBuilder创建的流程似乎看不到密码提示。当运行常规的非ssh命令(例如’ls’)时,我可以获取流并与它们进行交互。我将标准错误和标准输出合并为一个流因