2014-10-06 11 views
6

Niedźwiedź ze mną, opis jest długi.ssh nie zwraca niezawodnie danych wyjściowych z komendy zdalnej

W perlu Chcę wykonać proste polecenie zdalne i przechwycić wynik za pomocą perl :: Expect). Jednak okazało się, że moja tablica wyników była czasami pusta. Zrobiłem wiele eksperymentów i wierzę, że problem polega na tym, że moje zdalne połączenie ssh kończy się z sukcesem, zanim zdalne polecenie zakończy się pomyślnie.

  • zachowanie jest takie samo bez względu na to, czy działa perl :: Expect, czy ssh bezpośrednio z wiersza poleceń bash.
  • Wszystkie hosty w moim centrum danych mają to zachowanie. Im bardziej obciążony host, tym częstszy jest błąd. W przypadku ciężkich hostów nie uzyskuję wyniku w około 15% przypadków. Współczynnik błędów jest bliski 0 na jaśniejszych hostach.
  • Zdalne polecenie nie ma znaczenia.
  • Wiem, że przechodzę przez monit o hasło i do zdalnego hosta. Używając 'ssh -vvv' widzę, że polecenie zdalne jest wykonywane za każdym razem.
  • Eksperymentowałem, wykonując końcowe polecenie manekina i sprawdzając zdalny kod powrotu w nadziei na wypróżnienie bufora standardowego. Nic nie było niezawodne.

W poniższych przykładach zostały zredagowane nazwy użytkowników/grup/hostów. Poza tym wyjście jest nieedytowanym cięciem i wklejaniem.

 
> while true ; do echo "start"; ssh -l user host 'date; ls -l abc; echo $?'; echo "end"; done 
start 
Password: 
Mon Oct 6 13:06:51 PDT 2014 
-rw-r--r-- 1 user group 34538 Dec 6 2012 abc 
0 
end 
start 
Password: 
end 
start 
Password: 
Mon Oct 6 13:06:54 PDT 2014 
end 

Gdybym tee polecenia zdalnego do tymczasowego pliku następnie stdout jest zaczerwieniona i niezawodnie uzyskać wyjście z mojego polecenia za każdym razem. Niestety jest to praca hackowa.

 
while true ; do echo "start"; ssh -l user host 'date | tee -a /tmp/date.txt' ; echo "end"; done 

Nie daj się powiesił na Perl szczegółów w tym przykładzie. Interesującym bitem jest zwracana tablica @ output. W Perl Mam następujące polecenie:

lokalny :: rc :: Utils :: executeRemoteCommand ($ cmd, $ przejścia, 0, undef, undef \ @output)

który ostatecznie siewniki do nazywają to :

my $ ssh = Oczekiwano-> spawn (polecenie $);

Powstały komenda $ jest to: "ls -l abc; echo 'done'; echo $"

ssh -l użytkownik hosta

Successful 'print Dumper \ @output':

$VAR1 = [ 
     #0 
     " ", 
     #1 
     "-rw-r--r-- 1 user group 34538 Dec 6 2012 abc", 
     #2 
     "DONE", 
     #3 
     0 
    ]; 

Failed 'print Dumper \ @output':

$VAR1 = [ 
    #0 
    " ", 
    #1 
    "DONE", 
    #2 
    0 
]; 

Uwaga jak wynika z 'ls' nie została jeszcze zrobionego wystąpiło echo "DONE". Widziałem również, gdzie tablica wyjściowa ma wynik ls, ale nie echo. Zauważyłem również, że brakuje obu wyników.

Każdy wgląd byłby bardzo doceniony. W tym momencie jestem zakłopotany i muszę teraz zaprogramować te zdalne wywołania w pętli sprawdzając oczekiwany wynik. To straszne włamanie. Wolałbym naprawić główną przyczynę.

dzięki znacznie

+0

'" ssh -l host użytkownika "ls -l abc; echo" DONE "; echo $?" Czy istnieje jakiś szczególny powód, dla którego '' 'before' ls' istnieje? Istnieje również nieparzysta liczba cudzysłowów – Travis

+0

również, eksperymentowałbym z ochroną wartości '$?' Przed przywróceniem wartości bieżącej. Chciałbym wypróbować niektóre odmiany na \ '\ $?', '\\\ $?'. Powodzenia. – shellter

+0

Travis - poprawione cytaty. To był tylko literówka w tym poście. Rzeczywiste wykonanie było poprawne. Wszystkie trzy polecenia są wykonywane po stronie zdalnej. –

Odpowiedz

1

I nie można odtworzyć go, ale może powinieneś spróbować użyć opcji -t dla ssh.

Powiązane problemy