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


13

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 coloco na configuração acima para não iniciar um shell?


+1 para uma boa pergunta que me fez pensar em como fazer o tunelamento para coisas aleatórias mais rapidamente (eu não faço isso com frequência suficiente para lembrar os comutadores, mas eu geralmente uso as mesmas portas, é apenas o host que muda).
WEBjuju

Respostas:


22

Então, ssh.cpara o OpenSSH 7.6p1, encontramos

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

assim -N acontece com duas coisas:

  • o no_shell_flagúnico aparece em ssh.ce está ativado apenas para o -Wou-N opções , caso contrário, aparece em alguns blocos lógicos relacionados à ControlPersistverificação de sanidade envolvendo garfos em segundo plano. Não vejo como uma opção possa defini-la diretamente.
  • de acordo com readconf.cas request_ttycorresponde à RequestTTYopção detalhado nassh_config(5) .

Isso deixa (além de corrigir o OpenSSH do macaco e recompilar ou pedir uma ssh_configopção para alternar no_shell_flagcom ...) algo como:

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

O que tecnicamente inicia um shell, mas esse shell deve substituir-se imediatamente pelo catprograma que deve bloquear, permitindo que a porta a frente seja usada enquanto isso. caté portátil, mas consumirá entrada (se houver) ou poderá falhar (se a entrada padrão estiver fechada). Outra opção seria executar algo que apenas bloqueia .


1
+1 por fazê-lo dentro de .ssh/config... bem feito!
WEBjuju

Pesquisa impressionante sobre esta resposta! Obrigado!
amarelo-suave

Eu prefiro RemoteCommand exec sleep infinity.
Thomas

3

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

Pode-se também considerar o uso de uma função com padrões para acelerar outros comandos de encapsulamento (especialmente se o encapsulamento não mudar, mas apenas 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 disso em uso: sem argumentos, 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, execute 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 passo para um novo host / túnel:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345

0

Um comando remoto mais útil baseado na resposta do @ thrig:

Host someHost
Hostname 1.2.3.4
LocalForward 15673 localhost:15672
RequestTTY no
RemoteCommand bash -c 'echo "Listening on port 15673"; read -r -d '' _'

O read -r -d '' _irá bloquear a conexão até que o usuário pressionar control+c.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.