summaryrefslogtreecommitdiff
path: root/src/machine
diff options
context:
space:
mode:
authorShawn Landden <slandden@gmail.com>2018-01-15 10:17:51 -0800
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2018-01-16 05:17:51 +1100
commitc46bc7e2162d774f55847c1a8cb9d49085cf89bb (patch)
treeac88654da331a6c5197b6cd7a5c0f88ded6a2d09 /src/machine
parent01816fee337f7899b7d196f5847e4a2e6a738437 (diff)
downloadsystemd-c46bc7e2162d774f55847c1a8cb9d49085cf89bb.tar.gz
machined: use getent to get default shell for machinectl shell (#7684)
Closes: https://github.com/systemd/systemd/issues/1395
Diffstat (limited to 'src/machine')
-rw-r--r--src/machine/machine-dbus.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/src/machine/machine-dbus.c b/src/machine/machine-dbus.c
index 0ca2e54ed9..2d7806491b 100644
--- a/src/machine/machine-dbus.c
+++ b/src/machine/machine-dbus.c
@@ -609,7 +609,7 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
_cleanup_(sd_bus_flush_close_unrefp) sd_bus *allocated_bus = NULL;
sd_bus *container_bus = NULL;
_cleanup_close_ int master = -1, slave = -1;
- _cleanup_strv_free_ char **env = NULL, **args = NULL;
+ _cleanup_strv_free_ char **env = NULL, **args_wire = NULL, **args = NULL;
Machine *m = userdata;
const char *p, *unit, *user, *path, *description, *utmp_id;
int r;
@@ -621,22 +621,41 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
if (r < 0)
return r;
user = empty_to_null(user);
- if (isempty(path))
- path = "/bin/sh";
- if (!path_is_absolute(path))
- return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified path '%s' is not absolute", path);
-
- r = sd_bus_message_read_strv(message, &args);
+ r = sd_bus_message_read_strv(message, &args_wire);
if (r < 0)
return r;
- if (strv_isempty(args)) {
- args = strv_free(args);
+ if (isempty(path)) {
+ path = "/bin/sh";
- args = strv_new(path, NULL);
+ args = new0(char*, 3 + 1);
if (!args)
return -ENOMEM;
-
- args[0][0] = '-'; /* Tell /bin/sh that this shall be a login shell */
+ args[0] = strdup("sh");
+ if (!args[0])
+ return -ENOMEM;
+ args[1] = strdup("-c");
+ if (!args[1])
+ return -ENOMEM;
+ r = asprintf(&args[2],
+ "shell=$(getent passwd %s 2>/dev/null | { IFS=: read _ _ _ _ _ _ x; echo \"$x\"; })\n"\
+ "exec \"${shell:-/bin/sh}\" -l", /* -l is means --login */
+ isempty(user) ? "root" : user);
+ if (r < 0) {
+ args[2] = NULL;
+ return -ENOMEM;
+ }
+ } else {
+ if (!path_is_absolute(path))
+ return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Specified path '%s' is not absolute", path);
+ args = args_wire;
+ args_wire = NULL;
+ if (strv_isempty(args)) {
+ args = strv_free(args);
+
+ args = strv_new(path, NULL);
+ if (!args)
+ return -ENOMEM;
+ }
}
r = sd_bus_message_read_strv(message, &env);