【问题标题】:Shutdown linux using c# and mono使用 c# 和 mono 关闭 linux
【发布时间】:2012-08-03 21:05:19
【问题描述】:

我正在使用 c#/soap 和 php 在 Windows 和 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 版本工作正常的任何原因。我做错了什么。

为了清楚起见,我正在尝试关闭整个服务器,而不是应用程序。

感谢您提供的任何帮助

*更新 * 谢谢你的建议,我想我到了某个地方。我发现单声道正在使用 janis 方法在 wwwrun 下运行。

我已经使用wwwrun:x:0 将 wwwrun:www 组添加到 /etc/groups,我不确定这是否正确,我不知道 :x:0 的用途。

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

当我运行肥皂服务来执行关机时,/var/log/messages 中出现以下错误

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

我现在不知道从哪里开始,对不起,如果我问的是一个菜鸟问题,我对soap/linux/mono 还很陌生。

更新 2 刚刚发现了其他东西,只有当浏览器在正在关闭的本地 PC 上运行时,它才能在 Windows 上运行。我已经尝试重定向命令的输出以查看它是否返回错误并且什么都没有,所以我无法找出它失败的原因。

更新 3 我刚刚发现了别的东西,我有两台 Windows PC、笔记本电脑和台式机,都是 Windows 7 x64,从桌面浏览器我可以发出肥皂请求来关闭笔记本电脑,反之亦然,但是,我遇到的问题是Windows Server 和 Linux,即使是本地的 Windows 服务器浏览器也不会让我通过soap 请求自行关闭。有没有办法可以让 Windows 服务器允许我通过肥皂请求、本地和远程浏览器进行关机,以及如何解决 Linux 的问题。

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

【问题讨论】:

  • 单声道用户是否有权关闭服务器?默认情况下只有 root 可以这样做
  • 哦,真的,有没有办法让单声道能够做到这一点
  • Here 是应该有效的解决方案

标签: c# soap mono shutdown


【解决方案1】:

我会替换

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。

【讨论】:

    【解决方案2】:

    我已经解决了,但您的所有建议确实有所帮助,尤其是 @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 运行命令

    感谢您的帮助。

    【讨论】:

      【解决方案3】:

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

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

      2. 将单用户添加到 sudoers 文件,允许在没有密码的情况下运行关机命令。而不是更改代码以在关机前调用 sudo。运行visudo 并输入monouser ALL=NOPASSWD: /sbin/shutdown

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

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

      【讨论】:

      • 我已经尝试在谷歌上添加一个单声道用户到 sudoers 但在谷歌上找不到任何东西可以做到这一点,或者甚至找出正在运行的用户帐户单声道,它会运行吗在apache用户或不同的东西下。你知道我可以在哪里找到这些信息吗?感谢您的帮助
      • 很容易验证,运行whoami > /tmp/whoami而不是关机读取用户名
      • 谢谢,我想我到了某个地方,我在问题中添加了更多信息,因为当我执行soap 方法进行关机时,我在/var/log/messages 中遇到错误
      • 你试过不使用 sudo 吗? Sudo 可能需要 TTY,这可能就是您出错的原因。
      • 不使用sudo试了一下,没有显示错误,但是关机还是不启动
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多