Ativando o shell script para ser executado como usuário diferente com PHP

0

Eu tenho um script de shell chamado copy.sh no meu diretório raiz da web com as seguintes linhas nele

rsync -rzv -e 'ssh -p 199'  test.txt [email protected]:/home/testuser/txt
ssh  [email protected] -p 199 . /home/testuser/lty.sh > ltylog.txt 2>&1

Este script primeiro copia o arquivo de texto para o meu servidor remoto e executa o script de shell para sincronizá-lo com outros dois servidores. Eu gero chave pública / privada ssh para testuser no meu servidor atual e copio para o servidor remoto. Eu posso ssh para o servidor remoto sem qualquer senha

ssh [email protected] -p 199 

Eu posso executar o comando acima e posso entrar no meu servidor remoto. Na minha máquina host quando estou no testuser eu posso executar esse script de shell sem quaisquer problemas. Copie os arquivos e execute o script remoto. Eu configurei minha permissão de script como 777 por enquanto. Mas eu preciso rodar esse script usando PHP executando shell_exec assim

<?php
shell_exec('. /var/www/html/copy.sh');

echo "<pre>";
echo file_get_contents("ltylog.txt");
echo "<pre>";
?>

Mas quando executo esse PHP, nada acontece. porque acho que o usuário que está executando o script de shell é o usuário do Apache em vez do usuário de teste. mas em vez de executar shell script quando eu shell_exec PWD ou algo que está funcionando perfeitamente. Eu desabilitei o modo de segurança do php e dei 777 permissões para todos os arquivos. mas ainda não consigo fazer isso funcionar.

P.S sei que é um grande risco à segurança colocar scripts de shell na raiz da web com permissões. mas isso não é sistema de prod e estou testando a aplicação web pequena para nossos propósitos internos. servidor que eu executo isso não tem acesso à internet em tudo. Alguém poderia me ajudar a consertar isso? Estou procurando uma solução pequena. desde este pequeno aplicativo web usado apenas por uma ou duas pessoas. obrigado

    
por gripen fighter 25.08.2017 / 04:23

2 respostas

0

Se entendi seu problema corretamente e você não se importa com os riscos de segurança, é possível instalar o sudo, adicionar "www-data" (o www-data é um usuário padrão usado pelo nginx / apache) ao arquivo sudoers com todos permissão e nenhuma senha necessária e usá-lo para executar um comando como outro usuário.

Você pode fazer assim:

Instale o sudo:

apt-get install sudo

Em seguida, adicione o usuário à configuração:

nano /etc/sudoers

Adicione isto na última linha:

www-data ALL=(ALL) NOPASSWD: ALL

E finalmente você pode editar seu php para executar um comando com o sudo:

shell_exec('sudo -u testuser /var/www/html/copy.sh');

@Editar

Consegui fazê-lo funcionar no meu servidor. Basta seguir estes passos e também deve funcionar para você.

  1. Tente substituir seu código PHP por isso:

    <?php
    echo shell_exec('/bin/sh /var/www/html/copy.sh'); #this will display the result in your browser
    
    echo "<pre>";
    echo file_get_contents("ltylog.txt");
    echo "<pre>";
    ?>
    
  2. Certifique-se então de que www-data tenha acesso ao arquivo copy.sh:

Você pode dar um 777 chmod assim:

    chmod 777 /var/www/html/copy.sh

ou você pode fazer o arquivo pertencer ao usuário www-data (usado pelo apache):

    chown www-data:www-data /var/www/html/copy.sh

mas se você escolher usar a segunda opção, certifique-se de que o www-data ainda possa executar o arquivo aplicando o chmod assim:

    chmod 755 /var/www/html/copy.sh
  1. Torne o arquivo executável:

    chmod +x /var/www/html/copy.sh
    
  2. altere o código copy.sh para isto:

    rsync -rzv -e 'ssh -p 199'  test.txt [email protected]:/home/testuser/txt
    ssh  [email protected] -p 199 /bin/sh /home/testuser/lty.sh > ltylog.txt 2>&1
    
  3. Finalmente, certifique-se de que o testuser tenha acesso aos seguintes arquivos:

    • / home /
    • / home / testuser /
    • /home/testuser/lty.sh
    • /home/testuser/ltylog.txt

Se você não se importa com segurança, você pode simplesmente digitar isso no console de um servidor remoto

    chmod 777 -R /home/

Ou você pode verificar cada arquivo manualmente para garantir que as permissões estejam definidas corretamente.

    
por 25.08.2017 / 04:42
0

Se bem entendi, você deseja executar um script como o proprietário do arquivo, não como o usuário atual (o usuário do apache).

Se você quiser, talvez esteja interessado em setuid .

Um breve resumo de como funciona foi publicado anteriormente.

    
por 25.08.2017 / 08:58