Por que não simplesmente usar% h na opção ControlPath do OpenSSH ssh?

12

Por que o "ssh_config (5)" manpages recomendam que a ControlPathopção deve conter pelo menos as %h, %pe %respaços reservados, a fim de identificar exclusivamente cada conexão compartilhada?

Eu pensei que várias sessões deveriam compartilhar o mesmo soquete com uma conexão com o mesmo host. Não faria sentido ter uma definição simples, como:

ControlPath ~/.cache/ssh/mux/%h

Em vez de algo como:

ControlPath ~/.cache/ssh/mux/%r@%h:%p

No meu entendimento com a primeira definição, uma conexão é compartilhada entre várias sessões com diferentes usuários remotos, no mesmo host remoto, em portas remotas diferentes.

Eu quero ter a primeira definição na seção padrão do host para que seja suficiente dizer ssh -o ControlMaster=no.

Desejo compartilhar a conexão com o mesmo host remoto entre todas as sessões iniciadas pelo mesmo usuário local, independentemente do usuário remoto e da porta remota. O soquete do cliente mestre deve residir abaixo do diretório inicial do usuário local.

Tim Friske
fonte
"Quero compartilhar a conexão com o mesmo host remoto entre todas as sessões iniciadas pelo mesmo usuário local, independentemente do usuário remoto e da porta remota." Resposta curta: você não pode . Eu adicionei um tipo de explicação na minha resposta.
goldilocks

Respostas:

12

"Eu pensei que várias sessões deveriam compartilhar o mesmo soquete com uma conexão com o mesmo host."

Eles podem. No entanto, observe que, se você se conectar a um host usando uma conexão existente via ControlPath, independentemente de qual usuário você deseja fazer login, será conectado como o usuário original da conexão. Por exemplo, sem conexão estabelecida com "algum lugar":

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere

Esta sessão é bob @ algures.

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere

Esta sessão também será bob @ algures, porque você usou o mesmo ControlPath e set ControlMaster=no; se ControlMaster=yes, você efetuaria login como sue, mas o ssh terá ignorado seu argumento ControlPath, como está implícito em man ssh_config:

Sessões adicionais podem se conectar a esse soquete usando o mesmo ControlPath com o ControlMaster definido como 'no' .

Como prova disso, se ControlMaster=yesem ambos os casos, quando bob sair do soquete ControlPath, ~/.ssh/somewhereele desaparecerá mesmo que a sessão "sue" ainda esteja em execução, o que significa que a sessão de processamento nunca usou esse soquete .

Portanto, se você deseja usar a mesma conexão, tudo %hbem, mas tenha cuidado para não compartilhar uma conexão como vários usuários remotos diferentes - o ssh não permitirá.

Cachinhos Dourados
fonte
Muito obrigado. Antes da sua resposta elaborada, eu perdi o fato de que não é possível compartilhar o soquete mestre de um cliente entre diferentes usuários remotos sem ao mesmo tempo o segundo usuário remoto assumir a identidade do primeiro.
Tim Friske
5

Você pode ter vários usuários e várias portas em uso até para o mesmo servidor. Eu mesmo, conecto-me a centenas de sistemas nas intranets da empresa, a maioria possui vários usuários com diferentes funções ou servidores de aplicativos. O acesso ao usuário A é muito diferente do acesso ao usuárioB, e a conexão principal precisaria ser diferente. Mais sucintamente, se você fosse executar:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA

Como você pode ver, não temos uma sessão do OpenSSH com o usuárioB, mas a original com o usuárioA. Isso significa que o diretório inicial, as permissões e até a autenticação em si não é o esperado. Usando isso, se você tentar excluir um arquivo no diretório do usuárioB, a) poderá ser o arquivo errado eb) permissões incorretas.

Se você nunca estará se conectando a mais de um único usuário em qualquer servidor usando uma única porta, sim, usar %hpoderá ser suficiente. No seu ~/.ssh/configarquivo, você deseja usar:

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes

Com a ControlPersistopção, a conexão principal permanece aberta em segundo plano até ser interrompida ou finalizada comssh -O exit . Este é um bom recurso de configurar e esquecer.

Mas se houver qualquer possibilidade de se conectar a mais de um usuário em qualquer um host, então você quer algo mais seguro:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Arcege
fonte
Eu ainda estou confuso. Tentei esclarecer o cenário de configuração e minha intenção nos parágrafos "Eu quero". Alguém de vocês poderia responder minha pergunta com mais precisão com essas informações adicionais?
precisa saber é o seguinte