gpt4 book ai didi

java - Bash 在 Java 中无法正确执行

转载 作者:行者123 更新时间:2023-12-01 07:11:01 25 4
gpt4 key购买 nike

我正在编写一个 Java 程序,需要从系统的/dev/urandom 接口(interface)中提取 32 个字符的 key 。为此,我使用以下过程:

public String generateKey() {
try {
Runtime run = Runtime.getRuntime();
Process pr = run.exec("tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1;echo;");
pr.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = buf.readLine())!= null ) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
}
}

(如果它不能做到这一点,那么它将返回一堆空字符)

由于某种原因,它没有返回任何内容(或者抛出异常并且不打印堆栈跟踪)。我知道这一点是因为我将它打印到控制台(什么也没有),当我将它提供给我的 RC4 引擎时,它会抛出除以零的错误。为什么该命令不起作用以及如何使其起作用?

感谢您的帮助。

编辑:在我发布此内容后不到两分钟,我推断它没有返回空字符,因为我将其设置为返回单词“柠檬”并且它做了同样的事情,所以它不会抛出异常。

编辑2:根据评论中的建议,我尝试直接从文件中读取相同的结果,但我认为我可能做错了......

File file = new File("/dev/urandom");
FileReader freader = null;
StringBuffer sb = new StringBuffer();
int x = 0;
try {
freader = new FileReader(file);
BufferedReader reader = new BufferedReader(freader);
for (int i=0;(i<32||(x=reader.read())==-1);i++) {
sb.append((char) x);
}
return sb.toString();
} catch(Exception e) {
e.printStackTrace();
return "a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
}

编辑 3:这可能对以下人员有所帮助:使用上面的代码并将输出通过管道传输到 od,我发现它只是读取 0。 (同样,它不会抛出异常,否则它不会全为零:)

# ./run.sh | od
0000000 000000 000000 000000 000000 000000 000000 000000 000000
*

最佳答案

Process pr = run.exec("tr -cd '[:alnum:]' < /dev/urandom | fold -w30 | head -n1;echo;");

管道 ( | ) 和重定向 ( < ) 由 shell 处理,而不是操作系统。您可以通过将整个命令作为字符串参数传递给 sh 来轻松解决此问题。 。请参阅以下示例并根据您的使用进行调整:

import java.io.*;
class P1 {
public static void main(String[] args) throws Exception {
Runtime run = Runtime.getRuntime();
Process pr = run.exec("sh -c \"ls </dev/null | grep java\"");
pr.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String line;
while ((line = buf.readLine())!= null ) {
System.out.println(line);
}
}
}

编辑

虽然上述内容可能会帮助您运行使用重定向的 shell 命令,但在当前实例中,正确的方法是根本不使用外部进程,而是从 /dev/urandom 读取。直接,正如 @Josh Cartwright 在 this comment 中解释的那样

关于java - Bash 在 Java 中无法正确执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com