通常の方法が失敗したときにLinuxで実行可能ファイルの場所を見つける方法

StackOverflow https://stackoverflow.com/questions/1604132

  •  05-07-2019
  •  | 
  •  

質問

別の質問では、答えは / proc を使用するUnixでは、本当にまっすぐで信頼できる方法は readlink(" / proc / self / exe&quot ;, 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);
  • それ以外の場合、 argv [0] $ PATH でディレクトリを検索します。

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

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

  1. argv [0] には絶対パスまたは相対パスの / がありません。
  2. $ PATH には、 argv [0] にある実行可能ファイルが含まれていません。

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

役に立ちましたか?

解決

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

他のヒント

これを解決する最良の方法は、/ 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の許可が拒否された場合、環境変数を確認して代わりに使用します。

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

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

最後の手段として、/ etc / xinetd.d / myAppファイルを解析して、inetdを介して呼び出された実行可能ファイルへの完全なパスを含むサーバー行を引き出します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top