web-dev-qa-db-fra.com

Comment utiliser une variable d'environnement d'un hôte distant à l'aide de scp?

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 ?

2
Gwaka

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:

  1. 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.

  2. 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.

  3. 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.

2
Malte Skoruppa

Je suggérerais d'échapper au dollar

scp file Host2@Host2_adress:"\$FOO"
2
jalanb