Quelle est l'option correspondante .ssh / config pour ssh -N

13

Je veux configurer un alias dans mon fichier de configuration qui a le même résultat que cette commande:

ssh -N devdb -L 1234:127.0.0.1:1234

Mon entrée .ssh / config pour devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Que dois-je mettre dans la configuration ci-dessus pour ne pas démarrer un shell?

mikeb
la source
+1 pour une bonne question qui m'a fait réfléchir sur la façon de rendre plus rapide le tunneling vers des choses aléatoires (je ne le fais pas assez souvent pour me souvenir des commutateurs, mais j'utilise généralement les mêmes ports, c'est uniquement l'hôte qui change).
WEBjuju
notaverb.com/setup
Monty Harder

Réponses:

22

Donc, ssh.cpour OpenSSH 7.6p1, nous trouvons

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

il en -Nva de même pour deux choses:

  • le no_shell_flagseul apparaît dans ssh.cet n'est activé que pour les options -Wou -N, sinon il apparaît dans certains blocs logiques liés à la ControlPersistvérification d'intégrité impliquant des fourches d'arrière-plan. Je ne vois pas comment une option pourrait la régler directement.
  • selon readconf.cle request_ttycorrespond à l' RequestTTYoption détaillée dans ssh_config(5).

Cela laisse (à part le singe patcher OpenSSH et recompiler, ou demander une ssh_configoption pour basculer no_shell_flagavec ...) quelque chose comme:

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

Ce qui techniquement démarre un shell mais ce shell devrait immédiatement se remplacer par le catprogramme qui devrait ensuite bloquer en permettant l'utilisation du port forward entre-temps. catest portable, mais consommera l'entrée (s'il y en a) ou pourrait échouer (si l'entrée standard est fermée). Une autre option serait d' exécuter quelque chose qui ne fait que bloquer .

branler
la source
1
+1 pour l'avoir fait en dedans .ssh/config... bravo!
WEBjuju
Recherche impressionnante sur cette réponse! Je vous remercie!
jaune moelleux
Je préfère RemoteCommand exec sleep infinity.
thomas
3

@thrig a la bonne réponse en fonction de votre désir de le faire uniquement dans .ssh/config

On pourrait également envisager d'utiliser une fonction avec des valeurs par défaut pour rendre d'autres commandes de tunnel rapides (surtout si le tunnel ne change pas mais seulement l'hôte).


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"
}

En voici trois exemples: sans argument, les valeurs par défaut spécifiées dans la fonction sont utilisées:

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

avec tunnel par défaut, exécuté sur un hôte différent:

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

avec les deux valeurs par défaut, exécutez une opération ponctuelle complète vers un nouvel hôte / tunnel:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345
WEBjuju
la source
0

Une commande à distance plus utile basée sur la réponse de @ 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 '' _'

Le read -r -d '' _bloque la connexion jusqu'à ce que l'utilisateur appuie sur control+c.

Tobias Sette
la source