Use rsync para fazer upload de arquivos do servidor local para o remoto de dentro do script php sem digitar a senha

1

Eu já configurei uma chave pública para automatizar o login no servidor remoto para o meu usuário.

Então, isso está funcionando sem nenhum problema de cli:

rsync -r -a -v -e "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/;

Mas, quando tento executar o mesmo de um script PHP (em uma página da Web no meu servidor local):

$c='rsync -r -a -v -e --log-file=FILE "ssh -l user" --delete ~/local/file 111.111.11.111:~/remote/';

//exec($c,$data);
passthru($c,$data);
print_r($data);

Isso é o que recebo:

2011/01/23 19:18:29 [6401] rsync: connection unexpectedly closed (0 bytes received so far) [sender] 2011/01/23 19:18:29 [6401] 
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7] 

As permissões qre definidas assim:

Local:
chmod 600 ~/.ssh/local-rsync-key
chmod 600 ~/.ssh/local-apache-key
chmod 700 ~/.ssh/

Remote:
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh/
chmod 700 ~/

Eu registrei duas chaves em ~ / .ssh / authorized_keys:

user@localserver
apache@localserver

Eu fiquei sem idéias ... Eu acho que tenho que fazer outra coisa no arquivo / etc / ssh / sshd_config remoto. Estou executando o Nginx em ambos os servidores. Obrigado por qualquer ajuda.

ATUALIZAÇÃO:

Embora não seja possível obter o rsync, é assim que consegui transferir o arquivo de local para remoto:

if($con=ssh2_connect('111.111.11.111',22)) echo 'ok!';
if(ssh2_auth_password($con,'apache','xxxxxx')) echo ' ok!';
if(ssh2_scp_send($con,'localfile','/remotefolder',0755)) echo ' ok!';

Necessidades de arquivo local: 0644 Necessidades de pasta remota: 0775

Eu também li esta sugestão: "Eu não acho que você queira" copiar a chave em algum lugar onde o apache pode chegar a ela "- isso é uma violação de segurança. Melhor mudar o script para ser executado como um usuário seguro e, em seguida, configure as chaves .ssh para login sem senha entre os servidores.

Se alguém souber como fazer isso, por favor, seria de grande ajuda.

    
por Roger 24.01.2011 / 01:20

1 resposta

3

tente -e "ssh -l user -i <keyfile>"

Quando executado na linha de comando, ssh usa os arquivos de chave em $HOME/.ssh/ , mas em PHP, ele é executado usando o usuário do Apache, portanto, pode não haver $HOME ; muito menos um $HOME/.ssh/id_dsa . Então, você especifica especificamente qual arquivo de chaves usar ou cria manualmente esse diretório e seu conteúdo.

    
por 24.01.2011 / 03:05