HADOOP-13434. Add bash quoting to Shell class. (Owen O'Malley)
(cherry picked from commit 49a95718754cb6d302371b2421e86da7bce50297)
This commit is contained in:
parent
9195e81fd4
commit
4bc2ece80b
@ -65,6 +65,8 @@ Release 2.6.5 - UNRELEASED
|
||||
HADOOP-11361. Fix a race condition in MetricsSourceAdapter.updateJmxCache.
|
||||
(Vinayakumar B, Yongjun Zhang, and Brahma Reddy Battula via ozawa)
|
||||
|
||||
HADOOP-13434. Add quoting to Shell class. (Owen O'Malley)
|
||||
|
||||
Release 2.6.4 - 2016-02-11
|
||||
|
||||
INCOMPATIBLE CHANGES
|
||||
|
@ -82,8 +82,23 @@ public static void checkWindowsCommandLineLength(String...commands)
|
||||
}
|
||||
}
|
||||
|
||||
/** a Unix command to get the current user's name */
|
||||
public final static String USER_NAME_COMMAND = "whoami";
|
||||
/**
|
||||
* Quote the given arg so that bash will interpret it as a single value.
|
||||
* Note that this quotes it for one level of bash, if you are passing it
|
||||
* into a badly written shell script, you need to fix your shell script.
|
||||
* @param arg the argument to quote
|
||||
* @return the quoted string
|
||||
*/
|
||||
static String bashQuote(String arg) {
|
||||
StringBuilder buffer = new StringBuilder(arg.length() + 2);
|
||||
buffer.append('\'');
|
||||
buffer.append(arg.replace("'", "'\\''"));
|
||||
buffer.append('\'');
|
||||
return buffer.toString();
|
||||
}
|
||||
|
||||
/** a Unix command to get the current user's name: {@value}. */
|
||||
public static final String USER_NAME_COMMAND = "whoami";
|
||||
|
||||
/** Windows CreateProcess synchronization object */
|
||||
public static final Object WindowsProcessLaunchLock = new Object();
|
||||
@ -133,7 +148,7 @@ static private OSType getOSType() {
|
||||
/** a Unix command to get the current user's groups list */
|
||||
public static String[] getGroupsCommand() {
|
||||
return (WINDOWS)? new String[]{"cmd", "/c", "groups"}
|
||||
: new String[]{"bash", "-c", "groups"};
|
||||
: new String[]{"groups"};
|
||||
}
|
||||
|
||||
/**
|
||||
@ -143,17 +158,21 @@ public static String[] getGroupsCommand() {
|
||||
* i.e. the user's primary group will be included twice.
|
||||
*/
|
||||
public static String[] getGroupsForUserCommand(final String user) {
|
||||
//'groups username' command return is non-consistent across different unixes
|
||||
return (WINDOWS)? new String[] { WINUTILS, "groups", "-F", "\"" + user + "\""}
|
||||
: new String [] {"bash", "-c", "id -gn " + user
|
||||
+ "&& id -Gn " + user};
|
||||
//'groups username' command return is inconsistent across different unixes
|
||||
if (WINDOWS) {
|
||||
return new String[]
|
||||
{getWinUtilsPath(), "groups", "-F", "\"" + user + "\""};
|
||||
} else {
|
||||
String quotedUser = bashQuote(user);
|
||||
return new String[] {"bash", "-c", "id -gn " + quotedUser +
|
||||
"; id -Gn " + quotedUser};
|
||||
}
|
||||
}
|
||||
|
||||
/** a Unix command to get a given netgroup's user list */
|
||||
public static String[] getUsersForNetgroupCommand(final String netgroup) {
|
||||
//'groups username' command return is non-consistent across different unixes
|
||||
return (WINDOWS)? new String [] {"cmd", "/c", "getent netgroup " + netgroup}
|
||||
: new String [] {"bash", "-c", "getent netgroup " + netgroup};
|
||||
return new String[] {"getent", "netgroup", netgroup};
|
||||
}
|
||||
|
||||
/** Return a command to get permission information. */
|
||||
@ -259,8 +278,9 @@ public static String appendScriptExtension(String basename) {
|
||||
*/
|
||||
public static String[] getRunScriptCommand(File script) {
|
||||
String absolutePath = script.getAbsolutePath();
|
||||
return WINDOWS ? new String[] { "cmd", "/c", absolutePath } :
|
||||
new String[] { "/bin/bash", absolutePath };
|
||||
return WINDOWS ?
|
||||
new String[] {"cmd", "/c", absolutePath }
|
||||
: new String[] {"/bin/bash", bashQuote(absolutePath) };
|
||||
}
|
||||
|
||||
/** a Unix command to set permission */
|
||||
@ -737,7 +757,13 @@ public ShellCommandExecutor(String[] execString, File dir,
|
||||
|
||||
/** Execute the shell command. */
|
||||
public void execute() throws IOException {
|
||||
this.run();
|
||||
for (String s : command) {
|
||||
if (s == null) {
|
||||
throw new IOException("(null) entry in command string: "
|
||||
+ StringUtils.join(" ", command));
|
||||
}
|
||||
}
|
||||
this.run();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -209,4 +209,11 @@ private void testInterval(long interval) throws IOException {
|
||||
assertEquals(2, command.getRunCount());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBashQuote() {
|
||||
assertEquals("'foobar'", Shell.bashQuote("foobar"));
|
||||
assertEquals("'foo'\\''bar'", Shell.bashQuote("foo'bar"));
|
||||
assertEquals("''\\''foo'\\''bar'\\'''", Shell.bashQuote("'foo'bar'"));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user