通常の方法が失敗したときにLinuxで実行可能ファイルの場所を見つける方法
質問
別の質問では、答えは / 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ディレクトリに関連して解決します。
今の場合、残念ながら、上記のいずれも機能しません:
-
argv [0]
には絶対パスまたは相対パスの/
がありません。 -
$ 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を介して呼び出された実行可能ファイルへの完全なパスを含むサーバー行を引き出します。
所属していません StackOverflow