GNU/Linux >> Tutoriels Linux >  >> Linux

Passer des variables dans la commande ssh distante

La liste des variables d'environnement acceptées sur SSHD inclut par défaut LC_* . Ainsi :

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3

Les variables entre guillemets simples ne sont pas évaluées. Utilisez des guillemets :

ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"

Le shell développera les variables entre guillemets doubles, mais pas entre guillemets simples. Cela changera dans votre chaîne désirée avant d'être passé au ssh commande.


Si vous utilisez

ssh [email protected] "~/tools/run_pvt.pl $BUILD_NUMBER"

au lieu de

ssh [email protected] '~/tools/run_pvt.pl $BUILD_NUMBER'

votre shell interpolera le $BUILD_NUMBER avant d'envoyer la chaîne de commande à l'hôte distant.


(Cette réponse peut sembler inutilement compliquée, mais elle est facilement extensible et robuste en ce qui concerne les espaces et les caractères spéciaux, pour autant que je sache.)

Vous pouvez alimenter les données directement via l'entrée standard du ssh commande et read que depuis l'emplacement distant.

Dans l'exemple suivant,

  1. un tableau indexé est rempli (pour plus de commodité) avec les noms des variables dont vous souhaitez récupérer les valeurs du côté distant.
  2. Pour chacune de ces variables, nous donnons à ssh une ligne terminée par un caractère nul donnant le nom et la valeur de la variable.
  3. Dans le shh commande elle-même, nous parcourons ces lignes pour initialiser les variables requises.
# Initialize examples of variables.
# The first one even contains whitespace and a newline.
readonly FOO=$'apjlljs ailsi \n ajlls\t éjij'
readonly BAR=ygnàgyààynygbjrbjrb

# Make a list of what you want to pass through SSH.
# (The “unset” is just in case someone exported
# an associative array with this name.)
unset -v VAR_NAMES
readonly VAR_NAMES=(
    FOO
    BAR
)

for name in "${VAR_NAMES[@]}"
do
    printf '%s %s\0' "$name" "${!name}"
done | ssh [email protected] '
    while read -rd '"''"' name value
    do
        export "$name"="$value"
    done

    # Check
    printf "FOO = [%q]; BAR = [%q]\n" "$FOO" "$BAR"
'

Sortie :

FOO = [$'apjlljs ailsi \n ajlls\t éjij']; BAR = [ygnàgyààynygbjrbjrb]

Si vous n'avez pas besoin de export ceux-ci, vous devriez pouvoir utiliser declare au lieu de export .

Une version vraiment simplifiée (si vous n'avez pas besoin d'extensibilité, si vous avez une seule variable à traiter, etc.) ressemblerait à :

$ ssh [email protected] 'read foo' <<< "$foo"

Linux
  1. Exécuter la commande dans le terminal actif distant ?

  2. Ssh - Passer des mots de passe à un script ?

  3. Autoriser l'accès Ssh à distance ?

  4. Comment connecter un hôte distant à l'aide de la commande ssh

  5. envsubst :commande introuvable

Commande SSH

Qu'est-ce que la commande SSH et comment utiliser SSH pour se connecter à un serveur distant

Comment transmettre un mot de passe à la commande SSH sous Linux

Comment utiliser SSH pour se connecter à un serveur distant

Utilisation de la commande SSH dans les systèmes Linux/Unix

Comment :Administration à distance de FreeBSD