关于Soap:使用C#和Mono关闭Linux

Shutdown linux using c# and mono

我正在Windows和Linux上使用c#/ soap和php进行跨平台项目。

这个想法是,当用户按下Web界面上的按钮时,它将发送一个Soap请求,该请求将关闭服务器。

这在Windows上可以正常工作,但是在Linux上却不能正常工作,我看不到任何原因,原因是我在服务器上手动运行shutdown命令时可以正常工作。

下面是我正在使用的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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。

当我运行soap服务执行关闭操作时,我在/var/log/messages

中收到以下错误

Aug 3 23:28:01 dev-server sudo: pam_unix2(sudo:auth): conversation
failed
Aug 3 23:20:27 dev-server sudo: wwwrun : pam_authenticate:
Conversation error ; TTY=unknown ; 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文件中。

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

然后重新启动服务器。

在Windows上执行shutdown命令与以前没有什么不同,但是在Linux上,@ David Harris指出将命令运行为/sbin/sudo并争论了/sbin/shutdown -h now

感谢您的帮助。


我要替换

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

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

,并在sudoers文件中设置了执行关闭脚本的帐户,该帐户具有执行/ sbin / shutdown的权限(没有密码)。


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

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

  • 将单用户添加到sudoers文件中,并且可以在不使用密码的情况下运行shutdown命令。运行visudo并键入monouser ALL=NOPASSWD: /sbin/shutdown

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

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