2015-10-07 169 views
1

我編寫了一個在啓動時以root用戶身份運行的單聲道應用程序(upstart + mono-service)並監聽用戶登錄/註銷事件。當用戶登錄時,我開始另一個單聲道服務來監聽會話事件。但它不應以root身份運行,而應以會話所有者身份運行。我有權訪問會話所有者的名稱,uid,gid。以root身份運行時以用戶身份啓動外部進程

我的問題有點類似於Start a process as user from an process running as admin,但對於Linux。

那麼如何在正確運行根目錄的情況下以指定的用戶身份運行外部進程呢?

編輯:

這裏是我的解決方案:

根據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; 
} 

這是一個可靠的方法嗎?或者有更好的嗎?

回答

0

這將運行echo hello爲用戶alice

sudo su alice -c 'echo hello' 
+0

這是一個真正的選擇,謝謝!但我不太清楚'System.Diagnostics.Process'將如何處理這樣的鏈:'sudo su username -c mono-service/home/username/App.exe'。據我所知,它的語法是(「應用程序」,「參數」) –

+0

'Proccess(「sudo」,「su用戶名-c mono-service /home/username/App.exe」)'也許?或者'/ usr/bin/sudo'。 順便說一下,你確定你在運行linux嗎? '.exe'文件擴展名通常只用於Windows。 –

+0

來自單聲道 –

0

這可以通過使用-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 10月06日22:22 mynewfile

相關問題