Executa múltiplas diferenças entre arquivos locais e remotos

1

Eu gostaria de comparar vários arquivos locais com seus correspondentes em um host remoto, então gostaria de criar um script como:

ssh user@remote_host "cat remote_file1.txt" | diff - local_file1.txt
ssh user@remote_host "cat remote_file2.txt" | diff - local_file2.txt
...
ssh user@remote_host "cat remote_fileN.txt" | diff - local_fileN.txt

O problema com tal script é que ele pede a senha para cada arquivo. Como pedir a senha apenas uma vez?

    
por kuma 04.07.2017 / 18:32

2 respostas

2

Uma maneira é configurar acesso sem senha (autenticação de chave pública), a outra é multiplexar as conexões. Crie um arquivo de configuração em ~/.ssh/config com o seguinte:

Host remote_host
  User user
  ControlPath ~/.ssh/controlmasters/%r@%h:%p
  ControlMaster auto
  ControlPersist 5m

Crie um diretório ~/.ssh/controlmasters/ :

mkdir -m 700 ~/.ssh/controlmasters/

E quando você executar o script, ele deverá perguntar apenas uma vez a senha e todos os outros comandos serão executados através da mesma conexão já autenticada.

    
por 04.07.2017 / 20:15
0

Se você não tiver permissão para criar acesso sem senha com: ssh-keygen user@remotehost , poderá instalar a ferramenta comum expect e criar um script chamado passexpect :

#!/usr/bin/expect -f

set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

log_user 0
eval spawn $cmd
expect "assword:"
send "$password\r";
interact

então no script de shell principal, você pode ler a senha uma vez:

printf "ssh password:" >&2; read -s pass; printf "\n">&2

e use-o em qualquer comando ssh:

passexpect $pass ssh user@remotehost command_for_remote_host

ou para o seu propósito, o roteiro completo seria:

#/usr/bin/env bash
printf "ssh password:" >&2; read -s pass; printf "\n">&2
./passexpect $pass ssh user@remotehost cat remoteF1.txt | diff - localF1.txt
./passexpect $pass ssh user@remotehost cat remoteF2.txt | diff - localF2.txt
    
por 04.07.2017 / 19:37