PHP exec espera script com SCP e depois com SSH

1

Eu tenho uma página PHP que executa o seguinte script de espera para enviar um arquivo para outro servidor na minha rede:

#!/usr/bin/expect -f

set password [lindex $argv 0]

spawn /usr/bin/scp /home/Dave/bin/test [email protected]:/etc/test

expect {
    -re ".*yes.*no.*" {
        exp_send "yes\r"
        exp_continue
    }
    -re ".*password.*" {
        exp_send "$password\r"
    }
}

expect eof

Antes de fazer isso, no entanto, preciso fazer o backup do arquivo existente no servidor:

cp /etc/test /etc/test.bak

E depois que eu carregar o arquivo, preciso reiniciar o serviço que lê o arquivo:

/etc/init.d/testservice restart

Parece um pouco idiota ao SSH para o servidor três vezes diferentes. Como posso fazer tudo de uma vez? Existe uma função PHP que vai cuidar de alguns ou de tudo isso para mim?

Editar: solicitar uma senha ao usuário é um requisito.

    
por David Kennedy 31.12.2013 / 07:18

2 respostas

1

Você pode fazer isso executando um único comando SSH, mas é difícil gerenciar a combinação adequada de transferência de dados, execução de comandos e lógica de controle.

É mais fácil estabelecer uma conexão SSH, fazer o seu trabalho com qualquer combinação de ssh , scp , sftp , rsync , sshfs ,… combina com você e, por fim, fechar a conexão SSH. / p>

O SSH oferece uma conexão com a qual outros processos SSH podem se conectar: uma conexão mestre. Inicie uma conexão principal e mantenha-a em execução:

ssh -N -M

Passe as credenciais como entrada com expectativa, desde que você precise fornecer uma senha. Em seguida, execute outros comandos SSH conforme desejar. Quando você não precisar mais da conexão, execute ssh -O exit .

Para garantir que os comandos SSH sejam escravos da conexão mestre existente (e, portanto, não exijam autenticação), passe a mesma opção ControlPath para todas as chamadas SSH. Passe-a como uma opção de linha de comando ( -o ControlPath=… , note minúsculas) ou defina-a em ~/.ssh/config . O valor é um caminho onde o ssh irá criar ou procurar o socket que permite que os escravos e o mestre se comuniquem; ele precisa estar em um diretório gravável em um sistema de arquivos que suporte soquetes nomeados e o nome precisa ser exclusivo para cada conexão (portanto, deve incluir o host, a porta e o usuário de destino).

Veja também Usando um canal SSH já estabelecido e SSH copia facilmente o arquivo para o sistema local

    
por 01.01.2014 / 01:36
0

Acho que sua abordagem pode ser melhorada.

  1. gostaria de configurar suas máquinas com chaves públicas / privadas para que você possa ssh / scp sem ter que fazer o login com uma senha.
  2. Escreva um script para o servidor remoto para fazer o seguinte: a) Copie o arquivo (se existir) para o arquivo de backup, copie do servidor php o arquivo necessário, reinicie o serviço e retorne um status
  3. Então, quando seu php é executado, ele deve executar um script que simplesmente inicie a coleção remota e retorne o resultado ao seu script PHP.

Assim, o seu controle remoto puxa o arquivo e reinicia o serviço, o seu php aciona o script remoto para ser executado.

    
por 31.12.2013 / 11:29