Como escrever um script bash, que faz logon em outra máquina para fazer coisas?

11

É possível escrever um script bash, que

  1. seria iniciado na máquina A, efetuaria login em uma máquina diferente B pelo 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 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?

Aufwind
fonte

Respostas:

15

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á solicitado a senha três vezes. Para evitar isso, você pode gerar chaves ssh e autorizar os usuários por essas chaves.

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

pbm
fonte
Se as chaves públicas Arent uma opção, você poderia fazer algo bruto para minimizar solicitações de senha comocat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
Patrick
Se você quiser usar a senha, sempre poderá usar o pool de conexões do OpenSSH definindo ControlMaster=yese ControlPath=/path/to/socketfilee inicie uma conexão ssh com -fpara executar um ssh em segundo plano. Diga a todas as conexões SSH subseqüentes para usar o mesmo arquivo de soquete.
jsbillings
4

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

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

Este:

  1. Cópias local_srcpara remote_dst,
  2. Executa command,
  3. Copia remote_srcpara local_dst.

Mas se commandescrever stdout, o resultado com também estará local_dst. Se commandler a entrada de stdin, receberá e EOF.

jfg956
fonte
3

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

A maneira mais fácil de executar 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 no 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 mestre com o B de uma vez por todas e permita que o SSH ative automaticamente essa conexão mestre. Adicione ControlMaster autouma ControlPathlinha 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 no SSHFS . A propósito, você cuidará da configuração de uma conexão mestre (assumindo que você configurou a sua ~/.ssh/configcomo 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 .
Gilles 'SO- parar de ser mau'
fonte