Подтвердить что ты не робот

Как локальная и удаленная переменная внутри команды SSH

Как я могу использовать как локальную, так и удаленную переменную в команде ssh? Например, в следующем примере кода:

A=3;
ssh [email protected] "B=3; echo $A; echo $B;"

У меня есть доступ к A, но B недоступен.

Но в следующем примере:

A=3;
ssh [email protected] 'B=3; echo $A; echo $B;'

У меня нет A, и доступен только B.

Есть ли способ, чтобы оба A и B были доступны?

4b9b3361

Ответ 1

Я думаю, что это то, что вы хотите:

A=3;
ssh [email protected] "B=3; echo $A; echo \$B;"

Когда вы используете двойные кавычки:

Ваша оболочка автоматически расширяет переменные с префиксом $, поэтому в первом примере, когда он видит

ssh [email protected] "B=3; echo $A; echo $B;"

bash расширяет его до:

ssh [email protected] "B=3; echo 3; echo ;"

и , затем передает [email protected] "B=3; echo 3; echo ;" в качестве аргумента ssh. Это связано с тем, что вы определили A с A=3, но вы никогда не определяли B, поэтому $B разрешает локальную пустую строку.


При использовании одиночных кавычек:

Все, заключенные в одиночные кавычки, интерпретируются как строковые литералы, поэтому, когда вы делаете:

ssh [email protected] 'B=3; echo $A; echo $B;'

инструкции B=3; echo $A; echo $B; будут запускаться после входа на удаленный сервер. Вы определили B в удаленной оболочке, но вы никогда не говорили ей, что A, поэтому $A будет разрешено к пустой строке.


Поэтому, когда вы используете \$, как в решении:

\$ означает интерпретировать символ $ буквально, поэтому мы отправляем буквально echo $B в качестве одной из команд для удаленного выполнения, вместо того, чтобы сначала bash развернуть $B локально. То, что мы заканчиваем тем, что говорим ssh делать, эквивалентно этому:

ssh [email protected] 'B=3; echo 3; echo $B;'