Come trovare la posizione dell'eseguibile su Linux quando i normali metodi falliscono?
Domanda
In un'altra domanda, la risposta afferma che su Unix con / proc
, il modo veramente semplice e affidabile è readlink (" / proc / self / exe " ;, buf, bufsize )
e procede quindi a fornire soluzioni di backup come segue:
Su Unix senza / proc (cioè se sopra fallisce):
- Se argv [0] inizia con " / " (percorso assoluto) questo è il percorso.
- Altrimenti se argv [0] contiene " / " (percorso relativo) aggiungilo a cwd (supponendo che non sia stato ancora modificato).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1); strncat(buf, argv[0], bufsize-strlen(buf)-1);
- Altrimenti cerca nelle directory
$ PATH
l'eseguibileargv [0]
.
Successivamente può essere ragionevole verificare se l'eseguibile non è in realtà un collegamento simbolico. Se è risolto relativamente alla directory symlink.
Ora nel mio caso, sfortunatamente, nessuna delle precedenti funzioni:
-
/ proc / self / exe esiste
ma non riescono areadlink ()
a causa dell'autorizzazione negata errno 13. -
argv [0]
non ha/
per percorso assoluto o relativo. - Il
$ PATH
non contiene l'eseguibile trovato inargv [0]
.
Sembra che questo problema sia affrontato anche quando vengono eseguite le applicazioni sgid. Nel mio caso, non è sgid, ma un lancio inetd.
Soluzione
Prova a cercare in / proc da un binario di suid.
Altri suggerimenti
Il modo migliore per risolverlo è nel file di configurazione /etc/xinetd.d/myApp, per aggiungere una variabile d'ambiente che specifica la posizione del binario in questo modo:
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
}
Quindi, se a / proc / self / exe viene negata l'autorizzazione, controlla la variabile env e usala invece.
Penso che la risposta sia: arrenditi.
Chiedi all'utente di passare la directory di installazione (o qualunque cosa tu stia cercando) come argomento della riga di comando.
Come ultima risorsa, analizzare il file /etc/xinetd.d/myApp per estrarre la linea del server che include il percorso completo dell'eseguibile convocato tramite inetd.