web-dev-qa-db-fra.com

ssh -L transfère plusieurs ports

Je suis en train de lancer un tas de:

Sudo ssh -L PORT:IP:PORT root@IP

où IP est la cible d'une machine sécurisée et PORT représente les ports que je transfère.

C'est parce que j'utilise beaucoup d'applications auxquelles je ne peux pas accéder sans ce transfert. Après cela, je peux accéder via localhost:PORT.

Le problème principal est apparu maintenant que j'ai 4 ports à transférer.

Ma solution consiste à ouvrir 4 shells et à consulter constamment mon historique pour rechercher les ports à transférer, etc., puis à exécuter cette commande - une dans chaque shell (saisie de mots de passe, etc.).

Si seulement je pouvais faire quelque chose comme:

Sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

alors cela aiderait déjà vraiment.

Y a-t-il un moyen de faciliter cela?

85
PascalVKooten

Utilisez le -L à nouveau dans la même commande. Chaque fois avec des ports différents.

141
NaN

Exactement ce que NaN a répondu, vous spécifiez plusieurs arguments en -L. Je fais ça tout le temps. Voici un exemple de transfert multi-ports:

ssh remote-Host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

Remarque : Identique à -L localhost:8822:REMOTE_IP_1:22 si vous ne spécifiez pas localhost.

Maintenant, avec cela, vous pouvez maintenant (depuis un autre terminal) faire:

ssh localhost -p 8822

se connecter à REMOTE_IP_1 sur le port 22

et pareillement

ssh localhost -p 9922

se connecter à REMOTE_IP_2 sur le port 22

Bien sûr, rien ne vous empêche de le résumer dans un script ou de l’automatiser si vous avez plusieurs hôtes/ports à transférer et certains spécifiques.

J'espère que cela t'aides.

68
jbchichoko

Vous pouvez utiliser la fonction bash suivante (ajoutez-la simplement à votre ~/.bashrc):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

Exemple d'utilisation:

pfwd hostname {6000..6009}
18
Yuval Atzmon

jbchichoko et Yuval ont donné des solutions viables. Mais la réponse de jbchichoko n’est pas une réponse flexible en tant que fonction et les tunnels ouverts par la réponse de yuval ne peuvent pas être fermés par ctrl+c parce qu'il fonctionne en arrière-plan. Je donne ma solution ci-dessous en résolvant les deux défauts:

Définition d'une fonction dans ~/.bashrc ou ~/.zshrc:

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

Exemple d'utilisation de la fonction:

fsshmap 6000 6010 hostname

Résultat de cet exemple:

Vous pouvez accéder à 127.0.0.1:16000~16009 le même que hostname:6000~6009

7
Tom

Pour les personnes qui transfèrent plusieurs ports via le même hôte , vous pouvez configurer quelque chose comme ceci dans leur ~/.ssh/config

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

et cela devient un simple ssh all-port-forwards un moyen.

2
RajaRaviVarma

L'un des avantages de la connexion à un serveur avec transfert de port est de faciliter l'utilisation de Jupyter Notebook. Ce lien fournit une excellente description de la procédure. Ici, je voudrais faire un résumé et un élargissement pour que vous puissiez tous vous y référer.

Situation 1. Connectez-vous à partir d’une machine locale nommée Host-A (votre propre ordinateur portable, par exemple) à une machine distante nommée Host-B.

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

Ensuite, vous pouvez ouvrir un navigateur et entrer: http: // localhost: port_A / pour effectuer votre travail sur l’hôte-B, mais voyez-le dans l’hôte-A.

Situation 2. Connectez-vous à partir d’une machine locale nommée Host-A (par exemple, votre propre ordinateur portable) à une machine de connexion distante nommée Host-B, puis connectez-vous à la machine de travail distante nommée Host-C. C’est généralement le cas de la plupart des serveurs d’analyse au sein des universités et peut être obtenu en utilisant deux ssh -L connecté avec -t.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

Ensuite, vous pouvez ouvrir un navigateur et entrer: http: // localhost: port_A / pour effectuer votre travail sur l’hôte C, mais consultez-le dans l’hôte A.

Situation 3. Connectez-vous à partir d'une machine locale nommée Host-A (par exemple, votre propre ordinateur portable) à une machine de connexion distante nommée Host-B, puis connectez-vous à la machine de travail distante nommée Host-C, puis connectez-vous à la machine de travail distante Host- RÉ. Ce n'est généralement pas le cas mais peut arriver de temps en temps. C'est une extension de la situation 2 et la même logique peut être appliquée sur plusieurs machines.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

Ensuite, vous pouvez ouvrir un navigateur et entrer: http: // localhost: port_A / pour effectuer votre travail sur l’hôte D, mais voyez-le dans l’hôte A.

Notez que port_A, port_B, port_C, port_D peuvent être des nombres aléatoires, à l'exception des numéros de port courants répertoriés ici . Dans la situation 1, port_A et port_B peuvent être identiques pour simplifier la procédure.

1
Fei Yao

L'un des avantages de la connexion à un serveur avec transfert de port est de faciliter l'utilisation de Jupyter Notebook. Ce lien fournit une excellente description de la procédure. Ici, je voudrais faire un résumé et un élargissement pour que vous puissiez tous vous y référer.

Situation 1. Connectez-vous à partir d’une machine locale nommée Host-A (votre propre ordinateur portable, par exemple) à une machine distante nommée Host-B.

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

Ensuite, vous pouvez ouvrir un navigateur et entrer: http: // localhost: port_A / pour effectuer votre travail sur l’hôte-B, mais voyez-le dans l’hôte-A.

Situation 2. Connectez-vous à partir d’une machine locale nommée Host-A (par exemple, votre propre ordinateur portable) à une machine de connexion distante nommée Host-B, puis connectez-vous à la machine de travail distante nommée Host-C. C’est généralement le cas de la plupart des serveurs d’analyse au sein des universités et peut être obtenu en utilisant deux ssh -L connecté avec -t.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

Ensuite, vous pouvez ouvrir un navigateur et entrer: http: // localhost: port_A / pour effectuer votre travail sur l’hôte C, mais consultez-le dans l’hôte A.

Situation 3. Connectez-vous à partir d'une machine locale nommée Host-A (par exemple, votre propre ordinateur portable) à une machine de connexion distante nommée Host-B, puis connectez-vous à la machine de travail distante nommée Host-C, puis connectez-vous à la machine de travail distante Host- RÉ. Ce n'est généralement pas le cas mais peut arriver de temps en temps. C'est une extension de la situation 2 et la même logique peut être appliquée sur plusieurs machines.

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

Ensuite, vous pouvez ouvrir un navigateur et entrer: http: // localhost: port_A / pour effectuer votre travail sur l’hôte D, mais voyez-le dans l’hôte A.

Notez que port_A, port_B, port_C, port_D peuvent être des nombres aléatoires, à l'exception des numéros de port courants répertoriés ici . Dans la situation 1, port_A et port_B peuvent être identiques pour simplifier la procédure.

0
Fei Yao

J'ai développé loco pour obtenir de l'aide pour le transfert SSH. Il peut être utilisé pour partager les ports 5000 et 7000 sur des ports distants localement situés sur les mêmes ports:

pip install loco

loco listen SSHINFO -r 5000 -r 7000
0
PascalVKooten