Estou desenvolvendo um script simples, que se conecta a determinados computadores e executa, por meio de uma ssh
sessão, determinados comandos:
sshpass -p 'password' ssh $target_ip << EOF
echo \$PATH
# example
echo \$HOSTNAME
[...]
EOF
A operação está correta, mas me incomoda que a cada conexão ele mostre o ssh
banner do servidor e interfira no restante do script stdout
:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-81-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Nov 23 11:58:14 CET 2022
System load: 0.44 Processes: 131
Usage of /: 9.2% of 108.79GB Users logged in: 0
Memory usage: 26% IPv4 address for br0: 172.16.20.11
Swap usage: 0% IPv4 address for br0: 10.130.1.1
Temperature: 36.0 C IPv4 address for tun0: 10.130.0.27
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
241 updates can be installed immediately.
134 of these updates are security updates.
To see these additional updates run: apt list --upgradable
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Portanto, não quero que esse banner seja exibido e apenas as saídas dos comandos que executo dentro do arquivo EOF
.
Caso seja relevante, a versão do SSH que estou usando é OpenSSH_9.1p1, OpenSSL 3.0.7 1 Nov 2022
. No caso do servidor, é OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
.
Não quero retirar o banner do servidor, o que poderia ser feito nas sshd
configurações. O que eu quero é que o cliente, no script, desabilite a impressão de banners.
No entanto, as opções de linha ssh que funcionaram para outras pessoas (estive aqui e aqui ) não funcionaram para mim:
ssh -o LogLevel=error $ip
Também:
ssh -q $ip
Como posso desabilitar isso no nível do cliente? não há opção ou parâmetro ssh que me permita fazer isso? e em caso de não, como posso redirecionar isso stdout
sem /dev/null
tocar nas saídas dos comandos que executo dentro do EOF
?
Um banner antes da autenticação SSH vem da
Banner
opçãosshd_config
do servidor SSH. Sem alterar a configuração do servidor, você não pode fazer com que o servidor não envie para você. Seu cliente deve imprimi-lo para stderr, então2>/dev/null
irá suprimi-lo localmente, mas também irá suprimir outras mensagensssh
(esshpass
no seu caso) impressões para stderr.Um banner após a autenticação SSH provavelmente vem de algum script de inicialização do shell remoto. * Se
ssh "$target_ip" date
mostrar esse banner, você deve revisar os scripts de inicialização no servidor, encontrar o código responsável por imprimir o banner e corrigi-lo. Se o culpado estiver em algum script global (em/etc
), criar um script privado correspondente (em seu$HOME
) pode permitir que você altere o comportamento. Consulte a documentação do shell sendo seu shell de login no servidor.Se
ssh "$target_ip" date
não mostrar o banner, isso significa que o script relevante atual suprime o banner para um shell não interativo. Você pode usar esse fato para silenciar o banner sem alterar nada no servidor.Você
sshpass -p 'password' ssh $target_ip << EOF
não passa nenhum comando inicial para o lado remoto, então o servidor SSH inicia um shell interativo para você que lê seu stdin e só então o here-document é consumido.Para iniciar um shell não interativo, passe um comando. Deve ser o shell que você deseja usar e certifique-se de que ele não seja iniciado interativamente. Provavelmente é melhor não confiar no valor remoto de
$SHELL
nem nada, porque você sabe localmente para que shell serve seu documento aqui. O shell remoto original não é mais necessário, entãoexec
é uma boa ideia.No exemplo abaixo, o shell solicitado é
bash
. Ele não iniciará interativamente porque sua entrada padrão não é um tty (para comparação: o shell remoto que causou o problema foi iniciado interativamente independentemente do tty porque o servidor SSH solicitou isso explicitamente).* Em geral, o shell padrão formal de alguém em um servidor pode ser qualquer coisa, por exemplo, um wrapper
bash
que imprime algo incondicionalmente, independentemente dos scripts de inicialização e, em seguida, executabash
. É um cenário exótico, mas possível. Muito provavelmente não é o caso.