Je veux pouvoir exécuter une commande depuis ma machine en utilisant ssh et passer par la variable d'environnement $BUILD_NUMBER
Voici ce que j'essaye:
ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
$BUILD_NUMBER
est défini sur la machine effectuant l'appel ssh et comme la variable n'existe pas sur l'hôte distant, elle n'est pas récupérée.
Comment transmettre la valeur de $BUILD_NUMBER
?
Réponses:
Si tu utilises
au lieu de
votre shell interpolera le
$BUILD_NUMBER
avant d'envoyer la chaîne de commande à l'hôte distant.la source
Les variables entre guillemets simples ne sont pas évaluées. Utilisez des guillemets doubles:
Le shell développera les variables entre guillemets, mais pas entre guillemets simples. Cela deviendra la chaîne souhaitée avant d'être passé à la
ssh
commande.la source
(Cette réponse peut sembler inutilement compliquée, mais elle est facilement extensible et robuste en ce qui concerne les espaces blancs et les caractères spéciaux, pour autant que je sache.)
Vous pouvez alimenter les données directement via l'entrée standard de la
ssh
commande etread
cela depuis l'emplacement distant.Dans l'exemple suivant,
ssh
une ligne terminée par un zéro donnant le nom et la valeur de la variable.shh
commande elle-même, nous parcourons ces lignes pour initialiser les variables requises.Production:
Si vous n'en avez pas besoin
export
, vous devriez pouvoir utiliser à ladeclare
place deexport
.Une version vraiment simplifiée (si vous n'avez pas besoin de l'extensibilité, avez une seule variable à traiter, etc.) ressemblerait à:
la source
La liste des variables d'environnement acceptées sur SSHD par défaut comprend
LC_*
. Donc:la source
Comme indiqué précédemment, vous n'avez pas besoin de définir la variable d'environnement sur l'hôte distant. Au lieu de cela, vous pouvez simplement effectuer la méta-expansion sur l'hôte local et transmettre la valeur à l'hôte distant.
Si vous voulez vraiment définir la variable d'environnement sur l'hôte distant et l'utiliser, vous pouvez utiliser le
env
programmeDans ce cas, c'est un peu exagéré, et notez
env BUILD_NUMBER=$BUILD_NUMBER
fait la méta-expansion sur l'hôte localBUILD_NUMBER
variable d'environnement distant sera utilisée parle shell distant
la source
Il est également possible de passer des variables d'environnement explicitement via ssh. Cela nécessite une configuration côté serveur, ce n'est donc pas une réponse universelle.
Dans mon cas, je voulais passer une clé de chiffrement du référentiel de sauvegarde à une commande sur le serveur de stockage de sauvegarde sans y avoir stocké cette clé, mais notez que toute variable d'environnement est visible dans
ps
! La solution de passer la clé sur stdin fonctionnerait également, mais je l'ai trouvée trop lourde. Dans tous les cas, voici comment passer une variable d'environnement via ssh:Sur le serveur, modifiez le
sshd_config
fichier, généralement/etc/ssh/sshd_config
et ajoutez uneAcceptEnv
directive correspondant aux variables que vous souhaitez transmettre. Voirman sshd_config
. Dans mon cas, je souhaite passer des variables à la sauvegarde borg, j'ai donc choisi:Maintenant, sur le client, utilisez l'
-o SendEnv
option pour envoyer des variables d'environnement. La ligne de commande suivante définit la variable d'environnementBORG_SECRET
, puis la marque pour qu'elle soit envoyée à la machine client (appeléebackup
). Ilprintenv
s'y exécute ensuite et filtre la sortie pour les variables BORG:la source
LC_*
les variables autorisées à envoyer, alors utilisez simplement$LC_TvE_foo
, ou$LC_BORG_SECRET
assurez-vous simplement de ne pas "heurter" une variable intégrée.Échappez à la variable pour accéder aux variables en dehors de la session ssh: ssh [email protected] "~ / tools / myScript.pl \ $ BUILD_NUMBER"
la source
'$FOO'
équivaut à"\$FOO"
. la question était "comment passer une variable shell avec SSH?". Comme déjà indiqué par @PatrickTrentin, ce n'est pas une réponse correcte carBUILD_NUMBER
la variable d'environnement n'est pas définie à distance.