繁体   English   中英

以root用户身份运行时以用户身份启动外部进程

[英]Launch external process as user while running as root

我正在编写一个Mono应用程序,该应用程序将在启动时以root身份运行(upstart + mono-service),并监听用户登录/注销事件。 当用户登录时,我启动了另一个Mono服务来监听会话事件。 但是它不应以root用户身份运行,而应以会话所有者身份运行。 我可以访问会话所有者的名称,uid,gid。

我的问题有点类似于从以admin身份运行的进程中以用户身份启动进程 ,但对于Linux。

那么,如何在以root用户身份正常运行时以指定用户身份运行外部进程?

编辑:

这是我的解决方案:

根据http://pages.infinit.net/ctech/20040405-1133.html的介绍,我尝试在启动过程时向用户冒充,并且目前看来效果很好。

public class SpawnerService : ServiceBase
{
    public SpawnerService ()
    {
        logger = new StreamWriter (new FileStream("/home/username/Log.txt", FileMode.Append));

        info = new ProcessStartInfo {
            FileName = "/usr/bin/mono-service",
            Arguments = "/home/username/SlaveService.exe",
            UseShellExecute = false,
            CreateNoWindow = true
        };
    }

    protected override void OnStart (string[] args)
    {
        logger.WriteLine ("Spawner service started");
        logger.Flush ();

        var user = new WindowsIdentity ("username");
        logger.WriteLine ("Trying to mimc to {0}, {1}", user.Name,user.Token.ToString());
        logger.Flush ();

        WindowsImpersonationContext wic = null;
        try {
            wic = user.Impersonate ();
            Process.Start (info);
            logger.WriteLine ("Seems allright");
            logger.Flush ();
        }
        catch (Exception) {
            logger.WriteLine ("Seems failed");
            logger.Flush ();
        }
        finally {
            if (wic != null) {
                wic.Undo ();
                wic = null;
            }
        }
    }

    protected override void OnStop ()
    {
        logger.WriteLine ("Spawner service stopped");
        logger.Flush ();
    }

    private ProcessStartInfo info;
    private StreamWriter logger;
}

这是一种可靠的方法吗? 还是有一些更好的?

这将以用户alice身份运行echo hello

sudo su alice -c 'echo hello'

这可以通过使用-c参数su并指定您希望用户运行的命令来完成。

"-c, --command COMMAND
       Specify a command that will be invoked by the shell using its -c."


su someuser -c "touch someusersfile"

ls -la someusersfile

ls -la的输出应如下所示:-rw-r--r-- 1 someuser someuser 0 Oct 6 22:22 mynewfile

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM