Eu escrevi um script em lote no meu laptop windows dez (estou acostumado a bash scripting, então isso pode ser uma resposta simples de script cmd) que ssh no meu Ubuntu Server 20.04.3 em casa, não importa onde eu esteja, e parece isto:
@echo off
ssh -o ConnectTimeout=3 [email protected] 2>NUL || ssh root@myhomeip
pause
Agora isso geralmente funciona, mas quando estou realmente em casa, e ele se conecta usando o primeiro ssh -o ConnectTimeout=3 [email protected] 2>NUL
(tempo limite de conexão definido para que não tente muito tempo para se conectar ao endereço IP privado se eu não estiver em casa, não estava funcionando com o nome netbios há algum tempo, então mudei para isso. Erros redirecionados para que não me dê alguma mensagem de erro inútil antes de tentar o endereço ip público), ele se conecta e me dá uma sessão, mas quando eu saio, de vez em quando enquanto ele me conectará imediatamente com o segundo comando, apesar do símbolo "ou" no lugar (||). Seria bom usar o endereço público sempre, exceto que quando estou na minha rede doméstica, a conexão com o ip público é um poucomais lento do que com o ip privado, e é por isso que fiz esse script em primeiro lugar. Acredito que isso esteja acontecendo porque o ssh ocasionalmente sai com um status de erro por algum motivo, e isso aciona o segundo comando a ser executado, mesmo que eu já tenha entrado e saído do meu servidor. Estou me perguntando por que isso pode ser e como corrigi-lo.
Esta é a minha primeira pergunta, então por favor perdoe quaisquer erros ou outros inconvenientes.
Um shell interativo terminou com Ctrl+ ou csai com o status de saída do último comando executado no shell. No seu caso, o shell é remoto e, se não houver problema com o próprio local, repetirá o status de saída remota localmente. O motivo pelo qual você está falando é o último comando no shell; aparentemente falhou e seu status de saída diferente de zero se propagou para o lado local.
exit
logout
ssh
ssh
Soluções possíveis:
Sempre
exit 0
oulogout 0
à mão (inconveniente).Use
trap … EXIT
no shell remoto e executeexit 0
na armadilha (complicado).Coloque
exit 0
como o último comando.bash_logout
ou script equivalente. Isso é específico para o shell que você está usando no lado remoto, alguns shells não fornecem essa funcionalidade. O código no script pode ser condicional (verifique se o processo pai ésshd
; ou verifique se aSSH_CONNECTION
variável está no ambiente).Em vez de
ssh -o ConnectTimeout=3 [email protected]
usar:Desvantagens:
sshd
; neste caso, o shell externo fará isso, mas o shell interno não, isso pode fazer com que toda a configuração não se comporte exatamente como você deseja.Verifique o status de saída real de
ssh
(localmente); será255
se ocorrer um erro. Você precisa substituir||
por alguma lógica que diferencie255
qualquer outro status de saída. Eu não posso escrever isso de forma confiável para você porque eu não seicmd.exe
o suficiente. Acho que vai ser assimif ERRORLEVEL 255 ssh …
.Observe que se o shell remoto retornar
255
, ele fará com que seu código local pense quessh
falhou. Não há uma maneira fácil de evitar isso. No entanto , testar contra255
é a solução que eu escolheria se eu fosse você . Eu realmente faço isso no meu wrapper SSH que tenta vários parâmetros de conexão .