Meu caso de uso atual passado para mim no trabalho de screen
uso é ssh
para servidor, su
para conta de usuário técnico, então screen -RD
. Quando ssh
a sessão é perdida automaticamente devido ao tempo limite, repito as etapas e tenho meu "status do terminal" no servidor para essa conta técnica com a mesma aparência de se nenhuma redefinição de conexão tivesse acontecido.
Eu queria entender a importância dos -RD
sinalizadores e na página de manual da tela que li (ênfase minha):
-D -R
Anexe aqui e agora. Em detalhes, isso significa: Se uma sessão estiver em execução, reconecte. Se necessário, desconecte e faça logout remotamente primeiro. Se não estava em execução, crie-o e notifique o usuário. Este é o favorito do autor.
Eu tentei pesquisar na web por logout remotely screen
, o resultado principal relevante foi apenas https://www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/ , onde li sobre desanexação:
Desanexando uma tela
Apenas quando você deseja sair da sessão remota, mas deseja manter a sessão que você criou nessa máquina ativa, apenas o que você precisa fazer é desanexar a tela do terminal para que não tenha mais terminal de controle. Depois de fazer isso, você pode sair com segurança.
No SE, encontrei Como desconectar remotamente uma tela de outro terminal e https://askubuntu.com/questions/526972/remotely-log-out-of-graphical-gnome-session , mas essas são outras perguntas específicas.
Eu tentei ler o wiki sobre como fazer login, sair etc, mas ainda não está claro. Em qual sessão posso sair remotamente? Estou executando screen
no servidor... Talvez esses sinalizadores sejam irrelevantes no meu caso de uso específico? Qual é o caso de uso mais comum para -RD
(logout remoto)?
Quando você executa
screen
no servidor, na verdade você tem duas sessões de terminal ao mesmo tempo: a primeira com a qual você fez o SSH e uma segunda "local" gerenciada peloscreen
comando. Se a primeira sessão for encerrada por qualquer motivo sem sairscreen
corretamente primeiro, essas duas sessões serão automaticamente separadas uma da outra e, quando você estabelecer uma nova sessão SSH,screen
permitirá que você se reconecte à segunda sessão existente.Se o tempo limite que está cortando suas conexões for algo como um firewall cortando uma conexão existente por inatividade, o problema é que o firewall pode não ter um método para sinalizar o corte para qualquer extremidade da conexão, até o final em question tenta enviar algo pela conexão que foi cortada.
Portanto, se o firewall cortar a conexão SSH e você inserir um único caractere na conexão SSH, o firewall enviará de volta um TCP Reset para o cliente SSH e você verá que a conexão foi cortada. Mas o lado do servidor SSH não está necessariamente ciente disso: se o servidor não tentou enviar nada para você, ele ainda pode estar lá, esperando por qualquer entrada sua, em uma conexão TCP que é -até o servidor sabe- ainda conectado, mas ocioso.
Nesse caso em particular, você precisará da
-D
opçãoscreen -DR
para extrair ascreen
sessão da sessão SSH antiga, mesmoscreen
que ela ainda esteja conectada.Como efeito colateral, isso fará com que o servidor tente enviar a saída (a mensagem "desconectada" de
screen
, e um novo prompt de shell) na sessão SSH inicial e cortada, o firewall enviará um TCP Reset de volta e, portanto, osshd
lado do servidor finalmente obterá as informações de que a antiga conexão SSH foi interrompida no nível da rede e a limpará.Mas se o que está causando o tempo limite da sua sessão SSH é algo no servidor que está fazendo com que sua primeira sessão SSH termine, por exemplo, o administrador do servidor definindo
ClientAliveCountMax
como 0sshd_config
eClientAliveInterval
para algum valor diferente de zero como um hack para obter uma espécie de tempo limite de inatividade desshd
, sua antiga sessão SSH será totalmente desconectada e ascreen
sessão já estará esperando por você em um estado já separado. Nesse caso,screen -R
bastaria reconectar-se a ele... mas, além disso, especificar a-D
opção não fará mal neste caso.A propósito, abusar das configurações
ClientAliveInterval
e dessa maneira é uma maneira pouco confiável de configurar um tempo limite de inatividade do usuário, pois o lado do cliente pode contornar isso sem saber que está fazendo isso . Isso ocorre porque se trata de monitorar a atividade no nível da conexão SSH, não a atividade real do usuário.ClientAliveCountMax
sshd_config
ClientAliveInterval
Se o usuário do cliente SSH estiver enfrentando problemas de tempo limite de rede, ele poderá definir
ServerAliveInterval
em seu~/.ssh/config
(ou uma configuração equivalente em um cliente não OpenSSH). Se oServerAliveInterval
tempo limite de inatividade de conexão do firewall for menor que o do cliente, isso fará com que o cliente SSH envie automaticamente um SSH criptografado "você ainda está aí?" pacote em inatividade, esshd
o servidor responderia a ele, redefinindo os temporizadores de inatividade no firewall.Mas definir um lado do cliente
ServerAliveInterval
com um valor de tempo limite mais curto também faria com que o servidor nunca alcançasse oClientAliveInterval
tempo limite enquanto a conexão SSH estivesse realmente funcionando, anulando o suposto "tempo limite de inatividade do usuário".Infelizmente, alguns padrões de proteção de segurança parecem ter incorporado esse
ClientAliveInterval
hack de tempo limite de inatividade do usuário baseado em e, portanto, alguns auditores de segurança podem exigi-lo, mesmo que não seja realmente adequado para sua suposta finalidade.