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