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

我写了一个单声道应用程序,这个应用程序是以root身份启动(upstart + mono-service),并监听用户login/注销事件。 当用户login时,我开始另一个单声道服务来监听会话事件。 但是它不应该以root身份运行,而应该作为会话所有者运行。 我有权访问会话所有者的名称,uid,gid。

我的问题有点类似于启动一个进程作为用户从一个进程作为pipe理员运行 ,但对于Linux。

那么如何在正确运行的情况下以指定的用户身份运行外部进程呢?

编辑:

这是我的解决scheme:

据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参数来完成,并指定希望用户运行的命令。

 "-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