Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;测试“&燃气轮机>;:-c:第0行:查找匹配“时出现意外EOF”';_Java_Linux_Bash - Fatal编程技术网

Java &引用;测试“&燃气轮机>;:-c:第0行:查找匹配“时出现意外EOF”';

Java &引用;测试“&燃气轮机>;:-c:第0行:查找匹配“时出现意外EOF”';,java,linux,bash,Java,Linux,Bash,在我的java代码中,我这样做: Process process = rt.exec("sudo bash -c \"printf \"test\" >> /etc/wpa_supplicant/wpa_supplicant.conf\""); 但是bash告诉我这个错误: "test">>: -c: line 0: unexpected EOF while looking for matching `"' 问题是什么?删除所有转义字符,您的exec字符串将变为: s

在我的java代码中,我这样做:

Process process = rt.exec("sudo bash -c \"printf \"test\" >> /etc/wpa_supplicant/wpa_supplicant.conf\"");
但是bash告诉我这个错误:

"test">>: -c: line 0: unexpected EOF while looking for matching `"'

问题是什么?

删除所有转义字符,您的
exec
字符串将变为:

sudo bash -c "printf "test" >> /etc/wpa_supplicant/wpa_supplicant.conf"
这显然是shell命令的语法错误

你需要的可能是逃跑两次:

  • 需要执行的内容:
    printf“test”>/etc/wpa\u-supplicant/wpa\u-supplicant.conf

  • 包装在sudobash-c中:
    sudobash-c“printf\”test\“>/etc/wpa\u-supplicant/wpa\u-supplicant.conf”

  • 包装在
    rt.exec()
    rt.exec(“sudobash-c\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\”测试\>/etc/wpa\u-suplicant/wpa\u-suplicant.conf\)

  • 此外,在这里使用
    sudo
    时,在获取root权限的密码时可能会遇到意外现象。

    Runtime.exec(String)
    从根本上被破坏。它不支持任何类型的引用或转义,因此不能用于运行任何依赖于传递文本空白的命令

    改用
    Runtime.exec(字符串[])

    Process process = rt.exec(new String[] {
            "sudo", "bash", "-c", "printf \"test\" >> /etc/wpa_supplicant/wpa_supplicant.conf" });
    

    请注意,这需要正确配置
    sudo
    ,以供无密码、非交互式使用,这不是默认设置。能够以交互方式运行命令并不意味着系统配置正确。为了获得有用的诊断信息,您必须读取进程的错误流,否则它将看起来不起作用

    您正在使用bash从Java进行系统调用。bash命令到底应该做什么?在将bash命令嵌入java代码之前,首先确保bash命令在终端上有效。这适用于所问的问题,但在实际应用程序中,如果涉及任何变量数据(例如,而不是固定字符串“test”),该数据需要根据数据的内容进行多次引用和转义。要可靠地做到这一点将非常困难,而且由于生成的shell代码作为根代码执行,因此出错的可能后果是。。。很糟糕。基本上,我的观点是,运行一个shell来运行
    sudo
    来运行一个shell来运行一个命令来执行您真正想要的操作,这不是一个很好的解决问题的方法
    strace
    显示以下无效调用:
    execve(“/usr/bin/sudo”、[“sudo”、“bash”、“-c”、“\“printf”、“\\\“test\\”、“>>”、“/etc/wpa\u suplicant/wpa\u suplicant.conf\”),0x7ffe60feab60/*58 vars*/=0