Aqui está uma maneira tola de fazer isso, que realmente funciona bem apenas com autenticação de chave pública:
Primeiro, verifique se sua máquina local tem nc
.
Em segundo lugar, ainda em sua máquina local, faça um script (eu o chamarei connect-to-server
) e coloque-o em um lugar que seu ${PATH}
saiba sobre *:
#!/bin/sh
# connect-to-server
ssh -q server-hostname "touch .yourname" </dev/null >/dev/null 2>&1
nc server-hostname 22
Em seguida, modifique o .bashrc
no sistema remoto para incluir em algum lugar:
# partial .bashrc
if [ -f "${HOME}/.yourname" ]; then
rm "${HOME}/.yourname"
set -o vi
fi
Por fim, de volta à sua máquina local, edite ~/.ssh/config
para adicionar:
# partial ssh config
Host serverNickname
Hostname server-hostname
ProxyCommand connect-to-server
Desvantagens dessa abordagem (e porque eu chamo de bobo):
- Se houver um comando de proxy real necessário, ele se tornará mais complicado.
- Se outra pessoa fizer login ao mesmo tempo, há uma chance de que o arquivo
.yourname
ainda não tenha sido excluído. Nesse caso, ele também recebe oset -o vi
. - Mais importante ainda, se você usar
ssh serverNickname command
, entãocommand
será executado, mas (como.bashrc
nunca é originado) o arquivo.yourname
permanece, por isso seria educado ter um segundo alias em seu ssh config que não usa o pseudo-proxy.
Na verdade, o único desta abordagem é que seu comando ssh
não precisa receber argumentos extras.
* Se você não quiser alterar nada em sistemas remotos, aqui está um pseudo-proxy alternativo que cria um .bashrc
:
#!/bin/sh
# connect-to-server
ssh -q server-hostname 'ln .bashrc .bashrc.real; cat .bashrc.real <(printf "set -o vi; ln -f .bashrc.real .bashrc\n") >.bashrc.yourname; ln -f .bashrc.yourname .bashrc' </dev/null >/dev/null 2>&1
nc server-hostname 22
Isso tem as mesmas desvantagens do outro método, portanto você ainda deseja um segundo alias na configuração ssh
que não chame o pseudo-proxy.