J'ai deux machines, Host1 et Host2.
Je voudrais utiliser une variable d'environnement de Host2, à partir d'une commande scp de Host1. Par exemple, utilisez ce type de commande à partir de Host1:
scp file Host2@Host2_adress:$FOO
où $ FOO est défini dans Host2 en tant que chemin d'accès à un répertoire. Si j'utilise la commande ci-dessus, bash effectuera une recherche parmi les variables de Host1 et non de Host2.
Un exemple pratique consisterait à utiliser la variable $ HOME de Host2
Comment faire ?
Vous pouvez essayer quelque chose comme ça:
scp file Host2@Host2_address:$(ssh Host2@Host2_address 'printf $FOO')
Afin de résoudre la valeur de la variable $(ssh Host2@Host2_address 'printf $FOO')
, le shell exécute en interne la commande ssh Host2@Host2_address 'printf $FOO'
, et prend ce que cette commande imprime en tant que valeur de la variable, qui est ensuite substituée dans le scp
commande. Il est bien entendu évident que vous devez extraire la variable $FOO
de Host2, car Host1 ne le sait tout simplement pas. Une façon de le récupérer consiste à utiliser ssh
comme dans la commande ci-dessus.
Esprit:
Une sorte d’authentification par clé publique doit fonctionner pour que la commande inner ssh
fonctionne sans autre saisie de l’utilisateur. Sinon, à cause de la ssh
intérieure et de la scp
extérieure, le mot de passe vous serait demandé deux fois.
Assurez-vous que la commande interne ssh
n’affiche que la variable $FOO
. Essayez-le tout seul avant de l'utiliser dans la commande externe scp
et assurez-vous que cela fonctionne.
Pour une raison quelconque, je ne comprends pas tout à fait. Lorsque j'ai testé la commande que j'ai écrite ci-dessus, cela ne fonctionnerait pas comme prévu, car la variable extraite contiendrait un préfixe de contrôle étrange. Par exemple, lorsque j'essayais de copier quelque chose sur le $HOME
distant, il essayait de le copier dans \033k$HOME\033\\/home/user
au lieu de simplement /home/user
. J'ai dû utiliser ce qui suit pour le faire fonctionner:
scp file Host2@Host2_address:$(ssh Host2@Host2_address 'printf $FOO' | cut -d\\ -f2)
... où $FOO
était $HOME
dans mon cas particulier, bien sûr.
C'est une solution rapide (car elle est plutôt courte) et dynamique (car elle récupère la variable à la volée) que j'ai proposée. Cependant, en raison du dernier point, je pense qu’il serait plus fiable de disposer d’un script permettant de récupérer les variables distantes en les imprimant d’abord dans un fichier. Plus précisément, ce script sur Host1 se connecte à Host2, imprime à distance le résultat de printenv
sur un fichier de Host2, récupère ce fichier à partir de Host2, l’analyse et exporte les valeurs en variables d’environnement locales. Par exemple, la variable $FOO
sur l'hôte 2 peut être insérée dans une variable $Host2_FOO
sur l'hôte1. Le script suivant ferait ceci:
#!/bin/bash
ssh Host2@Host2_address 'printenv > Host2_vars.txt'
scp Host2@Host2_address:Host2_vars.txt .
#ssh Host2@Host2_address 'rm Host2_vars.txt' #if you like to clean up
eval $(cat Host2_vars.txt | Perl -pe 's/^(.*)=(.*)$/export Host2_$1="$2"/g')
Bien sûr, vous devrez exécuter ce script avant la commande scp
.
Je suggérerais d'échapper au dollar
scp file Host2@Host2_adress:"\$FOO"