Como encontrar a localização do executável em Linux quando os métodos normais falhar?

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

  •  05-07-2019
  •  | 
  •  

Pergunta

Em outra pergunta, os estados de resposta que em Unixes com /proc, a maneira realmente em linha reta e confiável é readlink("/proc/self/exe", buf, bufsize) e, em seguida, passa a dar soluções de backup da seguinte forma:

On Unixes sem / proc (ou seja, se acima falhar):

  • Se argv [0] começa com "/" (caminho absoluto), este é o caminho.
  • Caso contrário, se argv [0] contém "/" (caminho relativo) acrescentá-la à cwd (supondo que ele ainda não foi alterado).
getcwd(buf, bufsize); strncat(buf, "/", bufsize-strlen(buf)-1);
strncat(buf, argv[0], bufsize-strlen(buf)-1);
  • Caso contrário, procurar diretórios em $PATH para argv[0] executável.

Depois pode ser razoável para verificar se o executável não é na verdade um link simbólico. Se é resolvê-lo em relação ao diretório link simbólico.

Agora, no meu caso, infelizmente, nenhuma das obras acima:

  1. /proc/self/exe exists mas não conseguem readlink() devido à permissão negada errno 13.
  2. O argv[0] não tem / de caminho absoluto ou relativo.
  3. O $PATH não contém o Found executável em argv[0].

Parece que este problema é enfrentado também quando os aplicativos SGID executado. No meu caso, não é SGID, mas um lançamento inetd.

Foi útil?

Solução

Tente olhar em / proc de um binário suid.

Outras dicas

A melhor maneira de resolver isso é no arquivo de configuração /etc/xinetd.d/myApp, para adicionar uma variável de ambiente que especifica a localização do binário da seguinte forma:

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
}

Então, se / proc / self / exe é permissão negada, de seleção para o varible env e usá-lo em seu lugar.

Eu acho que a resposta é: desista .

Peça ao usuário para passar o diretório de instalação (ou o que você está procurando) como um argumento de linha de comando.

Como último recurso, analisar o arquivo /etc/xinetd.d/myApp para puxar a linha de servidores que inclui o caminho completo para o executável chamado via inetd.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top