Tim*_*rst 13 java escaping exec runtime.exec character-encoding
这可能已经在之前得到了回答,但那是关于unicode的,我不认为这是unicode(它是ASCII,所以......).
当我在终端中执行此操作时,没有任何问题
vboxmanage setextradata "Test Machine" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort" 2222
Run Code Online (Sandbox Code Playgroud)
但是当我在Java中使用以下内容时
Runtime.getRuntime().exec("vboxmanage setextradata \"Test Machine\" \"VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort\" 2222");
Run Code Online (Sandbox Code Playgroud)
它返回一个错误:unregistered vm'"TestMachine"'
对于像Test\Machine这样的带有空格的参数也是如此,那么它就不会逃避空间.
现在我认为这与字符编码有关,但我没有看到任何设置o_O的选项
Edw*_*uck 15
您在一次调用中调用程序及其参数,这有效地将整个字符串推入处理环境(希望最好).
在Windows系统中,操作系统以不同的方式处理可执行文件和参数,并将它们全部放在同一个字符串中只需要您选择一个完美的字符串,该环境(其中有两个我知道的)可以重新生成-parse到参数列表中.更好的解决方案是使用
Runtime.exec(new String[] {"vboxmanage", "setextradata", "Test Machine", "VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort", "2222"});
Run Code Online (Sandbox Code Playgroud)
对应于 Runtime's
public Process exec(String[] cmdarray)
throws IOException
Run Code Online (Sandbox Code Playgroud)
充其量,使用一个字符串方法,您最终将找到如何提示和转义参数,以便它们不被视为可执行文件名的一部分,但随后您将遇到一个新问题,它们会被传递all作为可执行文件的一个参数.一旦你根据环境修复它,你会发现你的引号没有被从参数中剥离(导致像"2222"这样的参数),或者Window的半破坏参数解析将首先解析空白(导致参数如("测试".)没有意义,这就是为什么有多种exec方法可用.
小智 6
Runtime.exec(String)对于这种情况,使用是错误的方法(通常是将参数传递给新进程的错误方法).
使用其中一个exec重载,它将一组参数传递给新进程.(或者,请参阅Paul对ProcessBuilder的回答 - 这些方法都不会遇到逃避问题).
例:
exec(new String[] { "vbomanager",
"setextradata", "Test Machine",
"VBoxInternal/Devices/pcnet/0/LUN#0/Config/ssh/HostPort", "2222"});
Run Code Online (Sandbox Code Playgroud)
快乐的编码.
在Windows上,Runtime.exec(String [])也不安全.如果参数数组包含空字符串,则基本省略空参数,这可能导致命令行无效.此外,任何参数中的引号都不以反斜杠为前缀.此外,ProcessBuilder可以在不增加前面反斜杠数量的情况下为参数添加引号,如果将路径传递到c:\ program files \等文件夹(包括尾部反斜杠),则会产生有趣的结果.
有关其命令行标记器的Microsoft文档,请访问:http: //msdn.microsoft.com/en-us/library/a1y7w461.aspx
我在此处描述了我所描述的问题:http://bugs.sun.com/view_bug.do?bad_id = 6468220 和 http://bugs.sun.com/view_bug.do?bug_id=6518827
| 归档时间: |
|
| 查看次数: |
13221 次 |
| 最近记录: |