Come trovare la posizione dell'eseguibile su Linux quando i normali metodi falliscono?

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

  •  05-07-2019
  •  | 
  •  

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'eseguibile argv [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:

  1. / proc / self / exe esiste ma non riescono a readlink () a causa dell'autorizzazione negata errno 13.
  2. argv [0] non ha / per percorso assoluto o relativo.
  3. Il $ PATH non contiene l'eseguibile trovato in argv [0] .

Sembra che questo problema sia affrontato anche quando vengono eseguite le applicazioni sgid. Nel mio caso, non è sgid, ma un lancio inetd.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top