使用c和mono关闭linux

本文关键字:关闭 linux mono 使用 | 更新日期: 2024-09-22 23:53:36

我正在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组添加到/etc/groups中,我不确定这一点是否正确,我不知道:x:0是用来做什么的。

我已经将%wheel ALL = (ALL) NOPASSWD: /sbin/shutdown添加到sudoers文件中,并重新启动apache。

当我运行soap服务来执行关闭时,我在/var/log/messages 中得到以下错误

8月3日23:28:01开发服务器sudo:pam_unix2(sudo:auth):对话失败8月3日23:20:27开发服务器sudo:wwwrun:pam_authenticate:会话错误;TTY=未知;PWD=/;USER=根;COMMAND=/sbin/shutdown-h now

我现在不知道该何去何从,很抱歉,如果我问了一个小问题,我对soap/linux/mono还很陌生。

更新2我刚刚发现了其他问题,只有当浏览器在正在关闭的本地电脑上运行时,它才能在Windows上工作。我已经尝试重定向命令的输出,看看它是否返回了错误,但没有返回任何错误,所以我找不出它失败的原因。

更新3我刚刚发现了另一件事,我有两台windows PC,笔记本电脑和台式机都是windows 7 x64,从台式机浏览器我可以执行soap请求关闭笔记本电脑,反之亦然,然而,我遇到的问题是windows Server和Linux,即使是windows服务器上的本地浏览器也不允许我通过soap请求自行关闭。有没有一种方法可以让我通过soap请求、本地和远程浏览器关闭Windows服务器,以及我如何解决Linux的问题。

更新4刚刚修复了Windows问题,我需要以管理员身份添加IIS用户帐户,以允许它执行关闭,所以我现在只对Linux有问题。

使用c和mono关闭linux

我会替换

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的权限。

我已经解决了这个问题,但你的所有建议都有所帮助,尤其是@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上执行关机命令与以前没有任何不同,但在Linux上执行,正如@David Harris所指出的,以/sbin/sudo和争论/sbin/shutdown -h now 运行命令

谢谢你的帮助。

可能单声道用户没有关闭计算机的权限,因此有以下选项:

  1. 将单用户添加到电源组(或任何其他可以关闭机器的组)useradd -G power monouser

  2. 将monouser添加到sudoers文件中,使其有权在没有密码的情况下运行shutdown命令。然后在关闭之前更改代码以调用sudo。运行visudo并键入monouser ALL=NOPASSWD: /sbin/shutdown

  3. 更改单用户可以执行的文件权限

编辑我刚刚意识到shutdown是不受保护的,但在普通用户$PATH中没有/sbin/的条目,所以添加关闭的完整路径可能会有所帮助。因此,将process.StartInfo.FileName = "shutdown";更改为process.StartInfo.FileName = "/sbin/shutdown";