# Boucle des options dans une commande

**URL:** <https://www.debian-fr.org/t/boucle-des-options-dans-une-commande/54873>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 1:17 UTC](https://www.debian-fr.org/t/boucle-des-options-dans-une-commande/54873 "2016-02-21T13:17:09Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 1:17 UTC](https://www.debian-fr.org/t/boucle-des-options-dans-une-commande/54873/1 "2016-02-21T13:17:09Z")

</div>

Bonsoir,

Je tente ma chance dans le coin programmation.  
Sur l’un des réseaux que j’administre, vnc est installé partout et j’y accède via un tunnel ssh.  
Le problème est que je n’accède qu’à un seul ordi à la fois, et j’aimerais bénéficier d’un tunnel pour chaque ordi d’un coup.

Pour mieux comprendre, la commande actuelle nettoyée du superflu est du type :

```auto

```

Donc en faisant un :

```auto

```

et en lançant un client vnc en localhost sur le port 5980, je peux administrer en graphique la machine 192.168.153.6, mais je dois relancer le tunnel ssh pour une autre.

Ma première question est donc : est-il possible, pour une liste d’ip du réseau distant du type 192.168.1.NOMBRE, de rediriger dans le tunnel les ports 5900 de ces machines vers des ports 10000 + NOMBRE de ma machine locale ? Par exemple à l’aide d’une boucle ?

Merci d’avance 😉

---

<div class="post-metadata">

**Author:** ![iruau](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/i/b5a626/32.png) [@iruau](https://www.debian-fr.org/u/iruau)\
**Post date:** [Février 21, 2016, 1:17 UTC](https://www.debian-fr.org/t/boucle-des-options-dans-une-commande/54873/2 "2016-02-21T13:17:13Z")

</div>

Avant de répondre spécifiquement à ta question, il faut quand même savoir que les solutions de type VPN sont plus adaptées que le port forwarding pour faire ce que tu veux. Si tu ne veux/peux pas installer OpenVPN sur ton serveur, tu peux toujours faire du [VPN sur SSH](http://bodhizazen.net/Tutorials/VPN-Over-SSH) (plus exactement, un tunnel IP qui fonctionne comme un VPN). Dans les deux cas ça te permettrait d’accéder à l’ensemble du réseau sans avoir à faire de port forwarding individuellement.

Concernant ta demande : rien n’empêche de mettre plusieurs fois l’option -L sur une même ligne de commandes. Il suffit donc de construire la liste d’arguments en la mettant dans une variable, puis d’utiliser cette variable pour lancer SSH :

`FORWARDING_ARGS="-L local1:ip1:port1 -L local2:ip2:port2 ..."
ssh user@ip:port ${FORWARDING_ARGS}`  
Par exemple en bash (pour faciliter les calculs arithmétiques et les regex ; en dash/sh ça serait un peu plus chiant à faire) :

[code]#!/bin/bash

### variables à personnaliser

LISTE\_IP="ip1 ip2 ip3"  
PORT\_LOCAL\_BASE="10000"  
PORT\_DISTANT="5900"  
CONNEXION\_ARGS=“user@ip:port -i ~/.ssh/identité -N …”

### fin des variables

# construire la liste de port-forwardings

FORWARDING\_ARGS=""  
for IP in ${LISTE\_IP}; do

# extraire le dernier composant de l’ip

if [[“${IP}” =~ .([0-9]+)$ ]]; then  
# calculer le port local  
let PORT\_LOCAL="${PORT\_LOCAL\_BASE} + ${BASH\_REMATCH[1]}"  
# ajouter le port-forwarding à la liste  
FORWARDING\_ARGS="${FORWARDING\_ARGS} -L ${PORT\_LOCAL}:${IP}:${PORT\_DISTANT}"  
fi  
done

# lancer ssh

ssh ${CONNEXION\_ARGS} ${FORWARDING\_ARGS}[/code]

---

<div class="post-metadata">

**Author:** ![Arnaud](https://www.debian-fr.org/user_avatar/www.debian-fr.org/arnaud/32/4098_2.png) [@Arnaud](https://www.debian-fr.org/u/Arnaud)\
**Post date:** [Février 21, 2016, 1:17 UTC](https://www.debian-fr.org/t/boucle-des-options-dans-une-commande/54873/3 "2016-02-21T13:17:19Z")

</div>

Merci pour la réponse 😉

> [@iruau](#):
>
> Avant de répondre spécifiquement à ta question, il faut quand même savoir que les solutions de type VPN sont plus adaptées que le port forwarding pour faire ce que tu veux. Si tu ne veux/peux pas installer OpenVPN sur ton serveur, tu peux toujours faire du [VPN sur SSH](http://bodhizazen.net/Tutorials/VPN-Over-SSH) (plus exactement, un tunnel IP qui fonctionne comme un VPN). Dans les deux cas ça te permettrait d’accéder à l’ensemble du réseau sans avoir à faire de port forwarding individuellement.

Je ne savais pas Openvpn est aussi installé, mais j’ai toujours eu ma préférence vers ssh.  
C’est l’occasion pour moi de se pencher un peu plus sur vpn.

[quote=«&nbsp;iruau&nbsp;»]

[code]#!/bin/bash

### variables à personnaliser

LISTE\_IP=«&nbsp;ip1 ip2 ip3&nbsp;»  
PORT\_LOCAL\_BASE=«&nbsp;10000&nbsp;»  
PORT\_DISTANT=«&nbsp;5900&nbsp;»  
CONNEXION\_ARGS=«&nbsp;user@ip:port -i ~/.ssh/identité -N …&nbsp;»

### fin des variables

# construire la liste de port-forwardings

FORWARDING\_ARGS=«&nbsp;&nbsp;»  
for IP in ${LISTE\_IP}; do

# extraire le dernier composant de l’ip

if [[«&nbsp;${IP}&nbsp;» =~ .([0-9]+)$ ]]; then  
# calculer le port local  
let PORT\_LOCAL=«&nbsp;${PORT\_LOCAL\_BASE} + ${BASH\_REMATCH[1]}&nbsp;»  
# ajouter le port-forwarding à la liste  
FORWARDING\_ARGS=«&nbsp;${FORWARDING\_ARGS} -L ${PORT\_LOCAL}:${IP}:${PORT\_DISTANT}&nbsp;»  
fi  
done

# lancer ssh

ssh ${CONNEXION\_ARGS} ${FORWARDING\_ARGS}[/code][/quote]

Je vais pouvoir regarder aussi de ce côté ce week-end, nickel ![:023](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")
