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

É possível escrever um script bash, que

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

Isso é tecnicamente factível?

Resposta

Claro que é possível:

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

e é isso …

Mas há um problema: será solicitada a senha três vezes. Para evitar isso, você pode gerar chaves ssh e autorizar usuários por essas chaves.

Para gerar ssh as chaves executam ssh-keygen -t rsa, respondem às perguntas e copiam a chave pública para o host remoto (máquina B) para o arquivo ~/.ssh/authorized_keys. A chave privada deve ser salva em ~/.ssh/id_rsa na máquina local (A).

Comentários

  • Se as chaves públicas não forem uma opção, você pode fazer algo grosseiro para minimizar as solicitações de senha como cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
  • Se você fizer isso deseja usar a senha, você sempre pode usar o pool de conexão OpenSSH ' s definindo ControlMaster=yes e ControlPath=/path/to/socketfile e, em seguida, inicie uma conexão ssh com -f para executar um ssh em segundo plano. Diga a todas as conexões SSH subsequentes para usarem o mesmo arquivo de socket.

Resposta

É 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. Cópias local_src a remote_dst,
  2. Executa command,
  3. Cópias remote_src para local_dst.

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

Resposta

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

A maneira mais fácil de realizar 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 na máquinaB três vezes. A maneira recomendada de evitar a autenticação várias vezes é usar o recurso de compartilhamento de conexão em versões modernas do OpenSSH: inicie uma conexão mestre com B de uma vez por todas e deixe o SSH automaticamente se associar a essa conexão mestre. Adicione ControlMaster auto e uma ControlPath linha ao seu ~/.ssh/config , em seguida, 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 o r rsync para copiar arquivos, pode ser mais fácil montar o sistema de arquivos remoto em SSHFS . Isso cuidará da configuração de uma conexão mestre, a propósito (assumindo que você “configurou 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 . 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *