Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 19 mars 2017

Transmettre une variable d'environnement à une connexion ssh

J'ai besoin pour faire des tests de connaitre l'adresse IP de l'hôte qui héberge une machine virtuelle.

Comme je me connecte à cette machine virtuelle par ssh, je vais lui transmettre cette adresse IP via une variable d'environnement.

Pour cela, j'ai besoin de spécifier le nom de la variable d'environnement coté hôte. On l'appelera HOST_IP.

Cela peut se faire de deux façons:

Dans le fichier /etc/ssh/ssh_config via la directive:

SendEnv HOST_IP

En fait on changera la ligne existante:

SendEnv LANG LC_*

en

SendEnv LANG LC_* HOST_IP

On peut aussi spécifier le nom de la variable sur la ligne de commande ssh:

ssh -o SendEnv=HOST_IP user@machine...

Pour que cela fonctionne, il faut maintenant que la machine virtuelle accepte cette variable d'environnement.

Pour cela on changera dans le fichier /etc/ssh/sshd_config de la VM la ligne:

AcceptEnv LANG LC_*

en

AcceptEnv LANG LC_* HOST_IP

Et on redémarre le serveur ssh.

samedi 18 avril 2015

Bien spécifier l'interpréteur de vos scripts Shell avec le Shebang

Considérons un script Shell très simple:

# script.sh

echo "Running script $0 with $SHELL"

Lors de son exécution en lançant ./script.sh, j'obtiens:

Running script ./script.sh with /bin/bash

Le script a été lançé avec l'interpréteur bash puisqu'il s'agit du Shell défini pour mon utilisateur.

Si maintenant, j'ajoute la ligne suivante au tout début de mon script:

#!/bin/ksh

J'obtiens à l'éxécution le message suivant:

bash: ./script.sh : /bin/ksh : mauvais interpréteur: Aucun fichier ou dossier de ce type

Pourquoi ? J'ai demandé au Shell bash, qui est mon Shell courant, de lancer le script avec le Korn Shell (/bin/ksh) qui n'est pas installé sur ma machine, et j'ai donc un message d'erreur.

Cette première ligne ajoutée s'appelle un "Shebang" et permet donc de changer d'interpréteur de commande localement dans un script. Le Shebang se compose donc des caractères "dièse" puis "point d'exclamation" suivis du chemin d'accès à l'interpréteur de commandes.

Notez que ce chemin doit être complet, ce qui est peut être gênant si nos scripts Shell doivent fonctionner sur des machines avec des Shells installés ailleurs que dans /bin. Même si c'est rare, cela peut arriver.

Maintenant, laissons tomber ksh puisqu'il n'est pas installé et considérons que notre script doit être exécuté avec bash.

Il y a un moyen de s'affranchir de ce chemin complet de l'interpréteur: il faut utiliser la commande env qui va utiliser la variable d'environnement PATH pour trouver le chemin de bash. On change donc le script comme suit:

#!/usr/bin/env bash
# script.sh

echo "Running script $0 with $SHELL"

L'interpréteur est bien trouvé parce que par défaut, le chemin /bin se trouve dans le PATH.

mardi 8 avril 2014

bash: positionner une variable d'environnement pour un seul appel de commande

Vous connaissez probablement la syntaxe de bash qui permet d'éxécuter une commande si la commande précédente a réussie:

command1 && command2

ou celle qui permet d'éxécuter une commande en cas d'échec d'une première commande:

command1 || command2

En Shell on peut aussi lancer deux commandes successivement et ce indépendamment du code retour de la première commande:

command1; command2

Mais connaissez-vous la syntaxe suivante de bash:

TZ="Europe/London" date

Cette syntaxe particulière positionne la variable d'environnement TZ à la valeur "Europe/London" et exécute ensuite la commande date avec cette variable d'environnement positionnée. Cela a évidemment l'effet d'afficher la date qu'il est à Londres.

On aurait pu aussi procéder comme ceci:

export TZ="Europe/London" && date

Mais dans ce cas l'export fait que la variable d'environnement TZ "persiste" dans le Shell courant. Ce qui fait que l'heure affichée désormais dans ce terminal sera celle de Londres !

Alors qu'avec la première syntaxe, la variable TZ n'est positionnée que pour la commande qui suit ; la commande date.

Moralité, la syntaxe:

TZ="<Timezone>" date

permet d'obtenir la date dans un autre fuseau horaire que le notre sans changer pour autant notre fuseau horaire.

Enfin, précisons pour finir que la commande date regorge de facilités pour convertir une date en une autre et que la lecture de sa man page est tout a fait recommandée.