Předávání proměnných příkazům spouštěným vzdáleně přes SSH

Opět jeden z pamatováčků, tentokrát trocha poznámek k syntaxi pro spouštění příkazů na vzdáleném stroji avšak s lokálními proměnnými.

Jednoduchý příkaz

[user1@local]$ ssh user2@remote export "ARG=$HOME;" 'echo $HOME $ARG'
/home/user2 /home/user1

A teď vysvětlení:

  • cokoliv je za názvem vzdáleného stroje (tj. user2@remote) je vykonáno jako příkaz na tomto stroji v tzv. neinteraktivním shellu;
  • cokoliv je uvedeno v uvozovkách, je interpretováno lokálním shellem ještě před navázáním spojení;
  • cokoliv je uvedeno v jednoduchých uvozovkách, je lokálním shellem ponecháno v doslovné podobě a interpretováno až shellem vzdáleným.

Tzn. že je před otevřením ssh připojení se řádek změní na:

[user1@local]$ ssh user2@remote export ARG=/home/user1; echo $HOME $ARG

A na vzdáleném stroji se vykonají tyto příkazy (tj. zbývající proměnné jsou nahrazeny jejich obsahem dle prostředí na vzdáleném stroji):

[user2@remote]$ export ARG=/home/user1; echo /home/user2 /home/user1

Komplikovanější skripty

A co takhle spustit vzdáleně nějaký komplikovanější skript včetně předání obsahu lokálních proměnných?

[user1@local]$ ssh user2@remote ARG="local\ variable\ $HOME" 'bash -s ' << 'ENDSPT'
> echo \$HOME je vzdálená proměnná, tedy $HOME
> echo \$ARG je lokální proměnná \"exportovaná\" do vzdáleného stroje, tedy $ARG
> ENDSPT

Po stlačení klávesy enter se objeví:

$HOME je vzdálená proměnná, tedy /home/user2
$ARG je lokální proměnná "exportovaná" do vzdáleného stroje, tedy /home/user1

Vysvětlení je trochu komplikovanější a nejsem si jist, zda jej chápu správně:

  • parametr ARG=… je opět před otevřením spojení interpretován lokálním shellem, tedy proměnná $HOME je nahrazena svým obsahem /home/user1, přičemž mezery je třeba escapovat jinak to vzdálený shell bude interpretovat jako samostatné příkazy a selže;
  • příkaz bash -s spustí samostatný shell, který provede příkazy přesměrované ze standardního vstupu (<<) a současně akceptuje proměnnou definovanou dříve na tomtéž řádku, přičemž tuto není nutné „exportovat“ (-s je prakticky zbytečné, ale neuškodí ho použít).

Takže ještě před otevřením SSH spojení se řádek změní na:

[user1@local]$ ssh user2@remote ARG="local\ variable\ /home/user1" 'bash -s' << 'ENDSPT'
> echo \$HOME je vzdálená proměnná, tedy $HOME
> echo \$ARG je lokální proměnná \"exportovaná\" do vzdáleného stroje, tedy $ARG
> ENDSPT

Což na vzdáleném stroji provede:

[user2@remote]$ ARG=local\ variable\ /home/user1 bash -s << 'ENDSPT'
> echo \$HOME je vzdálená proměnná, tedy $HOME
> echo \$ARG je lokální proměnná \"exportovaná\" do vzdáleného stroje, tedy $ARG
> ENDSPT

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

This site uses Akismet to reduce spam. Learn how your comment data is processed.