Passar um túnel HTTP CONNECT estabelecido para o Paramiko
Ligue o Paramiko através de uma rota HTTP CONNECT autorizada, mantendo a verificação da chave de anfitrião SSH.
Depois de um auxiliar HTTP CONNECT devolver um túnel ao servidor SSH pretendido, entregue esse fluxo ao Paramiko:
with paramiko.SSHClient() as client:
client.load_system_host_keys()
client.connect('ssh.example.com',
username='operator',
sock=tunnel,
banner_timeout=10,
auth_timeout=10)
# Use the verified SSH connection.Substitua o anfitrião de exemplo e carregue os dados known-hosts corretos da implementação. O tunnel já deve conduzir a esse mesmo servidor. O nome de anfitrião passado ao connect identifica a chave de anfitrião SSH, não o proxy.
A interface sock aceita um socket aberto ou um objeto semelhante a socket. Não negoceia HTTP por si. Antes de o devolver, o conector deve:
- Ligar-se ao proxy e enviar um pedido CONNECT válido para o destino.
- Concluir qualquer autenticação de proxy suportada e validar um estado de túnel bem-sucedido.
- Ler toda a secção de cabeçalhos do proxy, tratando leituras parciais e preservando os bytes além do limite.
- Limitar a configuração e fechar os sockets rejeitados/com erro através do seu caminho de limpeza.
Utilize um conector mantido para esse trabalho. Procurar uma frase de sucesso em inglês num único buffer de receção perde linhas de estado divididas, texto de motivo variável e cabeçalhos incompletos. Uma ligação TCP de proxy bem-sucedida não é o túnel SSH aceite.
O proxy tem de permitir a porta SSH pedida; a permissão de navegação web não estabelece acesso CONNECT à porta 22. Um 407 ocorre antes do início de sessão SSH, enquanto uma falha de conta SSH ocorre depois do túnel. Mantenha essas contas separadas.
Feche o cliente SSH e os recursos detidos pelo conector quando terminar. O facto de uma tarefa parar as suas leituras não fecha, por si só, uma ligação ativa.