Передача переменной env через ssh

Передача переменной env через ssh

Я пытаюсь передать переменную env на удаленный хост, используя приведенный ниже код.

ssh username@ip "env current_quarter=$current_quarter" sh -s << 'EOF' 
pwd 
echo "${current_quarter}" 
EOF

pwdпечатает правильное местоположение на удаленном хосте, но echo "${current_quarter}"не печатает current_quarter.

решение1

Помещая EOFкавычки, вы сообщаете локальной оболочке, что не следует разворачивать документ here перед передачей его в ssh. Согласнодокументация bashэто относится к расширению параметров, подстановке команд и арифметическому расширению.

Вопреки тому, что я думал изначально, когда писал этот ответ, удаленная оболочка не затронута этим и выполнит документ так, как будто вы написали его непосредственно в удаленной оболочке (включая все виды расширения и подстановки, которые были пропущены в локальной оболочке путем заключения в кавычки EOF).

Если вы просто хотите использовать локальную переменную, testудалите кавычки из EOF:

ssh user@host sh -s <<EOF
pwd
echo $test
EOF

Для пользователей рыбы это будет выглядеть так:

ssh user@host "\
pwd
echo $test
"

Теперь, если вы хотите передать локальную переменную testкак удаленную переменную remote_testи не расширять ее локально, вы просто экранируете переменную с помощью обратной косой черты:

ssh user@host sh -s <<EOF
export remote_test=$test
pwd
echo "\${remote_test}"
EOF

Редактировать:

Бег:

ssh user@host "env remote_test=$test" sh -s <<'EOF'
pwd
echo "${remote_test}"
EOF

должен быть эквивалентен третьему примеру кода, за исключением того, что envон не является частью оболочки и может также использоваться в оболочках, отличных от Bourne.

(Однако это идентично примеру кода, который привел OP, но поскольку OP отметил этот ответ как правильный, я подозреваю, что env и export ведут себя по-разному при столкновении с определенными последовательностями символов, но я не нашел убедительных доказательств, подтверждающих эту гипотезу.)

Связанный контент