BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
larry2003
Sędziwy Jeż
Sędziwy Jeż
Posty: 76
Rejestracja: 13 kwie 2009, 21:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: larry2003 »

Mam nie mały problem. Otóż w jednym skrypcie łącze się z kilkoma maszynami i na każdej z nich muszę wykonać kilka komend. Idea jest mniej więcej taka: łącze się z daną maszyna zbieram PID interesującego mnie procesu. Łącze się drugi raz i sprawdzam utlizację CPU przez ten PID. Łącze się trzeci raz i sprawdzam uptime danego PID.

Jak pisałem wcześniej maszyn jest kilka, procesów które mnie interesują na każdej z maszyn również kilka, co przy obecnej idei skryptu powoduje konieczność łączenia się z jedną maszyna kilkanaście razy w trakcie jednego wywołania skryptu (skrypt wywoływany co 1 minutę).

Można to zmienić -> łącząc 2 i 3 komendę w jedno polecenie. I tu właśnie zaczynają się schody- nie do końca potrafię złączyć dwa polecenia typu:

Kod: Zaznacz cały

ssh user@maszyna top -b -n1 |grep grep cokolwiek | grep cokolwiek |awk '{if ($9 < 800 ) print $1"\t"$9"\t"; else print "\033[37;5;41m"$1"\t"$9"\t""\033[0m" ; }'`

ssh usr@maszyna ps -eo user,pid,etime,ucmd | grep cokolwiek | grep cokolwiek | cut -b1-23 | sed -e 's/-/d/g' -e 's/:/h/g'  | awk  '{ if ( $2 == "'cokolwiek'" ) print $3"m" ; }'`
Jeśli próbuje wykonać polecenie typu:

Kod: Zaznacz cały

ssh user@maszyna top -b -n1 |grep grep cokolwiek | grep cokolwiek |awk '{if ($9 < 800 ) print $1"\t"$9"\t"; else print "\033[37;5;41m"$1"\t"$9"\t""\033[0m" ; }'` ;  ps -eo user,pid,etime,ucmd | grep cokolwiek | grep cokolwiek | cut -b1-23 | sed -e 's/-/d/g' -e 's/:/h/g'  | awk  '{ if ( $2 == "'cokolwiek'" ) print $3"m" ; }'`
to oczywiście drugie polecenie nie zwraca nic, co więcej jeśli stworzę sobie testowo polecenie:

Kod: Zaznacz cały

ssh user@maszyna top -b -n1 |grep grep cokolwiek | grep cokolwiek |awk '{if ($9 < 800 ) print $1"\t"$9"\t"; else print "\033[37;5;41m"$1"\t"$9"\t""\033[0m" ; }'` ; ps -efw
to wynik drugiej komendy (ps -efw) zwraca wyniki z maszyny lokalnej i nie zdalnej.

Czy ktoś może mi podpowiedzieć co robię źle i jak wykonać kilka komend w jednym poleceniu na zdalnej maszynie ?
garnus
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 125
Rejestracja: 21 wrz 2007, 15:07
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: Unity
Architektura: x86_64

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: garnus »

larry2003 pisze: Jeśli próbuje wykonać polecenie typu:

Kod: Zaznacz cały

ssh user@maszyna top -b -n1 |grep grep cokolwiek | grep cokolwiek |awk '{if ($9 < 800 ) print $1"\t"$9"\t"; else print "\033[37;5;41m"$1"\t"$9"\t""\033[0m" ; }'` ;  ps -eo user,pid,etime,ucmd | grep cokolwiek | grep cokolwiek | cut -b1-23 | sed -e 's/-/d/g' -e 's/:/h/g'  | awk  '{ if ( $2 == "'cokolwiek'" ) print $3"m" ; }'`
Nie sprawdzałem tego dokładnie ale oglądając tę komendę to nie wiem po co używasz na końcu awka " ` ", tak samo na samym końcu polecenia, jakoś nie znalazłem "otwierającego" ` .
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: beluosus »

Weź polecenie w cudzysłów:

Kod: Zaznacz cały

ssh ... "ps | awk"
Ale w związku z ilością znaków podwójnego apostrofu, zmiennych itd. możesz mieć problemy z jego escape'owaniem. Lepiej dany skrypt zapisz na zdalnej maszynie i go uruchamiaj.
Awatar użytkownika
larry2003
Sędziwy Jeż
Sędziwy Jeż
Posty: 76
Rejestracja: 13 kwie 2009, 21:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: larry2003 »

Nie sprawdzałem tego dokładnie ale oglądając tę komendę to nie wiem po co używasz na końcu awka " ` ", tak samo na samym końcu polecenia, jakoś nie znalazłem "otwierającego" ` .
Tu akurat po prostu mój blad przy wklejaniu: polecenia te są w skrypcie przypisane do zmiennej, czyli wyglada to mniej wiecej tak:

Kod: Zaznacz cały

jakaszmienna=`ssh user@maszyna top -b -n1 |grep grep cokolwiek | grep cokolwiek |awk '{if ($9 < 800 ) print $1"\t"$9"\t"; else print "\033[37;5;41m"$1"\t"$9"\t""\033[0m" ; }' ;  ps -eo user,pid,etime,ucmd | grep cokolwiek | grep cokolwiek | cut -b1-23 | sed -e 's/-/d/g' -e 's/:/h/g'  | awk  '{ if ( $2 == "'cokolwiek'" ) print $3"m" ; }'`
i stąd te znaki "`" na końcu komend, na końcu awk też ich w rzeczywistości nie ma - błąd przy wklejaniu również.
Ale w związku z ilością znaków podwójnego apostrofu, zmiennych itd. możesz mieć problemy z jego escape'owaniem. Lepiej dany skrypt zapisz na zdalnej maszynie i go uruchamiaj.
Problem w tym, że próbowałem już w taki sposób- zamknąć polecenia w apostrofy, ale właśnie przez to że apostrofów w komendach jest już dosyć sporo- nie zadziałało ;)

Co do umieszczania skryptu lokalnie na danych maszynach i wywoływanie zdalnie tych skryptów to niestety odpada, ze względów dostępowych itd. itp.
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: beluosus »

larry2003 pisze:Problem w tym, że próbowałem już w taki sposób- zamknąć polecenia w apostrofy, ale właśnie przez to że apostrofów w komendach jest już dosyć sporo- nie zadziałało ;)
Zamień odpowiednio:

Kod: Zaznacz cały

"   na   \"
$   na   \$
Nie widzę nic więcej co można by zeskejpować - powinno zadziałać. Np:

Kod: Zaznacz cały

ssh user@host "top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'"
larry2003 pisze:Co do umieszczania skryptu lokalnie na danych maszynach i wywoływanie zdalnie tych skryptów to niestety odpada, ze względów dostępowych itd. itp.
Dlaczego lokalnie? Masz dostęp do shella więc możesz wrzucić tam skrypt przez scp albo wkleić przez jakikolwiek edytor. Nawet jeśli partycja jest montowana z opcją noexec to możesz sprawę załatwić poprzez użycie eval (zdalnie).
Awatar użytkownika
larry2003
Sędziwy Jeż
Sędziwy Jeż
Posty: 76
Rejestracja: 13 kwie 2009, 21:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: larry2003 »

beluosus pisze:Nie widzę nic więcej co można by zeskejpować - powinno zadziałać. Np:

ssh user@host "top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'"
Z tym że nie w tym tkwi problem...

Jedno polecenie takie jak powyżej wykonuje się i z tym nie ma najmniejszego problemu. Problem z tym że chcę aby jednym połączeniem ssh wywołać dwie komendy czyli np:

Kod: Zaznacz cały

ssh user@host "top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'" ; "ps -efw"
Jeśli wywołam polecenie o dokładnie takiej składni dostanę wynik komendy top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}' z user@maszyna a wynik komendy ps -efw z maszyny lokalnej (z której komenda czy skrypt był wywołany).

Zastosowałem się do wszystkich Twoich porad- zeskejpowałem wszystko co się dało, spróbowałem :

Kod: Zaznacz cały

CMD1="top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'"
CMD2="ps -efw"
CMD3=`ssh user@host eval $CMD1 ; eval $CMD2`
też bez większych rezultatów.

-- 25 wrz 2011 15:52 --

Ok, zadziałało w postaci:

Kod: Zaznacz cały

CMD1="top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'"
CMD2="ps -efw"
CMD3=`ssh user@host "eval $CMD1 ; eval $CMD2"`
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: beluosus »

Wszystkie polecenia mają być w jednym argumencie (między jedną parą cudzysłowów).

Kod: Zaznacz cały

ssh ... "polecenie1; polecenie2"
Co do eval to kompletnie mnie nie zrozumiałeś. Ale nie będę tłumaczył skoro i tak nie chcesz wrzucić skryptu na serwer.

PS
To co napisałeś i tak zostanie zamienione na:

Kod: Zaznacz cały

CMD3=`ssh user@host "eval top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'; eval ps -efw"`
Co w rezultacie da:

Kod: Zaznacz cały

CMD3=`ssh user@host "top -bn1 | awk '{if (NR > 7) print \$1 \"\t\" \$2}'; ps -efw"`
(to samo bez eval).
Awatar użytkownika
larry2003
Sędziwy Jeż
Sędziwy Jeż
Posty: 76
Rejestracja: 13 kwie 2009, 21:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: larry2003 »

no wiem, z tym, że jak połącze dwa polecenia i jeszcze dorzucę może do tego trzecie to będzie to bardzo nie zrozumiałe ;) a tak przynajmniej klarownie to wygląda

-- 25 wrz 2011 16:44 --

;) to kolejny problem z mojej strony:

sytuacja wygląda tak:

Kod: Zaznacz cały

CMD1="ps -efw |grep apache| awk '{print \$2}'"
CMD2="top -bn1 |grep \$CMD1 | awk ........ "
CMD3="ps ps -eo user,pid,etime,ucmd | grep \$CMD1"
jak teraz poradzić sobie z tym problemem - chce wykonać te trzy komendy w jednym poleceniu - z tym, że CMD2 i CMD3 są zależne od CMD1 ;)

próbowałem :

Kod: Zaznacz cały

CMD11="ps -efw |grep apache| awk '{print \$2}'"
CMD2="top -bn1 |grep \$CMD1 | awk ........ "
CMD3="ps ps -eo user,pid,etime,ucmd | grep \$CMD1"
ssh .... "CMD1=`eval $CMD11` ; eval $CMD2 ; eval $CMD3"
ale rezultat był znikomy. Sprawdzałem jeszcze pare innych możliwości ale mam wrażenie, że mój tok myślenia jest po prostu zły.
Ubek308
Zakręcona Traszka
Zakręcona Traszka
Posty: 574
Rejestracja: 25 maja 2011, 10:17
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: Ubek308 »

ssh .... "CMD1=`eval $CMD11` ; eval $CMD2 ; eval $CMD3"

W pierwszym eval masz ciapki (``), w pozostalych nie. Zdecyduj sie.
Ale i tak to raczej nie pomoze. Zmienne CMD sa lokalne, tyle ze sie pozniej rozwijaja w komendy a jeszcze dochodzi 'escape-owanie' znakow specjalnych, przy odrobinie szczescia zeby uzyskac jeden backshlash na zdalnym komputerze - na lokalnym musilbys dac CZTERY backshlashe.

Juz lepiej zrob lokalny skrypt skoro zdalnego nie chcesz i do niego wloz te 3 połączenia. Odpalisz raz a że skrypt bedzie sie 3 razy łączyl - kogo to obchodzi.

Przede wszystkim sprawdzilbym na lokalnej maszynie co z tego ci zadziala, pozniej bawil sie w ssh.
Awatar użytkownika
larry2003
Sędziwy Jeż
Sędziwy Jeż
Posty: 76
Rejestracja: 13 kwie 2009, 21:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.04
Środowisko graficzne: GNOME

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: larry2003 »

W pierwszym eval masz ciapki (``), w pozostalych nie. Zdecyduj sie.
To zabieg celowy, maił w zamyśle spowodować żeby komenda wykonała się i była przypisana do CMD1.

Nie ma żadnego znaczenia że zmienne CMD są lokalne. Chodzi tylko o to żeby zdalnie w jednym poleceniu ssh przypisać do zmiennej wynik komendy i grepować po tej zmiennej pozostałe komendy.
Odpalisz raz a że skrypt bedzie sie 3 razy łączyl - kogo to obchodzi.
Gdybym do tego tak podchodził nei zakładałbym w ogóle tego tematu i skrypt pozostałby w takiej postaci w jakiej jest ;) - czego oczywiście nie chce, nie chce również umieszczać skryptów na każdej maszynie...
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: beluosus »

Po pierwsze zapoznaj się z podstawami bash, takimi jak zakres argumentów (używanie [podwójnych] apostrofów), do czego służy polecenie eval, a na koniec przeczytaj wszystko co zostało napisane w tym temacie, bo chyba nic więcej już się nie da powiedzieć.

Poza tym pokaż prawdziwy, realny, działający skrypt, bo to co wypisujesz jest bez sensu, albo grubo nadmiarowe.
Np:

Kod: Zaznacz cały

ps -efw |grep apache| awk '{print \$2}'
Możesz zamienić na (tyle, że nie otrzymasz PID grepa):

Kod: Zaznacz cały

pgrep apache
Z CMD2 nawet nie wiem o co chodzi, a w trzecim jest jakieś "ps ps" i grep, a przecież ps ma przełącznik -C który pokazuje pasujące procesy.
Ubek308
Zakręcona Traszka
Zakręcona Traszka
Posty: 574
Rejestracja: 25 maja 2011, 10:17
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

Re: BASH - ssh - wykonywanie 2 komend w jednym poleceniu

Post autor: Ubek308 »

Ja podchodze do tego tak ze zwyciezcow nikt nie sądzi (!!!) a jesli to ma dac rezultat bez odwracania biegu kuli ziemskiej i SZYBKO - wbijam gwozdzie nie tylko mikroskopem ale tez kantem laptopa albo zegarkiem a nastepnie podaje szefowi wynik na tacy.
Ale w tym wątku chyba rzeczywiscie wszystko zostalo powiedziane wiec sie zamykam.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości