[resolvido]complementar script para execução em maquina remota

Iniciado por ralfrisi, 11 de Março de 2011, 13:50

tópico anterior - próximo tópico

script servidor

script
0 (0%)
servidor
0 (0%)

Total de membros que votaram: 0

ralfrisi

Sou novato no linux, e agradeço de antemão se alguem puder dar uma força.

Estou tentando elaborar um script que me permita acessar um servidor e executar algumas funções dentro dele, como back up de arquivos e enviar e-mails de notificação.

Citar#solicita confirmação para iniciar o processo logando-se ao servidor!
echo "deseja logar-se ao servidor? [s/n]"
read RESPOSTA
#digitando nao 'n' o script sera interrompido
test "$RESPOSTA" = "n" && exit


echo "data e horario:"
date
echo

echo "deseja prosseguir? [S/N]"
read RESPOSTA
#digitando nao 'n' o script sera interrompido
test "$RESPOSTA" = "n" && exit

#realiza a conexão com o servidor
sshpass -p senha  ssh  usuario@ip.xxx.x.x


Com o script acima consigo conectar sem a necessidade de senha, o problema é que não estou conseguindo fazer nenhum comando funcionar depois que a conexão com a maquina de destino é realizada.

raidicar

Boa tarde,

Veja, existe um problema logico por traz disso.

Vamos chamar a maquina onde roda o script de maquina local e a maquina onde realiza a conexão de servidor.
Tendo isso em mente, o script funciona da seguinte forma:
1 - O script está executando na maquina local e, em seu código, num determinado momento, conecta no servidor.
2 - Todo script funciona processando linha a linha, após a linha que abre uma conexão com o servidor, o script fica "Em pausa".
3 - As linhas subsequentes do script serão executadas após a conexão ser encerrada.
Consequência, todos as linhas que vem depois da conexão ssh com o servidor, serão executadas após a conexão ser encerrada.
Em resumo, os comandos que gostaria que fosse executado no servidor serão executados localmente, visto que quando a linha é executada, não existe mais conexão.
Vê o erro de lógica? Se já está conectado a outro micro, como pode o script em seu micro executar suas instruções?.
É como tentar dar ordem aos caseiros de sua casa de praia sem estar lá, vc está em sua casa na cidade.
Apenas quando voltar a casa de praia as instruções serão dadas.

Existe duas formas de resolver isso:
Forma 1 - Preparar as instruções no destino (um script) e realizar uma chamada remota para execução desse script.
Supondo que queira que arquivos do servidor sejam transferidos para outra maquina, ou seja, um backup.
Nesse caso, deixe o script de backup no servidor e o chame da sua maquina local:
Ex: sshpass -p senha ssh IP_Servidor "nohup /caminho_do_script &"
Dessa forma, será aberto uma conexão ssh do seu micro para o servidor e, no servidor, vc chamou o backup.
ps1: O nohup é para que o comando continue sendo executado após a conexão ser fechada.
ps2: o & serve para que o comando seja processado em segundo plano.

O comando será processado rapidamente e o terminal ficará disponivel para uso, mas o backup estará sendo executado no servidor.
ssh IP "instrução" -> isso executa uma instrução remota mas não deixa a conexão aberta, ou seja, vc não sai do seu terminal.
ex: ssh IP "cat /etc/passwd" -> em seu terminal, será mostrado o caminho do arquivo.


Forma 2 - Vamos supor que deseja realizar um backup do servidor para a maquina local executando o script a partir da maquina local:
dentro do script da maquina local:

sshpass -p senha_servidor ssh IP_SERVIDOR "sshpass -p senha_maquinalocal scp -rf /diretorio_servidor/arquivos_servidor IP_maquinalocal:/diretorio_destino_maquinalocal"
Explicando: Conexão aberta com o servidor onde foi executada a instrução que o ordena copiar dados para o micro local.
Para isso funcionar, a conexão do servidor para a maquina local não pode pedir senha, pois se pedir, não tem como ser informada e tera erro de autenticação.
Entendeu a lógica? você não pode acessar o servidor e executar comandos dentro dele por meio de script.
Terá de enviar o comando diretamente com a conexão, mas sem permanecer conectado, dessa forma o script irá executar as linhas subsequentes.

Ex1: de o comando sshpass -p senha ssh IP_SERVIDOR "ls /"
E como resultado, será mostrado o / do servidor, mas não estará conectado nele, continuará em sua maquina.

Supondo que, do micro local queira fazer um backup do servidor 1 para o servidor 2.
Ex2: sshpass -p senha_servidor_1 ssh ip_servidor "rsync --delete -vgpruzl /Diretorio_servidor/* -e sshpass -p senha_servidor_2 ssh ip_servidor_2:/diretorio_destino/"

ps1:rsync: comando utilizado para sincronizar o conteudo entre diretorios.
ps2: parametro --delete: Faz com que, se o arquivo for deletado no servidor 1, seja deletado durante o sincronismo no servidor 2. (evita o acumulo de dados, mas não preserva dados excluidos, vc escolhe usar ou não.)
se quiser saber mais sobre o rsync, pesquise-o.

Obviamente, se esta usando o script sshpass, tende configurar o ssh para suprimir a pergunta que o ssh faz, se quer ou não conectar em outro micro.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

Kriptolix

recentemente tive um problema parecido, e pra piorar a coisa tinha que ser realizada via windows, acabei caindo no metodo 1 incado pelo amigo raidicar.

outro ponto importante é por que da necessidade dessa conexao, se voce deseja apenas realizar uma serie de rotinas numa maquina linux pode usar o agendamento automatico (cron e crontab) para isso.
Ubuntu Linux 10.10

ralfrisi

Valeu pelas dicas e explicações!
Com o primeiro metodo consegui resolver a questão.