¿Cómo encontrar la ubicación del ejecutable en Linux cuando los métodos normales fallan?
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 elargv [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:
-
/ proc / self / exe existe
pero no puedereadlink ()
debido al permiso denegado errno 13. - El
argv [0]
no tiene/
para la ruta absoluta o relativa. - El
$ PATH
no contiene el ejecutable que se encuentra enargv [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.
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.