Como escrever um script bash, que se conecta a uma outra máquina para fazer coisas?

9

É possível escrever um script bash, que

  1. seria iniciado a partir da máquina A, efetua login em uma máquina B diferente por ssh (ambas as máquinas A e B seriam Máquinas Linux),
  2. copia alguns arquivos para a máquina B
  3. executa um script python em um determinado script python nessas máquinas.
  4. transfere os resultados de volta para a máquina A
  5. faz logoff da máquina B.

Isso é tecnicamente factível?

    
por Aufwind 11.03.2012 / 18:52

3 respostas

14

Claro que é factível:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

e é isso ...

Mas há um problema: você será perguntado pela senha três vezes. Para evitar que você possa gerar chaves ssh e autorizar usuários por essas chaves.

Para gerar chaves ssh, execute ssh-keygen -t rsa , responda a perguntas e copie a chave pública para o host remoto (máquina B) para ~/.ssh/authorized_keys file. A chave privada deve ser salva em ~/.ssh/id_rsa na máquina local (A).

    
por 11.03.2012 / 19:12
4

É possível fazer tudo em uma única ssh conexão / sessão:

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

Isto:

  1. Copia local_src para remote_dst ,
  2. Executa command ,
  3. Copia remote_src para local_dst .

Mas se command escrever em stdout , o resultado também estará em local_dst . Se command ler a entrada de stdin , ele receberá e EOF .

    
por 11.03.2012 / 22:26
2

Embora você possa fazer isso dentro de uma única sessão ssh, é um pouco complicado combinar a cópia de arquivos com comandos em execução.

A maneira mais fácil de resolver essa tarefa é executar sessões SSH separadas para as três operações:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Isso requer autenticação para o machineB três vezes. A maneira recomendada de evitar a autenticação várias vezes é usar o recurso de compartilhamento de conexão nas versões modernas do OpenSSH: inicie uma conexão mestra com B de uma vez por todas e deixe o SSH conectar-se automaticamente a essa conexão principal. Adicione ControlMaster auto e uma ControlPath linha ao seu ~/.ssh/config , inicie uma conexão mestre em segundo plano e execute suas tarefas.

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

Em vez de usar scp ou rsync para copiar arquivos, pode ser mais fácil montar o sistema de arquivos remoto em SSHFS . Isso, por sinal, cuidará da configuração de uma conexão mestre (supondo que você tenha configurado seu ~/.ssh/config conforme indicado acima).

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
    
por 12.03.2012 / 02:14