【问题标题】:"test">>: -c: line 0: unexpected EOF while looking for matching `"' [closed]“测试”>>:-c:第0行:寻找匹配的“”时出现意外的EOF [关闭]
【发布时间】:2018-12-25 18:58:48
【问题描述】:

在我的 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 `"'

有什么问题?

【问题讨论】:

  • 您正在使用 bash 从 Java 进行系统调用。 bash 命令到底应该做什么?尝试确保 bash 命令首先从终端运行,然后再将其嵌入到您的 java 代码中。

标签: java linux bash


【解决方案1】:

去掉所有的转义字符,你的exec字符串变成:

sudo bash -c "printf "test" >> /etc/wpa_supplicant/wpa_supplicant.conf"

这显然是 shell 命令的语法错误。

你需要的东西可能会转义两次:

  1. 你需要执行什么:printf "test" >> /etc/wpa_supplicant/wpa_supplicant.conf

  2. 包裹在sudo bash -csudo bash -c "printf \"test\" >> /etc/wpa_supplicant/wpa_supplicant.conf"

  3. 包裹在rt.exec()rt.exec("sudo bash -c \"printf \\\"test\\\" >> /etc/wpa_supplicant/wpa_supplicant.conf\"")

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

【讨论】:

  • 这适用于所问的问题,但在实际应用程序中,如果涉及任何可变数据(例如,而不是固定字符串“test”),则该数据需要被多次引用和转义方式取决于数据的内容。确实很难可靠地做到这一点,并且由于生成的 shell 代码以 root 身份执行,因此出错的可能后果是......非常糟糕。基本上,我的观点是,运行一个 shell 来运行 sudo 来运行一个 shell 来运行一个执行你真正想要的命令并不是一个很好的处理方式。
  • 这不适用于所问的问题。 strace 显示以下无效调用:execve("/usr/bin/sudo", ["sudo", "bash", "-c", "\"printf", "\\\"test\\\"", ">>", "/etc/wpa_supplicant/wpa_supplicant.conf\""], 0x7ffe60feab60 /* 58 vars */) = 0
【解决方案2】:

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

改用Runtime.exec(String[])

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

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

【讨论】:

    猜你喜欢
    • 2018-10-19
    • 2023-03-05
    • 1970-01-01
    • 2020-06-14
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多