0

別の質問では、答えは、を使用する Unix/procでは、本当に直接的で信頼できる方法はreadlink("/proc/self/exe", buf, bufsize)次のようにバックアップ ソリューションを提供することであると述べています。

/proc のない Unix の場合 (つまり、上記が失敗した場合):

  • argv[0] が "/" (絶対パス) で始まる場合、これがパスです。
  • それ以外の場合、argv[0] に "/" (相対パス) が含まれている場合は、それを cwd に追加します (まだ変更されていないと仮定します)。
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1);
strncat(buf, argv[0], bufsize-strlen(buf)-1);
  • それ以外の場合は、ディレクトリで$PATH実行可能ファイルを検索しますargv[0]

その後、実行可能ファイルが実際にシンボリック リンクではないかどうかを確認するのが妥当な場合があります。それがシンボリックリンクディレクトリに対して相対的に解決されている場合。

私の場合、残念ながら、上記のいずれも機能しません。

  1. /proc/self/exe existsreadlink()しかし、許可が拒否されたために失敗します errno 13.
  2. には、絶対パスまたは相対パスargv[0]はありません。/
  3. には$PATH、 にある実行可能ファイルが含まれていませんargv[0]

この問題は、sgid アプリケーションの実行時にも発生するようです。私の場合、sgid ではなく、inetd の起動です。

4

4 に答える 4

1

これを解決する最善の方法は、/etc/xinetd.d/myApp 構成ファイルに、次のようにバイナリの場所を指定する環境変数を追加することです。

service myApp
{
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/local/bin/myAppd
    env = MY_APP_HOME=/usr/local/bin
    port = 2354
    disable = no
}

次に、/proc/self/exe が許可されていない場合は、env 変数を確認し、代わりにそれを使用します。

于 2009-10-23T14:34:07.237 に答える
0

suidバイナリから/procを調べてみてください。

于 2009-10-22T02:39:09.873 に答える
0

答えは「あきらめる」だと思います。

インストール ディレクトリ (または探しているもの) をコマンド ライン引数として渡すようにユーザーに依頼します。

于 2009-10-22T00:28:18.253 に答える
0

As a last resort, parse the /etc/xinetd.d/myApp file to pull out the server line which includes the complete path to the executable summoned via inetd.

于 2009-10-22T02:28:50.440 に答える