簡體   English   中英

使用c#和mono關閉linux

[英]Shutdown linux using c# and mono

我正在Windows和Linux上使用c#/ soap和php開發跨平台項目。

這個想法是,當用戶按下Web界面上的按鈕時,它會發送一個soap請求,該請求將關閉服務器。

這在Windows上正常工作但在Linux上工作不正常,我沒有看到任何原因,因為當我在服務器上手動運行shutdown命令時它工作正常。

下面是我正在使用的代碼

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版本工作正常。 我究竟做錯了什么。

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

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

* 更新*感謝您的建議,我想我已經到了某個地方。 我發現mono使用janis方法在wwwrun下運行。

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

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

當我運行soap服務來執行關閉時,我在/var/log/messages收到以下錯誤

8月3日23:28:01 dev-server sudo:pam_unix2(sudo:auth):會話失敗8月3日23:20:27 dev-server sudo:wwwrun:pam_authenticate:會話錯誤; TTY =未知; PWD = /; USER = root; COMMAND = / sbin / shutdown -h now

我現在不知道從哪里開始,對不起,如果我問一些菜鳥問題,我對soap / linux / mono來說相當新。

更新2剛剛發現其他東西,只有當瀏覽器在正在關閉的本地PC上運行時,它才能在Windows上運行。 我已經嘗試重定向命令的輸出,看它是否返回錯誤,什么也沒有,所以我無法找出它失敗的原因。

更新3我剛發現其他東西,我有兩個Windows PC,筆記本電腦和台式機都是Windows 7 x64,從桌面瀏覽器我可以做肥皂請求關閉筆記本電腦,反之亦然,但是,我遇到的問題與Windows Server和Linux一樣,即使是Windows服務器瀏覽器本地也不會讓我通過soap請求關閉自己。 有沒有辦法讓我這樣做,所以Windows服務器將允許我通過soap請求,本地和遠程瀏覽器進行關機,如何解決Linux的問題。

更新4剛剛解決了Windows問題,我需要以管理員身份添加IIS用戶帳戶以允許它執行關機,因此它只是Linux我現在遇到問題。

我已經解決了,但你的所有建議確實有幫助,特別是@janisz和@David Harris。

為了讓Windows工作,我不得不將IIS用戶(IUSR)添加到Windows Server 2008上的管理員組。

對於Linux,我需要像@janisz所說的那樣運行sudoer命令。 為此,我需要運行命令visudo以添加編輯sudoers文件,然后我將以下內容添加到sudoers文件中。

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

然后重新啟動服務器。

在Windows上執行shutdown命令與以前沒有任何不同,但在Linux上,因為@David Harris指出將命令運行為/sbin/sudo和arguements /sbin/shutdown -h now

謝謝你的幫助。

可能單用戶沒有權限關閉計算機,因此有以下選項:

  1. 將monouser添加到電源組(或任何其他可以關閉機器的組) useradd -G power monouser

  2. 將monouser添加到sudoers文件,但有權在沒有密碼的情況下運行shutdown命令。在關機之前更改代碼以調用sudo。 運行visudo並輸入monouser ALL=NOPASSWD: /sbin/shutdown

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

編輯我剛剛意識到shutdown沒有受到保護,但在普通用戶$ PATH中沒有/sbin/條目,所以可能添加關閉的完整路徑將有所幫助。 所以改變process.StartInfo.FileName = "shutdown"; to process.StartInfo.FileName = "/sbin/shutdown";

我會替換

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

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

並擁有執行在sudoers文件中設置的關閉腳本的帳戶,該帳戶具有無密碼執行/ sbin / shutdown的權限。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM