gksu で開く c/gtk のプログラムがあります。問題は、環境変数 $HOME を getenv("HOME") で取得すると、明らかに「root」が返されることです。gksu を実行したユーザーを知る方法や、そのユーザーの環境変数を取得する方法があるかどうかを知りたいです。前もって感謝します!
2 に答える
マニュアルページを参照してください。環境を維持するために使用gksu -k command...
します (特に、PATH
とHOME
)。
gksu env PATH="$PATH" HOME="$HOME" command...
または、Lewis Richard Phillip C が示したように、コマンドの環境変数をリセットするために使用できます。(ロジックは、ユーザー権限で実行される親シェルが変数を置換しenv
、スーパーユーザー権限が取得されたときに変数を再設定するというものです。)
アプリケーションを root 権限でのみ実行する必要がある場合は、他の多くのアプリケーションと同様に、ランチャー スクリプトを作成できます。スクリプト自体は基本的に
#!/bin/sh
exec gksu -k /path/to/your/application "$@"
また
#!/bin/sh
exec gksu env PATH="$PATH" HOME="$HOME" /path/to/your/application "$@"
スクリプトは にインストールされ/usr/bin
、アプリケーションは/usr/bin/yourapp-bin
またはとしてインストールされます/usr/lib/yourapp/yourapp
。コマンドがシェルを置き換えるexec
ことを意味します。つまり、コマンドが実行された後は何も実行されません (アプリケーションまたはコマンドがまったく実行できない場合を除く)。最も重要なことは、アプリケーションの実行が開始されている間、メモリに余分なシェルが存在しないことです。exec
Linux やその他の POSIX に似たシステムには、有効なID (アプリケーションが実行できる操作を定義する) と実際のID (操作を実行するユーザーを定義する) の概念がありますが、gksu
すべての ID を変更します。特に、getuid()
たとえば set-UID バイナリの場合は実際のユーザー ID を返しますが、 を使用するとゼロ (「ルート」) を返しますgksu
。
したがって、上記の起動スクリプトは、問題を解決するための推奨される方法です。これもよくあることです。走る
file -L /usr/bin/* /usr/sbin/* | sed -ne '/shell/ s|:.*$||p' | xargs -r grep -lie launcher -e '^exec /'
システムのランチャー スクリプトである (またはそれ自体がランチャー スクリプトであると宣言している) コマンドを確認するには、または
file -L /bin/* /sbin/* /usr/bin/* /usr/sbin/* | sed -ne '/shell/ s|:.*$||p' | xargs -r grep -lie gksu
gksu
明示的に使用するものを確認します。既知の適切なアプローチを採用しても害はありません.. ;)
これらの環境変数の値を標準変数に割り当て、gkSU の後に変数をエクスポートする gksu を実行することができます... gkSU の後に && を使用してこれらを定義し、実行をバインドすることで、基本的に複製された環境変数を使用して実行します...
より良い質問は、なぜこれを行うのかということです。いくつかのフォルダーを保持したいことはわかっていますが、ルートとして作成されたファイルは、おそらく umask を使用してグローバルに書き込み可能にする必要があるか、または手動でアクセス許可を修正するか、所有権を変更する必要がある理由がわかりません...これはそのようなものです悪い考えです!
https://superuser.com/questions/232231/how-do-i-make-sudo-preserve-my-environment-variables、http://www.cyberciti.biz/faq/linux-unix-shellをチェックしてください-export-command/ & https://serverfault.com/questions/62178/how-to-specify-roots-environment-variable