Java &引用;测试“&燃气轮机>;:-c:第0行:查找匹配“时出现意外EOF”';
在我的java代码中,我这样做: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
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“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