[libvirt] [PATCH 11/17] virt-login-shell: honour the -c option to launch commands
Daniel P. Berrange
berrange at redhat.com
Wed May 4 16:53:43 UTC 2016
On Wed, Apr 27, 2016 at 02:28:33PM -0400, John Ferlan wrote:
>
>
> On 04/14/2016 11:22 AM, Daniel P. Berrange wrote:
> > The virt-login-shell program is supposed to look like a
> > regular shell to clients. Login services like sshd
> > expect the shell to accept a '-c cmdstring' argument to
> > specify a command to launch instead of presenting an
> > interactive prompt.
> >
> > We can implement this by simply passing the '-c cmdstring'
> > data straight through to the real shell we use. This does
> > not open any security holes, since the command is not run
> > until we're inside the container namespaces. This allows
> > scp to work for users with virt-login-shell.
> >
> > Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> > ---
> > tools/virt-login-shell.c | 70 +++++++++++++++++++++++++++++++++++++-----------
> > 1 file changed, 54 insertions(+), 16 deletions(-)
> >
> > diff --git a/tools/virt-login-shell.c b/tools/virt-login-shell.c
> > index ec759dc..34a8836 100644
> > --- a/tools/virt-login-shell.c
> > +++ b/tools/virt-login-shell.c
> > @@ -100,20 +100,19 @@ static int virLoginShellAllowedUser(virConfPtr conf,
> > return ret;
> > }
> >
> > -static char **virLoginShellGetShellArgv(virConfPtr conf)
> > +static int virLoginShellGetShellArgv(virConfPtr conf,
> > + char ***retshargv,
> > + size_t *retshargvlen)
> > {
> > size_t i;
> > + size_t len;
> > char **shargv = NULL;
> > - virConfValuePtr p;
> > + virConfValuePtr p, pp;
> >
> > p = virConfGetValue(conf, "shell");
> > - if (!p)
> > - return virStringSplit("/bin/sh -l", " ", 3);
> > -
> > - if (p->type == VIR_CONF_LIST) {
> > - size_t len;
> > - virConfValuePtr pp;
> > -
> > + if (!p) {
> > + len = 2; /* /bin/sh -l */
> > + } else if (p->type == VIR_CONF_LIST) {
> > /* Calc length and check items */
> > for (len = 0, pp = p->list; pp; len++, pp = pp->next) {
> > if (pp->type != VIR_CONF_STRING) {
> > @@ -122,18 +121,41 @@ static char **virLoginShellGetShellArgv(virConfPtr conf)
> > goto error;
> > }
> > }
> > + } else {
> > + virReportSystemError(EINVAL, "%s",
> > + _("shell must be a list of strings"));
> > + goto error;
> > + }
> >
> > - if (VIR_ALLOC_N(shargv, len + 1) < 0)
> > + len++; /* NULL terminator */
> > +
> > + if (VIR_ALLOC_N(shargv, len) < 0)
> > + goto error;
> > +
> > + i = 0;
> > + if (!p) {
> > + if (VIR_STRDUP(shargv[i++], "/bin/sh") < 0)
> > goto error;
> > - for (i = 0, pp = p->list; pp; i++, pp = pp->next) {
> > - if (VIR_STRDUP(shargv[i], pp->str) < 0)
> > + if (VIR_STRDUP(shargv[i++], "-l") < 0)
> > + goto error;
> > + } else if (p->type == VIR_CONF_LIST) {
> > + for (pp = p->list; pp; pp = pp->next) {
> > + if (VIR_STRDUP(shargv[i++], pp->str) < 0)
> > goto error;
> > }
> > }
> > - return shargv;
> > +
> > + shargv[i] = NULL;
> > +
> > + *retshargvlen = i;
> > + *retshargv = shargv;
> > +
> > + return 0;
> > error:
> > + *retshargv = NULL;
> > + *retshargvlen = 0;
> > virStringFreeList(shargv);
> > - return NULL;
> > + return -1;
> > }
> >
> > static char *progname;
>
> Right in here somewhere there's some 'usage()' that should probably be
> updated.
Yep.
> > struct option opt[] = {
> > {"help", no_argument, NULL, 'h'},
>
> Should this add a "-c" w/ required_argument?
>
> I also see the "V" lists "optional_argument", but that's not part of the
> "hV" below, so shouldn't it be no_argument?
The struct option entry is only required if we need to support a
--long argument alternative. These two only need short args so
are omitted here.
> ACK with the changes -
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list