Primeiro, aqui está uma solução melhor que a fornecida no link fornecido na pergunta, pois esse novo não tem dependências de ferramentas externas como netcat
:
Host C
ProxyCommand ssh -W %h:%p B
no .ssh/config
do host A. Os usuários não precisam ter conhecimentos específicos de informática, eles só precisam ser informados. Qualquer pessoa pode colocar 2 linhas em um arquivo.
Se isso for realmente um problema, um comando específico pode ser adicionado ao arquivo .ssh/authorized_keys
no host B:
command="ssh C" ssh-rsa <key_of_the_user_of_host_A>
Portanto, quando o usuário usa ssh B
, em vez de iniciar um shell interativo no host B, o servidor SSH no host B executará automaticamente ssh C
(consulte a página do manual sshd (8)). No entanto, isso impedirá qualquer registro direto no host B e qualquer outro comando SSH, como /bin/bash -l
in ssh -t B /bin/bash -l
, será ignorado. Como a man page diz:
The command originally supplied by the client is available in the SSH_ORIGINAL_COMMAND environment variable.
Portanto, pode haver algum espaço para melhoria, seja para executar o comando fornecido no host C, ou para executá-lo no host B sob algumas condições (também tenha cuidado com aspas, se considerar essa variável de ambiente). Um exemplo é:
command="ssh ${TTY:+-t} C ${SSH_ORIGINAL_COMMAND-$SHELL}" ssh-rsa <key>
que executa o comando fornecido no host C se houver um (e iniciará um shell interativo como de costume se não houver). Com isso, scp
pode funcionar, mas na minha máquina ele falha com erros de "Permissão negada". Mas rsync
funciona bem e pode ser usado como um substituto para scp
se você tiver problemas com isso.
Importante. Não escolha uma solução que consista em abrir uma porta (necessariamente não privilegiada) no host B. Isso não funcionará porque as conexões com essas portas são bloqueadas pelo firewall do servidor. Universidade, ou isso introduzirá problemas de segurança, pois isso permitirá que os usuários ignorem a autenticação (com coisas como rastreamento) no host B através do servidor SSH na porta 22.