Qual é a opção correspondente .ssh / config para ssh -N

9

Eu quero configurar um alias no meu arquivo de configuração que tenha o mesmo resultado que este comando:

ssh -N devdb -L 1234:127.0.0.1:1234

Minha entrada .ssh / config para devdb :

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

O que eu coloco na configuração acima para não iniciar um shell?

    
por mikeb 14.02.2018 / 17:46

2 respostas

16

Então em ssh.c para o OpenSSH 7.6p1 encontramos

            case 'N':
                    no_shell_flag = 1;
                    options.request_tty = REQUEST_TTY_NO;

então -N faz duas coisas:

  • o no_shell_flag aparece apenas em ssh.c e é ativado apenas para as opções -W ou -N , caso contrário, ele aparece em alguns blocos lógicos relacionados a ControlPersist e verificação de integridade envolvendo os garfos de plano de fundo. Eu não vejo uma maneira que uma opção possa definir diretamente.
  • de acordo com readconf.c o request_tty corresponde à opção RequestTTY detalhada em ssh_config(5) .

Isso deixa (além do monkey patchear o OpenSSH e recompilar, ou pedir uma opção ssh_config para alternar no_shell_flag com ...) algo como:

Host devdb
 User someuser
 HostName the_hostname
 LocalForward 1234 127.0.0.1:1234
 RequestTTY no
 RemoteCommand cat

Que tecnicamente inicia um shell, mas esse shell deve substituir-se imediatamente com o programa cat , que deve então bloquear permitindo que o encaminhamento de porta seja usado enquanto isso. cat é portátil, mas consumirá entrada (se houver) ou poderá falhar (se a entrada padrão for fechada). Outra opção seria executar algo que apenas bloqueia .

    
por 14.02.2018 / 18:35
2

O @thrig tem a resposta certa com base no seu desejo de fazer isso somente dentro de .ssh/config

Também é possível considerar o uso de uma função com padrões para tornar outros comandos de túnel rápidos (especialmente se o túnel não mudar, mas somente o host).

sshn() {
  # set your desired host and port forwarding as default
  # and allow them to be passed in if you should need it

  host="${1:-devdb}"
  port="${2:-1234:127.0.0.1:1234}"

  # now all you have to do is 'sshn' and it will connect

  echo "executing ssh -N $host -L $port"
  ssh -N "$host" -L "$port"
}

Aqui estão três exemplos em uso: sem args os padrões especificados na função são usados:

$ sshn
executing -N devdb -L 1234:127.0.0.1:1234

com o padrão de túnel, executado em um host diferente:

$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234

com os dois padrões, execute um único completo em um novo host / túnel:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345
    
por 14.02.2018 / 18:42