[lxc-devel] [PATCH 1/3] lxc-start-ephemeral: Use attach

Serge Hallyn serge.hallyn at ubuntu.com
Thu Feb 13 19:07:52 UTC 2014


Quoting Stéphane Graber (stgraber at ubuntu.com):
> With this change, systems that support it will use attach to run any
> provided command.
> 
> This doesn't change the default behaviour of attaching to tty1, but it
> does make it much easier to script or even get a quick shell with:
> lxc-start-ephemeral -o p1 -n p2 -- /bin/bash
> 
> I'm doing the setgid,initgroups,setuid,setenv magic in python rather
> than using the attach_wait parameters as I need access to the pwd module
> in the target namespace to grab the required information.
> 
> Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/lxc/lxc-start-ephemeral.in | 74 ++++++++++++++++++++++++++++--------------
>  1 file changed, 49 insertions(+), 25 deletions(-)
> 
> diff --git a/src/lxc/lxc-start-ephemeral.in b/src/lxc/lxc-start-ephemeral.in
> index 33c713a..552fd9b 100644
> --- a/src/lxc/lxc-start-ephemeral.in
> +++ b/src/lxc/lxc-start-ephemeral.in
> @@ -33,6 +33,7 @@ import argparse
>  import gettext
>  import lxc
>  import os
> +import pwd
>  import sys
>  import subprocess
>  import tempfile
> @@ -77,10 +78,11 @@ parser.add_argument("--bdir", "-b", type=str,
>                      help=_("directory to bind mount into container"))
>  
>  parser.add_argument("--user", "-u", type=str,
> -                    help=_("the user to connect to the container as"))
> +                    help=_("the user to run the command as"))
>  
>  parser.add_argument("--key", "-S", type=str,
> -                    help=_("the path to the SSH key to use to connect"))
> +                    help=_("the path to the key to use to connect "
> +                           "(when using ssh)"))
>  
>  parser.add_argument("--daemon", "-d", action="store_true",
>                      help=_("run in the background"))
> @@ -212,15 +214,15 @@ LXC_NAME="%s"
>          if args.union_type == "overlayfs":
>              fd.write("mount -n -t overlayfs"
>                       " -oupperdir=%s,lowerdir=%s none %s\n" % (
> -                     target,
> -                     entry[0],
> -                     entry[1]))
> +                         target,
> +                         entry[0],
> +                         entry[1]))
>          elif args.union_type == "aufs":
>              fd.write("mount -n -t aufs "
>                       "-o br=%s=rw:%s=ro,noplink none %s\n" % (
> -                     target,
> -                     entry[0],
> -                     entry[1]))
> +                         target,
> +                         entry[0],
> +                         entry[1]))
>          count += 1
>  
>      if args.bdir:
> @@ -297,27 +299,49 @@ if not ips:
>          dest.destroy()
>      sys.exit(1)
>  
> -# NOTE: To replace by .attach() once the kernel supports it
> -cmd = ["ssh",
> -       "-o", "StrictHostKeyChecking=no",
> -       "-o", "UserKnownHostsFile=/dev/null"]
> +if os.path.exists("/proc/self/ns/pid"):
> +    def attach_as_user(command):
> +        try:
> +            username = "root"
> +            if args.user:
> +                username = args.user
>  
> -if args.user:
> -    cmd += ["-l", args.user]
> +            user = pwd.getpwnam(username)
> +            os.setgid(user.pw_gid)
> +            os.initgroups(user.pw_name, user.pw_gid)
> +            os.setuid(user.pw_uid)
> +            os.chdir(user.pw_dir)
> +            os.environ['HOME'] = user.pw_dir
> +        except:
> +            print(_("Unable to switch to user: %s" % username))
> +            sys.exit(1)
>  
> -if args.key:
> -    cmd += ["-i", args.key]
> +        return lxc.attach_run_command(command)
>  
> -for ip in ips:
> -    ssh_cmd = cmd + [ip] + args.command
> -    retval = subprocess.call(ssh_cmd, universal_newlines=True)
> -    if retval == 255:
> -        print(_("SSH failed to connect, trying next IP address."))
> -        continue
> +    retval = dest.attach_wait(attach_as_user, args.command,
> +                              env_policy=lxc.LXC_ATTACH_CLEAR_ENV)
>  
> -    if retval != 0:
> -        print(_("Command returned with non-zero return code: %s") % retval)
> -    break
> +else:
> +    cmd = ["ssh",
> +           "-o", "StrictHostKeyChecking=no",
> +           "-o", "UserKnownHostsFile=/dev/null"]
> +
> +    if args.user:
> +        cmd += ["-l", args.user]
> +
> +    if args.key:
> +        cmd += ["-i", args.key]
> +
> +    for ip in ips:
> +        ssh_cmd = cmd + [ip] + args.command
> +        retval = subprocess.call(ssh_cmd, universal_newlines=True)
> +        if retval == 255:
> +            print(_("SSH failed to connect, trying next IP address."))
> +            continue
> +
> +        if retval != 0:
> +            print(_("Command returned with non-zero return code: %s") % retval)
> +        break
>  
>  # Shutdown the container
>  if not dest.shutdown(timeout=5):
> -- 
> 1.9.rc1
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list