Como verificar qual usuário php está rodando?

115

Eu preciso detectar se o php está sendo executado como ninguém. Como eu faço isso?

Existem outros nomes para "ninguém"? "apache"? Quaisquer outros?

Wesley
fonte
O que você quer dizer exatamente com a pergunta "existem outros nomes"? Os administradores de sistemas podem criar usuários com o nome que desejarem.
Álvaro González
Quaisquer outros nomes padrão para qualquer coisa que possa ser considerada o servidor; apache, ninguém, www-data, etc.
Wesley
1
Se bem me lembro, os usuários do sistema normalmente têm um pequeno UID (abaixo de 1024?). Essa pode ser uma pista melhor para o que quer que você esteja tentando realizar.
Álvaro González
9
get_current_user () retorna o dono do script atual, não o usuário php que está rodando.
Dima L.

Respostas:

85

Se disponível, você pode sondar a conta do usuário atual com posix_geteuide, em seguida, obter o nome do usuário com posix_getpwuid.

$username = posix_getpwuid(posix_geteuid())['name'];

Se você estiver executando em modo de segurança (o que geralmente é o caso quando exec está desabilitado), então é improvável que seu processo PHP esteja executando em qualquer coisa além do padrão www-dataou apacheconta.

mario
fonte
10
um comentário na página de get_current_user()manual que mostra essa abordagem. A partir do PHP 5.4, ele pode ser reduzido para:print posix_getpwuid(posix_geteuid())['name'];
Palec
209

<?php echo exec('whoami'); ?>

AlienWebguy
fonte
1
Realmente não posso usar exec ou sistema ou qualquer função intermediária.
Wesley
Era exatamente o que eu precisava. get_current_user () não era o que eu precisava definitivamente.
dgig
5
Pode ser útil para alguns usuários: se você executar a partir da interface da linha de comando, obterá o usuário que executa o comando, e não o usuário PHP.
Bram Vanroy
@BramVanroy então onde você deve executá-lo? = |
Andrew
@BramVanroy - Quero entender seu comentário, mas não entendo. se você executar isso do CLI, não é você quem possui o processo php atual? Quem seria o usuário PHP neste caso, além de você?
billynoah
72

Meio para trás, mas sem exec / sistema:

file_put_contents("testFile", "test");
$user = fileowner("testFile");
unlink("testFile");

Se você criar um arquivo, o proprietário será o usuário PHP.

Isso provavelmente também poderia ser executado com qualquer uma das funções de arquivo temporário, como tempnam(), que cria um arquivo aleatório no diretório temporário e retorna o nome desse arquivo. Se houver problemas devido a algo como as permissões open_basedirou modo de segurança que impedem a gravação de um arquivo, normalmente, o diretório temporário ainda será permitido.

Jonathan Kuhn
fonte
2
Solução de plataforma cruzada muito inteligente. Boh!
Matt Fletcher
3
Legal: a única solução sem privilégios aqui para também encontrar o grupo no qual o PHP está sendo executado.
tanius
2
um hack digno, merece um lugar mais alto
Abraham Philip,
1
@RavinderPayal A menos que você use a função tempnam como sugeri. É quase garantido que o usuário possa gravar no diretório temporário, independentemente de quem seja. Sem ser capaz de gravar no diretório temporário, você pode dar permissões temporariamente a uma pasta 777 e, se habilitado, desabilitar o selinux para aquele caminho.
Jonathan Kuhn
1
@RavinderPayal existem funções adicionais para retornar o caminho temporário. Portanto $temp_file = tempnam(sys_get_temp_dir(), 'TMP');, criaria um arquivo temporário no diretório temporário na maioria dos sistemas. Você pode então usar esse arquivo para obter o usuário / grupo. Eu deixei um pouco disso para o usuário descobrir.
Jonathan Kuhn,
20

Mais detalhes seriam úteis, mas assumindo que é um sistema linux, e assumindo que o php está rodando sob o apache, ele rodará como sempre o usuário do apache.

Uma maneira fácil de verificar (novamente, assumindo algum ambiente semelhante ao Unix) é criar um arquivo php com:

<?php
    print shell_exec( 'whoami' );
?>

que lhe dará o usuário.

Para minha instância AWS, estou obtendo uma apachesaída quando executo este script.

Seth
fonte
16

Você pode tentar usar crases como este:

echo `whoami`;
Ricbra
fonte
7
É apenas uma duplicata das perguntas acima.
volter9
2
Pode ser útil para alguns usuários: se você executar a partir da interface da linha de comando, obterá o usuário que executa o comando, e não o usuário PHP.
Bram Vanroy
12

eu usaria:

lsof -i
lsof -i | less
lsof -i | grep :http

nenhum desses. Você pode digitar em na linha de comando ssh e você verá qual usuário está ouvindo qual serviço.

você também pode verificar este arquivo:

more /etc/apache2/envvars

e procure por estas linhas:

export APACHE_RUN_USER=user-name
export APACHE_RUN_GROUP=group-name

para filtrar os dados do arquivo envvars, você pode usar grep:

 more  /etc/apache2/envvars |grep APACHE_RUN_
Lukas Liesis
fonte
1
grep "APACHE_RUN_" /etc/apache2/envvarsfuncionou bem, obrigado.
Tarik
11

exec('whoami') vai fazer isso

<?php
echo exec('whoami');
?>
gênese
fonte
Realmente não posso usar exec ou sistema ou qualquer função intermediária.
Wesley
@Wesley: então isso não é possível.
genesis
2
Pode ser útil para alguns usuários: se você executar a partir da interface da linha de comando, obterá o usuário que executa o comando, e não o usuário PHP.
Bram Vanroy
5

Direto do shell, você pode executar:

php -r "echo exec('whoami');"
Gabriel Vilches Alves
fonte
1

adicione o arquivo info.php ao seguinte diretório - seu diretório http / apache padrão - normalmente / var / www / html

com o seguinte conteúdo

<?php                                                                           
phpinfo();                                                                    
?>  

Em seguida, reinicie o httpd / apache e vá para o diretório html padrão http://enter.server.here/info.php

entregaria todo o pedigree do php!

CRTLBREAK
fonte
3
e qual variável / valor nessa saída estamos procurando?
Andrew
Tenho certeza que você já encontrou isso, mas pesquisar por "usuário" nessa página?
CRTLBREAK
0

Em minha configuração, desejo verificar se o processo atual tem permissão para criar pastas, subpastas e arquivos antes de iniciar um processo e sugerir uma solução, caso pareça que não posso. Eu queria executar stat(<file>)em várias coisas para garantir que as permissões correspondam às do processo em execução (estou usando php-fpm, portanto, varia dependendo do pool).
A solução baseada em posix que Mario deu acima parece perfeita, no entanto, parece que a extensão posix está --disabled, então eu não pude fazer o acima e como eu quero comparar os resultados com a resposta da execução de stat () whoamiem um shell separado também não é útil (preciso do uid e do gid, não do nome de usuário).

No entanto eu encontrei uma dica útil, que pude stat(/proc/self)e stat(/proc/self/attr)e veja o uid e GID do arquivo.

Espero que ajude outra pessoa

Sibaz
fonte
0

Você pode usar estes comandos:

<? system('whoami');?>

ou

<? passthru('whoami');?>

ou

<? print exec('whoami');?>

ou

<? print shell_exec('whoami');?>

ou

<? print get_current_user();?>
Freeman
fonte
get_current_user () não retorna o usuário atual. Ele retorna o proprietário do script em que a função é chamada.
andsens
-1

Eu costumo usar

<?php echo get_current_user(); ?>

Ficarei feliz se te ajudou

Yiimar
fonte
Isso já foi mencionado nos comentários da pergunta e tem muito pouco a ver com o usuário sob o qual o script está sendo executado.
Palec
get_current_user() - Gets the name of the owner of the current PHP script- não o usuário executando o processo PHP.
Francisco Zarabozo
-1
$_SERVER["USER"]

$_SERVER["USERNAME"] 
Degrau
fonte
echo $_SERVER["USER"];funciona, mas fornece o nome de usuário conectado no momento em SSH.
Tarik
-1

Proposta

Um pouco tarde, mas mesmo que o seguinte seja uma solução alternativa, ele resolve o requisito, pois funciona muito bem:

<?
    function get_sys_usr()
    {
        $unique_name = uniqid();  // not-so-unique id
        $native_path = "./temp/$unique_name.php";
        $public_path = "http://example.com/temp/$unique_name.php";
        $php_content = "<? echo get_current_user(); ?>";
        $process_usr = "apache";  // fall-back

        if (is_readable("./temp") && is_writable("./temp"))
        {
            file_put_contents($native_path,$php_content);
            $process_usr = trim(file_get_contents($public_path));
            unlink($native_path);
        }

        return $process_usr;
    }


    echo get_sys_usr();  // www-data
?>


Descrição

O destaque de código acima não é preciso, copie e cole em seu editor favorito e visualize como código PHP ou salve e teste você mesmo.

Como você provavelmente sabe, get_current_user()retorna o proprietário do "script em execução atual" - então, se você não "chown" um script no servidor para o usuário do servidor web, muito provavelmente será "ninguém", ou se o desenvolvedor- usuário existe no mesmo sistema operacional, ele irá exibir esse nome de usuário.

Para contornar isso, criamos um arquivo com o processo em execução atual. Se você apenas fizer require()isso no script em execução atual, ele retornará o mesmo que o script-pai mencionado; portanto, precisamos executá-lo como uma solicitação separada para ter efeito.

Fluxo de processo

Para tornar isso eficaz, considere executar um padrão de design que incorpore o "modo de tempo de execução", de modo que quando o servidor estiver em "modo de desenvolvimento ou modo de teste", apenas ele poderá executar esta função e salvar sua saída em algum lugar de inclusão , -ou apenas texto simples ou banco de dados, ou o que for.

Claro que você pode alterar algumas particularidades do código acima, se desejar torná-lo mais dinâmico, mas a lógica é a seguinte:

  • definir uma referência única para limitar a interferência com outros usuários
  • definir um caminho de arquivo local para escrever um arquivo temporário
  • definir uma url / caminho público para executar este arquivo em seu próprio processo
  • escreva o arquivo php temporário que mostra o nome do proprietário do script
  • obter a saída deste script fazendo uma solicitação a ele
  • exclua o arquivo porque não é mais necessário - ou deixe-o se quiser
  • retornar a saída da solicitação como valor de retorno da função

fonte
-1
<?php phpinfo(); ?>

salvar como info.php e

abra info.php em seu navegador

ctrl + f e digite qualquer um destes:

APACHE_RUN_USER
APACHE_RUN_GROUP
user/group

você pode ver o usuário e o grupo com o qual o apache está sendo executado.

Jerome Jr. Formentera
fonte