Как использовать переменную окружения удаленного хоста с помощью scp?

У меня есть две машины, host1 и host2.

Я хотел бы использовать переменную окружения host2 из команды scp с host1. Например, используйте команду такого типа от host1:

scp file host2@host2_adress:$FOO

, где $ FOO определяется в host2 как путь к каталогу. Если я использую команду выше, bash будет искать среди переменных host1, а не host2.

Практическим примером будет использование переменной $ HOME для host2

Как это сделать?

2
задан 8 January 2014 в 13:11

2 ответа

Вы можете попробовать что-то вроде этого:

scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO')

Чтобы разрешить значение переменной $(ssh host2@host2_address 'printf $FOO'), оболочка внутренне выполнит команду ssh host2@host2_address 'printf $FOO' и примет все, что эта команда напечатает как значение переменной, которая затем подставляется во внешнюю команду scp. Понятно, конечно, что вы должны извлечь переменную $FOO из host2, потому что host1 просто не знает об этом. Один из способов получить его - использовать ssh, как в приведенной выше команде.

Mind:

  1. Вы должны иметь какую-то аутентификацию с открытым ключом, чтобы внутренняя команда ssh работала без какого-либо дополнительного ввода данных пользователем. В противном случае, из-за внутреннего ssh и внешнего scp, вам будет предложено ввести пароль дважды.

  2. Вы должны убедиться, что внутренняя команда ssh выводит только переменную $FOO. Попробуйте сами, прежде чем использовать его во внешней команде scp, и убедитесь, что он работает.

  3. По какой-то причине я не совсем понимаю, когда я тестировал команду, которую я написал выше, она не работала бы так, как ожидалось, потому что извлеченная переменная содержала бы какой-то странный префикс управления. Например, когда я пытался скопировать что-то на удаленный $HOME, он пытался скопировать это в \033k$HOME\033\\/home/user вместо простого /home/user. Мне пришлось использовать следующее, чтобы заставить его работать:

    scp file host2@host2_address:$(ssh host2@host2_address 'printf $FOO' | cut -d\\ -f2)
    

    ... где $FOO было $HOME в моем конкретном случае, конечно.

Это быстрое (поскольку оно довольно короткое) и динамическое (так как оно будет извлекать переменную на лету) решение, которое я придумал. Однако, особенно из-за последнего пункта, я думаю, что было бы более надежным иметь скрипт, который извлекает удаленные переменные, сначала печатая их в файл. Точнее, этот сценарий на хосте 1 будет подключаться к хосту 2, удаленно печатать вывод printenv в некоторый файл на хосте 2, извлекать этот файл с хоста 2, анализировать его и экспортировать значения в локальные переменные среды. Например, переменная $FOO на host2 может быть помещена в переменную $HOST2_FOO на host1. Следующий скрипт будет делать это:

#!/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')

Конечно, вам придется выполнить этот скрипт перед командой scp.

0
ответ дан 8 January 2014 в 13:11

Я бы посоветовал сбежать от доллара

scp file host2@host2_adress:"\$FOO"
0
ответ дан 8 January 2014 в 13:11

Другие вопросы по тегам:

Похожие вопросы: