Vraag Hoe hebben zowel lokale als externe variabele binnen een SSH-opdracht


Hoe kan ik zowel lokale als externe variabele gebruiken in een ssh-opdracht? Bijvoorbeeld in de volgende voorbeeldcode:

A=3;
ssh host@name "B=3; echo $A; echo $B;"

Ik heb toegang tot A maar B is niet toegankelijk.

Maar in het volgende voorbeeld:

A=3;
ssh host@name 'B=3; echo $A; echo $B;'

Ik heb geen A en alleen B is toegankelijk.

Is er een manier dat zowel A als B toegankelijk zijn?


24
2017-12-11 18:22


oorsprong


antwoorden:


Ik denk dat dit is wat je wilt:

A=3;
ssh host@name "B=3; echo $A; echo \$B;"

Wanneer u dubbele aanhalingstekens gebruikt:

Je shell voert automatische uitbreiding uit op variabelen voorafgegaan door $, dus in je eerste voorbeeld, als het ziet

ssh host@name "B=3; echo $A; echo $B;"

bash breidt het uit naar:

ssh host@name "B=3; echo 3; echo ;"

en dan passes host@name "B=3; echo 3; echo ;" als het argument voor ssh. Dit komt omdat je hebt gedefinieerd A met A=3, maar je hebt nooit gedefinieerd B, dus $B lost lokaal de lege string op.


Wanneer u enkele aanhalingstekens gebruikt:

Alles omsloten door enkele aanhalingstekens worden geïnterpreteerd als tekenreeksen, dus als u dat doet:

ssh host@name 'B=3; echo $A; echo $B;'

de instructies B=3; echo $A; echo $B; wordt uitgevoerd zodra u zich aanmeldt bij de externe server. Je hebt gedefinieerd B in de externe schaal, maar je hebt nooit verteld wat A is, zo $A zal naar de lege string oplossen.


Dus als je gebruikt \$, zoals in de oplossing:

\$ betekent om het te interpreteren $ karakter letterlijk, dus we sturen letterlijk echo $B als een van de instructies om op afstand uit te voeren, in plaats van bash uit te breiden $B lokaal eerst. Wat we uiteindelijk vertellen ssh doen is hier het equivalent van:

ssh host@name 'B=3; echo 3; echo $B;'

55
2017-12-11 18:26