O ssh tem uma opção "BatchMode" que fará com que simplesmente falhe em vez de pedir uma senha. Isso parece muito mais fácil do que ter seu script tentando prever se ele pedirá uma senha. Uma resposta a uma pergunta semelhante no SuperUser indica que a simples desativação da PasswordAuthentication nem sempre é funcionam porque há vários tipos de autenticação interativa diferentes, e também não parece que isso irá impedir que ela solicite uma senha em uma chave.
Você pode usar ssh -o BatchMode=yes
ou colocá-lo em seu ssh_config para o host.
Além disso, o ssh não solicitará uma senha se não houver um terminal de controle (ele recebe um erro " read_passphrase: can't open /dev/tty: No such device or address
") - você pode iniciar um processo sem controle tty com setsid
, o ideal é fazer quando você iniciar o Jenkins em vez de fazê-lo especificamente para o comando ssh (isso também impedirá que sudo
solicite uma senha, etc.)
Observe que, se você executar um processo com setsid
, ele será executado automaticamente em segundo plano (já que o shell não pode trabalhar com controle de tarefas com processos em sessões diferentes), portanto, você precisa estar preparado para isso redirecionando stdout / stderr para um arquivo de log (e stdin para / dev / null). Você pode obter resultados estranhos se um programa executado em setsid
tentar ler qualquer coisa a partir da entrada padrão, já que os mecanismos usuais para impedir que um processo de segundo plano leia o terminal não funcionam.