我的应用程序在SD卡上有一个目录。应用程序将注释保存在新的子目录中。我想使用shell命令“rm -r”删除整个子目录,但应用程序抛出异常:
04-02 23:14:23.410: W/System.err(14891): java.io.IOException: Error running exec(). Command: [cd, /mnt/sdcard/mynote, &&, rm, -r, aaa] Working Directory: null Environment: null
任何人都可以帮助我吗?
答案 0 :(得分:6)
这是因为您使用了Runtime.exec(String)
。切勿使用此功能。它很难预测,只能在琐碎的情况下起作用。始终使用Runtime.exec(String[])
。
由于cd
和&&
不是命令而是shell功能,因此您需要手动调用shell才能使其工作:
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "cd /mnt/sdcard/mynote && rm -r aaa"
});
在相关的说明中,您永远不应将未转义的String数据传递给shell。例如,这是错误的:
// Insecure, buggy and wrong!
String target = "aaa";
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "cd /mnt/sdcard/mynote && rm -r " + target
});
正确的方法是将数据作为单独的参数传递给shell,并从命令中引用它们:
// Secure and correct
String target = "aaa";
Runtime.getRuntime().exec(new String[] {
"sh", "-c", "cd /mnt/sdcard/mynote && rm -r \"$1\"", "--", target
});
例如,如果文件名为*
或My file
,则错误的版本将删除一大堆完全不相关的文件。正确的版本没有。