permissão negada erro no comando “cd” IN een script bash [closed]

1

Durante uma sessão PHP (longa), faço um despejo SQL do banco de dados após cada alteração principal e armazeno o nome do arquivo de despejo em $_SESSION['lastbackup'] . No final da sessão, quero remover todos os despejos gerados, exceto o último (cujo nome está em $_SESSION['lastbackup'] ) com o seguinte script:

~/bin/removeoldbackups.sh :

 #!/bin/bash
 # remove all files in directory  which are part of file pool , 
 except when filename == 
 # arguments:
 # 1     directory path
 # 2     filepool (with wild cards)
 # 3     name of file NOT to be removed
 if [ $# -lt 3 ]; then
 #       no 3rd parameter; 'none' assumed
         keep="none"
 else
         keep=
 fi
 cd ""
 for  f in 
 do
         if [ "$f" != "$keep" ]; then
                 rm "$f"
         fi
 done
 exit

Quando eu o executo no prompt de comando com:

removeoldbackups.sh  /media/fritzmedia/Elements/ubuntubackup mdvlp2*.sql  mdvlp20161225-23:20:09.sql

funciona bem. No entanto, quando eu o executo na minha .php página da Web

shell_exec( '~/bin/removeoldbackups.sh
        /media/fritzmedia/Elements/ubuntubackup ' . 
        'mdvlp2*.sql '.
        $_SESSION['lastbackup'] );

Eu recebo o seguinte erro:

sh: 2: /media/fritzmedia/Elements/ubuntubackup: Permission denied

(Eu tentei exec em vez de shell_exec : não faz diferença.) Eu acho que (como diz) isso significa que não é um problema de permissão de executar o script, mas de acessar (alguma parte do caminho para) os arquivos de backup.

Informação adicional:

  • fritzmedia é uma unidade externa montada em /media .
  • Proprietário do arquivo para /media is root:root ; para fritzmedia e de lá para baixo, é www-data:root .
  • Permissões para /media até os arquivos pretendidos: 0777 .

O script removeoldbackups.sh está em ~/bin ; dono root:root ; permissão 0755 .

Os arquivos de backup são criados por uma chamada de um arquivo PHP:

exec ( 'mysqldump -u -sqluser- -sqlpw- ' . $dbn . ' > ' . $dumpnaam );
    
por Just Started 29.12.2016 / 12:07

1 resposta

2

O erro sh: 2: /media/fritzmedia/Elements/ubuntubackup: Permission denied significa que na linha 2 sh tentou executar /media/fritzmedia/Elements/ubuntubackup , mas não conseguiu porque não tinha permissão de execução.

O problema é que você tem uma quebra de linha no comando entregue a shell_exec . Você deve se livrar disso e ter tudo em uma linha.

Seria ainda melhor se você não usasse shell_exec , pois é propenso a injeção de código em conexão com valores potencialmente controlados pelo usuário como $_SESSION['lastbackup'] . Você deve pelo menos passá-lo por escapeshellcmd . No entanto, neste caso, seu script de shell pode ser reimplementado no PHP de maneira trivial.

    
por David Foerster 29.12.2016 / 12:46