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下运行。
我已经使用
我已将
当我运行soap服务执行关闭操作时,我在
中收到以下错误
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指出将命令运行为
感谢您的帮助。
我要替换
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的权限(没有密码)。
可能单用户没有特权关闭计算机,因此有以下选项:
将单用户添加到电源组(或可以关闭计算机的任何其他组)
将单用户添加到sudoers文件中,并且可以在不使用密码的情况下运行shutdown命令。运行
更改单用户可以执行的文件权限
编辑
我刚刚意识到