Как найти расположение исполняемого файла в Linux при сбое обычных методов? - PullRequest
0 голосов
/ 22 октября 2009

В другом вопросе ответ гласит, что в Unix с /proc действительно простой и надежный способ - readlink("/proc/self/exe", buf, bufsize), а затем он предлагает решения для резервного копирования следующим образом:

В Unixes без / proc (то есть, если вышеперечисленное не работает):

  • Если 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 exists, но не удалось readlink() из-за отклоненного разрешения errno 13.
  2. У argv[0] нет / для абсолютного или относительного пути.
  3. $PATH не содержит исполняемый файл, найденный в argv[0].

Похоже, с этой проблемой сталкиваются и при запуске приложений sgid. В моем случае это не sgid, а запуск inetd.

Ответы [ 4 ]

1 голос
/ 23 октября 2009

Лучший способ решить эту проблему - в файле конфигурации /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 и используйте ее вместо этого.

0 голосов
/ 22 октября 2009

В крайнем случае, проанализируйте файл /etc/xinetd.d/myApp, чтобы извлечь строку сервера, которая включает полный путь к исполняемому файлу, вызванному через inetd.

0 голосов
/ 22 октября 2009

Попробуйте поискать / proc из двоичного файла suid.

0 голосов
/ 22 октября 2009

Я думаю, что ответ: сдаться.

Попросите пользователя передать каталог установки (или все, что вы ищете) в качестве аргумента командной строки.

...