4

私は、Windows と Linux で c#/soap と php を使用したクロスプラットフォーム プロジェクトに取り組んでいます。

これは、ユーザーが Web インターフェイスのボタンを押すと、サーバーをシャットダウンする SOAP 要求を送信するというものです。

これは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:www グループを /etc/groups に追加しました。wwwrun:x:0これが正しいかどうかはわかりません。:x:0 の目的がわかりません。

%wheel ALL = (ALL) NOPASSWD: /sbin/shutdownsudoers ファイルに追加して、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=/; ユーザー=ルート; COMMAND=/sbin/shutdown -h now

ここからどこへ行けばいいのかわかりません。ちょっと初歩的な質問をしていたらすみません。soap/linux/mono にはかなり慣れていません。

更新 2 別のことがわかりました。シャットダウン中のローカル PC でブラウザーが実行されている場合にのみ Windows で動作します。コマンドからの出力をリダイレクトして、エラーが返されるかどうかを確認しようとしましたが、何も返されないため、失敗する理由がわかりません。

更新 3 別のことを発見しました。2 つの Windows PC、ラップトップ、およびデスクトップがあり、両方とも Windows 7 x64 です。デスクトップ ブラウザから、SOAP 要求を実行してラップトップをシャットダウンすることも、その逆も可能ですが、私が抱えている問題はWindows Server と Linux では、Windows サーバー ブラウザーのローカルであっても、soap 要求を介して自分自身をシャットダウンすることはできません。WindowsサーバーでSOAPリクエスト、ローカルおよびリモートブラウザーを介してシャットダウンできるようにする方法と、Linuxで問題を解決するにはどうすればよいですか。

更新 4 Windows の問題を修正したばかりです。IIS ユーザー アカウントを管理者として追加して、シャットダウンを実行できるようにする必要があったため、現在 Linux に問題があります。

4

3 に答える 3

3

私は交換します

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

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

パスワードなしで /sbin/shutdown を実行する権限を持つシャットダウン スクリプトを実行するアカウントを sudoers ファイルに設定します。

于 2012-08-03T21:22:26.590 に答える
3

私はそれを解決しましたが、あなたの提案はすべて、特に@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

ご協力いただきありがとうございます。

于 2012-08-04T15:28:16.993 に答える
2

おそらく mono ユーザーにはコンピュータをシャットダウンする権限がないため、次のオプションがあります。

  1. monouser を電源グループ (またはマシンの電源をオフにできるその他のグループ) に追加します。useradd -G power monouser

  2. パスワードなしでシャットダウン コマンドを実行する権限を持つ monouser を sudoers ファイルに追加します。シャットダウン前に sudo を呼び出すようにコードを変更します。実行visudoして入力 するmonouser ALL=NOPASSWD: /sbin/shutdown

  3. モノユーザーが実行できるファイルのアクセス許可を変更する

編集保護され ていないことに気付きましたshutdownが、通常のユーザー $PATH にはエントリがないため/sbin/、おそらくシャットダウンへのフルパスを追加すると役立ちます。だからprocess.StartInfo.FileName = "shutdown";に変更process.StartInfo.FileName = "/sbin/shutdown";

于 2012-08-03T21:19:44.950 に答える