繁体   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