2012-10-23 14 views
5

Poniższa nie działa dla mnie:Zdalne przypisanie ssh?

ssh [email protected] "k=5; echo $k;" 

po prostu zwraca pusty wiersz.

Jak przypisać zmienną do sesji zdalnej (ssh)?

Uwaga: Moje pytanie brzmi nie o tym, jak przekazać zmienne lokalne do mojego sesji ssh, ale raczej, jak tworzyć i przypisywać zmiennych zdalnych. (Powinno być dość proste zadanie do przodu?)


Edit:

Bardziej szczegółowo Próbuję to zrobić:

bkp=/some/path/to/backups 
ssh [email protected] "bkps=($(find $bkp/* -type d | sort)); 
         echo 'number of backups: '${#bkps[@]}; 
         while [ ${#bkps[@]} -gt 5 ]; do 
          echo ${bkps[${#bkps[@]}-1]}; 
          #rm -rf $bkps[${#bkps[@]}-1]; 
          unset bkps[${#bkps[@]}-1]; 
         done;" 

Polecenie find działa dobrze, ale dla jakiś powód $bkps nie zostanie wypełniony. więc moje przypuszczenie, że byłaby to kwestia przypisania zmiennej, ponieważ myślę, że sprawdził wszystko inne ...

+1

Podpowiedź najpierw wypróbuj polecenie lokalnie lub zaloguj się do serwera ssh i spróbuj. Bash wymaga użycia polecenia export do ustawienia zmiennych środowiskowych. ssh [email protected] "eksport k = 5; echo $ k;" – Codeguy007

+0

@ Codeguy007: Rozszerzyłem opis mojego problemu bardziej. W rzeczywistości nie próbuję ustawiać żadnych zmiennych środowiskowych. Zakładam, że uproszczony problem ma coś wspólnego z przekierowaniem wyjścia ... – Pitt

+3

Spróbuj 'ssh [email protected]" k = 5; echo \ $ k; "'. Zwróć uwagę na ukośnik odwrotny przed '$', aby zapobiec wczesnemu rozszerzeniu powłoki. Pojedyncze cytaty zamiast podwójnych cudzysłowów osiągnęłyby to samo. – twalberg

Odpowiedz

12

Biorąc pod uwagę tę inwokację:

ssh [email protected] "k=5; echo $k;" 

lokalna powłoka rozszerza $k (który najprawdopodobniej nie jest ustawiony) przed wykonaniem ssh .... Tak więc polecenie, które faktycznie zostanie przekazane do zdalnej powłoki po ustanowieniu połączenia, jest k=5; echo ; (lub k=5; echo something_else_entirely;, jeśli jest faktycznie ustawione lokalnie).

Aby tego uniknąć, uciec znak dolara takiego:

ssh [email protected] "k=5; echo \$k;" 

Alternatywnie, apostrofów zamiast cudzysłowów, aby zapobiec lokalnym ekspansję. Jednakże, chociaż działałoby to na tym prostym przykładzie, może faktycznie potrzebujesz lokalnego rozszerzenia niektórych zmiennych w poleceniu, które zostanie wysłane do strony zdalnej, więc odwrócenie ukośnika odwrotnego jest prawdopodobnie lepszą trasą.

W celu późniejszego wykorzystania, można również wpisać w powłoce nazwę set -x, aby odtworzyć rzeczywiste polecenia, które są wykonywane jako pomoc w rozwiązywaniu problemów.

+0

czy mógłbyś wyjaśnić, jak użyć polecenia "set -x"? Czy jest to część polecenia ssh, czy po prostu bash? – Pitt