Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Hej
Szukałem w necie, ale żadna metoda mi nie zadziałała do moich celów. Napisze skrypt z błędami (bo inaczej nie umiem), a może ktoś poprawi albo powie co i jak.
a="Jam jest a" echo $a #to było proste ;) ssh -i kluczyk root@192.168.0.1 " echo $a b="Jam jest b" echo $b " echo $b
Myślę, że jest to wymowne i zrozumiałe, o co chodzi. Dokładnie mam problem ze zmiennymi. Potrzebuje zrobić skrypt no i powysyłać do niektórych komputerów co nie co. Chodzi głownie czy wpisać " ' ` czy inny znaczek. Jak mi jedno działa (echo $a) to drugie nie (echo $b).
Z góry dzięki pozdr.
Ostatnio edytowany przez P@blo (2012-11-06 15:50:10)
Offline
Efekt:
Jam jest a Jam jest a
Ostatnio edytowany przez P@blo (2012-11-06 16:21:02)
Offline
a="Jam jest a" echo $a ssh -i kluczyk 192.168.0.1 "echo $a; b=\"Jam jest b\"; echo \$b;"
Daje
Jam jest a Jam jest a Jam jest b
Czyli jest nieźle ;D
Chyba ze dużo chce i rozumiem, że to jest maks możliwości...
Ostatnio edytowany przez P@blo (2012-11-06 16:48:46)
Offline
Środowisko na Twoim komputerze i środowisko na hoście SSH są dwoma odmiennymi środowiskami i żadne nie dziedziczy po pozostałym.
" (cudzysłów) powoduje, że wszelkie znaki specjalne są ewaluowane i po ewaluacji przekazywane jako argument polecenia.
' (apostrof) powoduje, że argument jest przekazywany jak leci, bez ewaluacji.
Tutaj masz sytuację skomplikowaną o tyle, że wprowadzone polecenia są ewaluowane przez powłokę lokalną i przekazywane ssh, który po nawiązaniu połączenia przekazuje je powłoce zdalnej. Ta druga również je ewaluuje, zgodnie ze swoją gramatyką (ssh wywoła powłokę logowania i przekaże jej argumenty; gdybyś chciał na zdalnym komputerze wywołać np. polecenie pythona, miałbyś już potrójne zagnieżdżenie — powłoka lokalna przekaże po ewaluacji argumenty do powłoki zdalnej, która po swojej ewaluacji przekaże je pythonowi, który również podda je ewaluacji i dopiero wykona).
a='jestem a' ssh host "echo $a"
Przypisze wartość zmiennej a. Następnie zostanie wywołane polecenie ssh z listą argumentów "echo" i "jestem a" (czyli zmienna a po rozwinięciu). Całość wygląda, jak gdyby środowisko zdalne odziedziczyło zmienną po środowisku lokalnym, ale jest to nieprawda — środowisko zdalne otrzymuje jako argument ciąg znaków i nie ma pojęcia o tym, że w jego miejscu kiedyś była zmienna.
a='jestem a' ssh host 'echo $a'
Nic nie wyświetli, ponieważ zmienna a nie jest zdefiniowana w środowisku zdalnym.
ssh host "b='jestem b'; echo $b"
Nic nie wyświetli, ponieważ zmienna b jest rozwijana w kontekście środowiska lokalnego, gdzie jeszcze nie jest zdefiniowana.
Jeżeli chcesz, aby zmienna b została rozwinięta w kontekście środowiska zdalnego, musisz zapobiec jej rozwinięciu w środowisku lokalnym (czyli przekazać ssh ciąg znaków $b). Możesz albo skorzystać z pojedynczych cudzysłowów, albo zacytować znak specjalny powłoki w ramach podwójnych cudzysłowów:
ssh host 'b="jestem b"; echo $b' ssh host "b=\"jestem b\"; echo \$b" ssh host "b='jestem b'; echo \$b"
Zwróć uwagę na różnicę między drugim a trzecim zapisem powyżej na takim przykładzie:
ssh host "b=\"jestem \$(pwd)\"; echo \$b" ssh host "b='jestem \$(pwd)'; echo \$b"
(w obu przypadkach cytujemy $ przed (pwd), aby zapobiec jego rozwinięciu przez powłokę lokalną; raz '$(pwd)' jest otoczone cudzysłowami i podlega zastąpieniu wynikiem polecenia, raz jest otoczone apostrofami i jest traktowane dosłownie).
Ostatnio edytowany przez Minio (2012-11-06 16:47:09)
Offline
Jednym słowem nie da się uzyskać danych ze zmiennej środowiska zdalnego w środowisku lokalnym? Nawet jeśli zmienna jest wpierw zadeklarowana w środowisku lokalnym? Zdaje się logiczne, ale szkoda...
Offline
SSH służy do przekierowania wejścia i wyjścia, a nie współdzielenia środowiska. Do współdzielenia danych służą protokoły komunikacyjne. Istnieje parę sposobów na odtworzenie środowiska lokalnego w środowisku zdalnym, ale w drugą stronę już nie jest to takie proste.
Jeżeli chcesz się ograniczyć tylko i wyłącznie do SSH, to chyba najprościej będzie zapisać zmienną na komputerze zdalnym w pliku, pobrać go sobie na komputer lokalny przy pomocy rsync i potem odczytać ten plik.
Offline
rsync? Poważnie? Prościej chyba zapisać skrypt lokalnie, wysłać przez scp na serwer, przez ssh wykonać skrypt.
Offline
azhag: ale my tutaj mówimy o przekazaniu zawartości zmiennej z komputera zdalnego na komputer lokalny. Nie widzę sposobu, w jaki wysłanie skryptu przez scp i wykonanie go na komputerze zdalnym przez ssh miałoby w tym pomóc.
Offline
A, rzeczywiście. :)
Offline
No dobra, dzięki panowie :)
Offline