3

私のアプリケーションは、rootsコマンド「sudoifupeth0」および「sudoifdowneth0」を実行しようとします。しかし、「sudo:申し訳ありませんが、sudoを実行するにはttyが必要です」というエラーが返されました。したがって、sudoコマンドを実行するにはttyが必要です。そこで、ttyセッションを開いてコマンドを実行しようとしました

gnome-terminal --command="sudo ifdown eth0" &
xterm -e "sudo ifdown eth0" &

それからそれはうまくいきました。しかし、新しく作成されたgnome-terminalまたはxtermからコマンドを送信できません。つまり、コマンドを実行する前に新しく作成されたgnomeまたはxtermウィンドウを閉じると、コマンドはすぐに終了しました。

ユーザーがウィンドウを閉じるのを無効にする方法や、ウィンドウをユーザーに表示しないようにする方法を提案できますか?

注:これは、ifdownおよびifupの代わりにsystem-config-networkコマンドを使用してテストできます。

4

3 に答える 3

4

xtermやgnome-terminalを使用してsudoのターミナルを提供するのではなく、「申し訳ありませんが、sudoを実行するにはttyが必要です」というメッセージを直接処理することをお勧めします。

ファイルには、sudoに端末を要求させるrequirettyオプションがあります。sudoersこのオプションがで設定!requirettyされておらず、コマンドがNOPASSWDオプションで実行された場合、sudoは新しいターミナルウィンドウを開く必要なしに実行されます。このserverfaultの投稿に詳細があります。

これが、たとえばcronスクリプトでsudoが使用される方法です。

requirettyオプションは、cronスクリプトでsudoが使用される環境で追加のセキュリティを提供するだけでなく、リモートユーザーが昇格された特権でコマンドを発行できるようにするため、!requirettyのアクションを制限できます。

   User_Alias LOCAL_USERS = john, mary
   Cmnd_Alias NETWORK_SCRIPTS = /sbin/ifup, /sbin/ifdown
   Defaults!NETWORK_SCRIPTS     !requiretty
   LOCAL_USERS ALL = NOPASSWD: NETWORK_SCRIPTS
于 2012-06-02T13:50:35.347 に答える
3

Xセッション内でコードを実行する場合は、次gksudoの代わりに使用できsudoます。

gksudo -m "Your message" /command/to/run

素敵なGUIインターフェースを使用して、ユーザーにパスワードの入力を求めます(必要な場合)。xtermやgnome-terminalは必要ありません。

効果は、特定のコマンドをパスワードなしで実行できるようにするよりも安全であり、ソリューションはユーザーが慣れているものとより一貫性があります。

ここに画像の説明を入力してください

于 2012-06-02T15:19:10.253 に答える
2

一般に、sudoまたはsuはパスワードの入力を求める必要があります。そうしないと、プログラムはユーザーの介入なしに特権をエスカレートできます。アプリケーションが何らかの目的で昇格する必要がある場合は、xtermなどを使用する必要があります。ただし、リターンコードを取り戻すのは困難であり(konsoleが必要な場合--noforkと、gnome-terminalが必要な--disable-factory場合がありますが、オプションはバージョンによって異なります)、すべてのシステムで正しく取得するのは簡単ではありません。ほとんどのUNIXおよびLinuxディストリビューションはxtermを提供しますが、一部の古いFedora / RHEL / CentOSはxtermなしでXを提供するため、考慮する必要があるもう1つの依存関係です。

によって起動されたコマンドxterm -e sudo -- ...は、標準のダブルフォークとsetsidを実行できます。ユーザーがxtermにパスワードを入力すると、パスワードはすぐに消えますが、コマンドは昇格された特権でバックグラウンドで実行されます。ソケットまたはFIFOを使用して元のプログラムに接続し直し、ルートコプロセスとして実行できます。

daemonorコマンドなどはdisown、既存のアプリケーションをダブルフォークとsetsid(たとえば、xterm -e sudo -- daemon system-config-networkまたはおそらくxterm -e sudo -- bash -c "system-config-network & disown -a")でラップする場合に役立つことがあります。

于 2012-06-02T14:55:50.707 に答える