¿Cómo encontrar la ubicación del ejecutable en Linux cuando los métodos normales fallan?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

En otra pregunta, la respuesta indica que en Unixes con / proc , la forma realmente directa y confiable es readlink (" / proc / self / exe " ;, buf, bufsize ) y luego procede a dar soluciones de respaldo de la siguiente manera:

En Unixes sin / proc (es decir, si falla arriba):

  • Si argv [0] comienza con " / " (ruta absoluta) esta es la ruta.
  • De lo contrario, si argv [0] contiene " / " (ruta relativa) adjúntelo a cwd (suponiendo que aún no se haya modificado).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1);
strncat(buf, argv[0], bufsize-strlen(buf)-1);
  • De lo contrario, busque los directorios en $ PATH para el argv [0] ejecutable.

Después, puede ser razonable verificar si el ejecutable no es realmente un enlace simbólico. Si se resuelve en relación con el directorio de enlaces simbólicos.

Lamentablemente, en mi caso, ninguno de los trabajos anteriores:

  1. / proc / self / exe existe pero no puede readlink () debido al permiso denegado errno 13.
  2. El argv [0] no tiene / para la ruta absoluta o relativa.
  3. El $ PATH no contiene el ejecutable que se encuentra en argv [0] .

Parece que este problema se enfrenta también cuando se ejecutan las aplicaciones sgid. En mi caso, no es sgid, sino un lanzamiento inetd.

¿Fue útil?

Solución

Intente buscar en / proc desde un binario suid.

Otros consejos

La mejor manera de resolver esto es en el archivo de configuración /etc/xinetd.d/myApp, para agregar una variable de entorno que especifique la ubicación del binario de esta manera:

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
}

Luego, si / proc / self / exe tiene el permiso denegado, compruebe si hay alguna variable y utilícelo en su lugar.

Creo que la respuesta es: renunciar.

Pida al usuario que pase el directorio de instalación (o lo que esté buscando) como un argumento de línea de comandos.

Como último recurso, analice el archivo /etc/xinetd.d/myApp para extraer la línea del servidor que incluye la ruta completa al ejecutable convocado a través de inetd.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top