2012-08-03 31 views
4

我正在使用Windows和Linux上的c#/ soap和php進行跨平臺項目。使用c#和mono關閉linux

這個想法是,當用戶在Web界面上按下一個按鈕時,它會發送一個肥皂請求來關閉服務器。

這工作正常在Windows上,但在Linux上它不工作,我沒有看到任何理由,當我在服務器上手動運行關機命令它工作正常。

下面是我使用

public bool shutdownServer() 
{ 
    Process process = new Process(); 
    if (CommonTasks.getOperatingSystem() == CommonTasks.OperatingSystemType.Windows) 
    { 
     process.StartInfo.FileName = "shutdown"; 
     process.StartInfo.Arguments = "-s -t 0"; 
    } 
    else if (CommonTasks.getOperatingSystem() == CommonTasks.OperatingSystemType.Linux) 
    { 
     process.StartInfo.FileName = "shutdown"; 
     process.StartInfo.Arguments = "-h now"; 
    } 
    else 
    { 
     return false; 
    } 
    library.logging(classDetails + MethodInfo.GetCurrentMethod().Name, string.Format("Shutting down with the following {0} {1}", process.StartInfo.FileName, process.StartInfo.Arguments)); 
    process.Start(); 
    return true; 
} 

我看不出有任何理由爲什麼linux的部分將不執行關機的代碼,但Windows版本正常工作。我究竟做錯了什麼。

只是要清楚我試圖關閉整個服務器,而不是應用程序。

感謝您的幫助,您可以提供

* UPDATE * 感謝您的建議,我想我找到感覺了。我發現mono使用janis方法在wwwrun下運行。

我已經使用wwwrun:x:0將wwwrun:www組添加到/ etc/groups,我不確定這是否是正確的,我不知道:x:0是什麼。

我已將%wheel ALL = (ALL) NOPASSWD: /sbin/shutdown添加到sudoers文件並重新啓動apache。

當我運行SOAP服務於/var/log/messages

8月3日23時28分01秒DEV-服務器須藤執行關閉我得到以下錯誤:模塊pam_unix2(須藤:AUTH):談話 失敗 Aug 3 23:20:27 dev-server sudo:wwwrun:pam_authenticate: 對話錯誤; TTY =未知; PWD = /; USER = root; COMMAND =/sbin目錄/ shutdown -h now中

我不知道在哪裏從這裏走了,對不起,如果我問的有點小白的問題,我是相當新的SOAP/Linux的/單。

更新2 剛剛發現別的東西,它適用於Windows僅當瀏覽器本地PC正被關閉運行。我試着重定向輸出命令,看看它是否返回錯誤,什麼都沒有,所以我找不到它失敗的原因。

更新3 我剛剛發現了別的東西,我有兩個窗口PC,筆記本電腦和臺式機在Windows 7 64位系統,從桌面瀏覽器,我可以做SOAP請求來關閉筆記本電腦,反之亦然,但是,我遇到的問題是Windows Server和Linux,即使本地Windows服務器瀏覽器也不會讓我通過soap請求關閉它。有沒有一種方法可以讓Windows服務器允許我通過soap請求,本地和遠程瀏覽器進行關閉操作,以及如何使用Linux修復問題。

UPDATE 4 剛纔已經固定在Windows的問題,我需要給IIS用戶帳戶添加爲管理員,以允許它執行關機,所以它只是Linux的我有一個問題,現在。

+4

單用戶是否有權關閉服務器?默認情況下,只有root可以做到這一點 – janisz 2012-08-03 21:08:07

+0

哦,真的,有沒有辦法讓單聲道能夠做到這一點 – Boardy 2012-08-03 21:18:09

+0

[Here](http://stackoverflow.com/a/8497774/1387612)是應該工作的解決方案 – janisz 2012-08-04 15:23:59

回答

3

我已經解決了這個問題,但是您的所有建議確實對@janisz和@David Harris有幫助。

爲了獲得Windows的工作,我不得不在IIS用戶(IUSR)添加到管理員組在Windows Server 2008

對於Linux,我需要爲sudoer運行命令@janisz說。爲此,我需要運行命令visudo來添加編輯sudoers文件,然後將以下內容添加到sudoers文件中。

User_Alias APACHE = wwwrun 
Cmnd_Alias SHUTDOWN = /sbin/shutdown APACHE 
APACHE ALL = (ALL) NOPASSWD: SHUTDOWN 

然後重新啓動服務器。

爲了執行在Windows關機命令沒有任何不同,因爲之前,但在Linux上作爲@大衛哈里斯尖運行命令/sbin/sudo和arguements /sbin/shutdown -h now

感謝您的幫助。

2

大概單用戶還沒有特權來關閉計算機所以有下列選項:

  1. 添加monouser到電源羣組(或任何其它基團,可以關閉機器)useradd -G power monouser

  2. 添加monouser以sudoers文件的權限運行shutdown命令,而無需使用password.Than更改代碼以在關閉之前調用sudo。運行visudo並鍵入monouser ALL=NOPASSWD: /sbin/shutdown

  3. 更改文件權限是monouser可以執行它

編輯 我剛剛意識到shutdown是不受保護的,但在普通用戶$ PATH不存在用於入門/sbin/因此可能添加關閉完整路徑將有所幫助。因此,改變process.StartInfo.FileName = "shutdown";process.StartInfo.FileName = "/sbin/shutdown";

+0

我我曾嘗試做一個谷歌關於添加單聲道用戶的sudoers,但無法找到任何東西在谷歌這樣做,甚至找出哪個用戶帳戶單聲道正在運行,它會運行在Apache用戶或不同的東西。你知道我在哪裏可以找到這個信息。感謝您的幫助 – Boardy 2012-08-03 21:45:54

+0

這很容易驗證,運行'whoami>/tmp/whoami'而不是關機並且讀取用戶名 – janisz 2012-08-03 21:55:00

+0

謝謝我想我在某處,我已經添加了一些更多的信息,因爲我得到的問題在執行soap方法執行關閉時,/ var/log/messages中出現錯誤 – Boardy 2012-08-03 22:27:02

2

我更換

process.StartInfo.FileName = "shutdown"; 
process.StartInfo.Arguments = "-h now"; 

process.StartInfo.FileName = "/usr/bin/sudo"; 
process.StartInfo.Arguments = "/sbin/shutdown -h now"; 

,並有執行關機腳本在sudoers設置與執行/ sbin目錄/文件的權限帳戶無密碼關機。