Как видно из заголовка, я хочу изменить переменные окружения на удаленном сервере, используя 'ssh'.

Моя первая попытка была:

$ ssh mysvr -l sikaiwei "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"

Сначала я не определил $ ORANGE на хосте сервера, но определил $ ORANGE как "1" на клиенте, и я получил:

1
1
getId is +

Обратите внимание, что команда выбирает значение клиента $ ORANGE, и обновление (ORANGE+1) не происходит.

Затем я удалил определение $ ORANGE на клиентском хосте и определил $ ORANGE на сервере, поместив команду в мой .bash_profile . Но

$ ssh mysvr -l sikaiwei "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"

привело к



getId is +

Он не может распечатать значение $ ORANGE, которое я попытался инициализировать на хосте сервера! Тогда я попробовал это:

$ ssh mysvr -l sikaiwei ". .profile; getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; echo 'getId is '+$getId;"


getId is +

Это все еще не работает.

Я пытался использовать '..' (одинарные кавычки) вместо ".." (двойные кавычки), как вы сказали, но ничего не печатается ...

$ ssh myth@mysvr 'echo orangeis $ORANGE'
orangeis 

Я хочу напечатать

 getId=1; echo 1; ORANGE=2; echo 2; …

вместо

 getId=; echo ; ORANGE=1; echo ; …

Итак, как я могу использовать значение $ ORANGE с хоста сервера вместо значения клиента?

Мой сервер работает под управлением Windows, но я установил Cygwin. Моя клиентская машина работает под управлением Linux.

Редактировать: Я нашел часть проблемы: я устанавливал $ ORANGE в ~/.bash_profile на хосте сервера, и я могу получить значение $ ORANGE, используя «echo $ ORANGE» в интерактивной оболочке (Cygwin), но это не было t влияет на строки команд ssh . Например, я ничего не получаю, когда мой клиентский хост использует

$ ssh sikaiwei@mysvr 'echo orange is $ORANGE'
orange is

Таким образом, я не получаю значение $ ORANGE, которое я делаю в сеансе на сервере. . .profile который я добавил, не помог. Но если я

$ ssh sikaiwei@mysvr '. ~/.bash_profile;echo orange is $ORANGE'
orange is 4

Я получил значение!


О, я забыл упомянуть: я хочу, чтобы эти переменные на сервере были постоянными. Другими словами, если я выполняю команду ssh которая изменяет значение $ ORANGE с 4 на 42, тогда я хочу, чтобы $ ORANGE был 42, когда я выполняю другую команду ssh .

1 ответ1

0

Проблема заключается в том, что переменные оболочки (из которых переменные среды являются подмножеством или вариантом), которые заключены в двойные кавычки ("…"), обрабатываются немедленно.  Таким образом, если для ORANGE установлено значение 1 локально, как вы сообщаете, что сделали в первом эксперименте, и вы вводите

… ssh … "getId=$ORANGE; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; …"

ssh становится

getId=1; echo 1; ORANGE=2; echo 1; …

И, если ORANGE не установлен локально, как вы сообщаете об этом во втором эксперименте, ssh получает

getId=; echo ; ORANGE=1; echo ; …

Чтобы отправить команду в удаленную систему в том виде, в каком вы ее ввели, дополните ее знаками доллара, чтобы она была обработана оболочкой в удаленной системе, заключив ее в одинарные кавычки ('…').

Например, если вы говорите

… ssh … 'echo orangeis $ORANGE'

тогда ssh видит

echo orangeis $ORANGE

и отправив это в удаленную систему.  Это заставляет оболочку на удаленной системе выводить

orangeis 

(с пробелом в конце), потому что вы ничего не сделали, чтобы присвоить ORANGE значение (или, если вы что-то сделали, это не сработало).

Ты говоришь

Я хочу напечатать

  GetId = 1; эхо 1; Оранжевый = 2; эхо 1; ...

что явно не то, что вы имеете в виду.  Если вы имеете в виду, что вы хотите напечатать

getId=1
1
2
  ︙

попробуй что-то вроде

… ssh … 'ORANGE=1; getId="$ORANGE"; echo "getId=$getId"; echo $ORANGE; ORANGE=$((ORANGE+1)); echo $ORANGE; …"



Вы уточнили свой вопрос (в комментариях), чтобы указать, что вы хотите иметь возможность манипулировать переменными оболочки / среды на удаленном сервере и что значения изменений сохраняются от одного сеанса к другому. Для этого вам нужно будет явно хранить значения где-то (на сервере). Простой способ сохранить значение - выполнить

echo "$ORANGE" > orange.txt

Затем вы можете получить это значение с помощью команды вроде

read ORANGE < orange.txt

или же

ORANGE=$(cat orange.txt)

Немного другой подход будет сохранить вашу ценность с

echo "ORANGE=\"$ORANGE\"" > value.sh

а затем получить его с

. value.sh

IMNSHO, нет особого смысла использовать ваш .bash_profile для хранения этих значений, если вы собираетесь их часто изменять.

Обратите внимание, что вы должны использовать >> для добавления в файл и >| перезаписать существующий файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .