É possível escrever um script bash, que
- 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),
- copia alguns arquivos para a máquina B
- executa um script python um determinado script python nessas máquinas.
- transfere os resultados de volta para a máquina A
- 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
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:
- Cópias
local_src
aremote_dst
, - Executa
command
, - Cópias
remote_src
paralocal_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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
ControlMaster=yes
eControlPath=/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.