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,
- 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.
- 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. - 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"