Descontinuar script bash se a conexão SSH não puder ser feita de forma não interativa

1

Estou trabalhando em um script Bash que faz uma conexão SSH via git em um determinado ponto durante as ações do script. Estou tentando lidar com alguns erros que podem ocorrer, parando o script antes que ele falhe em parte do caminho.

Em um ponto, ele executa um comando como git push , que inicia um envio por SSH. Há uma chance de que isso se conecte a um novo host pela primeira vez, o que leva a um prompt interativo verificando a validade do host.

RSA key fingerprint is 96:a9:23:5c:cc:d1:0a:d4:70:22:93:e9:9e:1e:74:2f.
Are you sure you want to continue connecting (yes/no)? yes

Estou procurando ideias sobre como evitar o prompt do SSH ou falhar no script antecipadamente se o host SSH não tiver sido aprovado pelo usuário antes.

Eu dei uma olhada em esta questão . Pode-se argumentar que essa questão é uma duplicata disso, mas as soluções listadas não se aplicam à minha situação. Eu prefiro detectar que a conexão SSH não pode ser feita sem o prompt e falhar nesse caso.

    
por Ryan Burnette 20.03.2017 / 03:49

2 respostas

3

Portanto, em vez de adicionar o host a known_hosts automaticamente, você deseja falhar a conexão, caso ainda não exista. StrictHostKeyChecking ainda é a opção para fazer isso (como na pergunta vinculada), mas em vez de defini-lo como no , defina-o como yes . Isso fará com que a conexão falhe se a chave do host não for conhecida.

$ ssh -oStrictHostKeyChecking=yes [email protected]
No ECDSA host key is known for somehost.somewhere and you have requested strict checking.
Host key verification failed.

ssh sai com o status 255 se ocorrer um erro, incluindo este caso, para que você possa testá-lo no script com algo como

if [ "$?" = 255 ] ; then
    echo "there was an error"
fi

Claro que pode haver algum outro erro também, você precisa verificar a saída de ssh para ter certeza.

    
por 20.03.2017 / 07:08
0

O cliente OpenSSH pode solicitar ao usuário através do terminal ou através do display X11. Se você quiser ter certeza de que o usuário não será solicitado, organize o cliente sem terminal de controle e sem display X. Livrar-se da tela X é fácil: desmarque a variável de ambiente DISPLAY ou defina-a como uma string vazia. Para executar o processo sem terminal de controle, execute-o em uma sessão separada. Não há nenhum utilitário POSIX para isso, mas o Linux tem um utilitário setsid .

DISPLAY= setsid ssh …

Observe que a execução do cliente SSH em sua própria sessão também o executa em seu próprio grupo de processos. A principal conseqüência prática do uso de setsid é que se o script é executado a partir de um shell interativo, Ctrl + C não mata o cliente SSH; você deve colocar uma armadilha para o SIGINT no seu script que mata o cliente SSH.

ssh_pid=
trap INT TERM 'if [ -n "$ssh_pid" ]; then kill "$ssh_pid"; fi'
DISPLAY= setsid ssh … &
wait "$ssh_pid"
unset ssh_pid

Tenha em atenção que ssh devolve o código de estado 0 se não conseguir estabelecer a ligação porque a verificação da chave do anfitrião falhou. Você precisará confiar em outra coisa para determinar se o comando foi bem-sucedido.

    
por 20.03.2017 / 23:16