SSH não parece ser executado no script bash chamado via servidor web

3

Eu tenho um script de shell simples que:

  1. Cria um diretório na máquina remota.
  2. Copia um arquivo .epub para o novo diretório da máquina remota.
  3. Executa o kindlegen para converter o .epub para um .mobi.
  4. O servidor remoto copia o novo arquivo .mobi de volta ao servidor de origem.

Ambos os servidores são configurados com login sem senha do SSH por meio de chave pública.

A execução do script na linha de comando funciona bem. Executá-lo do servidor a partir de um comando shell_exec do PHP executará o script, mas os comandos ssh e scp não parecem ser executados, ou pelo menos não produzem nada, mesmo se eu usar um sinalizador -v.

Aqui está a função PHP que chama o script de shell:

function mobi_watermark($userid, $email, $epubpath)
{

    $outpath = "/tmp/epub$userid/"; # the book gets marked for each user, store each epub under a unique work folder to avoid collision
    shell_exec("chmod -R 777 ".$outpath); # web server creates files under user "nobody".
    shell_exec("del.sh"); # deletes old files if they exist
    shell_exec("rep.sh $userid $email $epubpath"); # creates the initial .epub and tmp dir
    shell_exec("chmod -R 777 ".$outpath); 
    shell_exec("kindle.sh $outpath"); # this is the mobi conversion, where the problem is
    $this->mobi_ufa_download('ufa-187.mobi',$outpath);
}

E aqui está o script de shell com os comandos com falha: [kindle.sh]

#!/usr/local/bin/bash
# uses the same /tmp$userid path as the other scripts, but on the remote server
TMPPATH=$1 
cd $TMPPATH
# create remote dir
ssh -v user@server 'mkdir -v '$TMPPATH
# copy the source epub file to remote
scp -v $TMPPATHfile-name.epub user@server:$TMPPATH
# perform the conversion and copy the .mobi result back to originating server
/usr/bin/ssh -v user@server 'cd '$TMPPATH'; /home/username/kindlegen/kindlegen ./file-name.epub; scp -v file-name.mobi user@originating-server:'$TMPPATH';rm -rf '$TMPPATH 

Se eu executar esta série de comandos a partir de um arquivo de script ou como comandos individuais da linha de comando, tudo funciona perfeitamente.

Quando executado através do script php, eu posso ver a saída do script se eu decidir ecoar comandos de teste, e o scp reportará um erro se eu quebrar o nome do arquivo fonte, mas nada acontece para os comandos scp ou ssh se estiverem corretos . Não há nem mesmo nenhuma saída de depuração detalhada do sinalizador -v.

Eu devo estar perdendo algo óbvio? Eu estou supondo que é porque o PHP está usando o usuário 'nobody' que o SSH não gosta. Existe uma maneira de contornar isso, se esse é o problema?

    
por Ian 13.01.2012 / 20:09

4 respostas

2

Você pode querer tentar adicionar

 </dev/null

no final dos comandos ofensivos, apenas no caso de, de alguma forma, os comandos precisarem de entrada.

    
por 13.01.2012 / 20:37
2

Onde a chave ssh privada é armazenada, no arquivo ~ / .ssh / id _... do usuário você executa o comando como?

Se sim, o apache não está sendo executado como seu usuário. O Apache precisa ter acesso a uma cópia da chave ssh. Você também pode adicionar o -i aos seus comandos ssh e scp para que ele não precise existir no diretório inicial do apache.

    
por 13.01.2012 / 20:41
2

A função shell_exec () provavelmente fornece algumas informações que você ignora por não coletando. Experimente

$info=shell_exec("kindle.sh $outpath");
echo "<pre>$output</pre>";

é o que eu faria para começar a depurar este problema.

Editar:

Configurar os privs em .ssh e id_rsa em 777 causará grandes problemas, já que o ssh se recusa a funcionar se eles forem muito permissivos. Ajuste-os de volta para 700 e 600, respectivamente.

Eu não entendo por que você não está vendo nada voltar tente

$info=shell_exec("kindle.sh 2>&1 $outpath");
echo "<pre>$output</pre>";

O que deve forçar o stderr a sair também.

    
por 13.01.2012 / 22:22
1

Quando me deparo com problemas ao executar scripts externos a partir de processos httpd e php, eu tento executar manualmente sob o mesmo usuário que o processo httpd é executado.

su nobody

É uma probabilidade muito alta que o usuário ninguem tenha um conjunto de shell, você precisará ativar um shell para su .

    
por 13.01.2012 / 20:42

Tags