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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2012-11-06 15:49:07

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

[bash]ssh i zasięg zmiennych

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.

Kod:

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)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#2  2012-11-06 16:16:18

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: [bash]ssh i zasięg zmiennych

A tak:

Kod:

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

Offline

 

#3  2012-11-06 16:20:23

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]ssh i zasięg zmiennych

Efekt:

Kod:

Jam jest a
Jam jest a

Ostatnio edytowany przez P@blo (2012-11-06 16:21:02)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#4  2012-11-06 16:39:42

  djjanek - Użytkownik

djjanek
Użytkownik
Skąd: whereis
Zarejestrowany: 2007-11-15
Serwis

Re: [bash]ssh i zasięg zmiennych

Kod:

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

Offline

 

#5  2012-11-06 16:43:21

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]ssh i zasięg zmiennych

Kod:

a="Jam jest a"
echo $a
ssh -i kluczyk 192.168.0.1 "echo $a; b=\"Jam jest b\"; echo \$b;"

Daje

Kod:

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)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#6  2012-11-06 16:45:54

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [bash]ssh i zasięg zmiennych

Ś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).

Kod:

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.

Kod:

a='jestem a'
ssh host 'echo $a'

Nic nie wyświetli, ponieważ zmienna a nie jest zdefiniowana w środowisku zdalnym.

Kod:

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:

Kod:

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:

Kod:

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

 

#7  2012-11-06 16:58:03

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]ssh i zasięg zmiennych

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...


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

#8  2012-11-06 17:33:22

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [bash]ssh i zasięg zmiennych

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

 

#9  2012-11-06 17:47:32

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [bash]ssh i zasięg zmiennych

rsync? Poważnie? Prościej chyba zapisać skrypt lokalnie, wysłać przez scp na serwer, przez ssh wykonać skrypt.


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#10  2012-11-06 18:08:04

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [bash]ssh i zasięg zmiennych

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

 

#11  2012-11-06 21:28:47

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [bash]ssh i zasięg zmiennych

A, rzeczywiście. :)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#12  2012-11-07 12:12:07

  P@blo - Nadworny matematyk

P@blo
Nadworny matematyk
Skąd: Wrocław v Jasło
Zarejestrowany: 2010-11-11

Re: [bash]ssh i zasięg zmiennych

No dobra, dzięki panowie :)


ThinkPadX220i
| Procesor: Intel(R) Core(TM) i3-2310M CPU @ 2.10GHz |
|  Debian: sid   |   Arch: amd64   |   Sound: alsa   |
| No DE | WM: DWM  |  DM: .bash_profile  |  BIOS+MBR |

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)