Program Cygwin (sshpass) nie generuje danych wyjściowych, gdy jest używany w wierszu polecenia systemu Windows

6

Mam zbudowany sshpass na Cygwin. Działa idealnie z poziomu okna terminalu Cygwin:

sshpass -p password ssh -o StrictHostKeyChecking=no user@host

Jednak dokładnie to samo polecenie z wiersza polecenia systemu Windows nie generuje danych wyjściowych.

Próbowałem nieinteraktywnego polecenia, aby sprawdzić, czy to zadziałało, ale nie zadziałało:

sshpass -p password ssh -o StrictHostKeyChecking=no user@host ls

Oba działają dobrze ze środowiska Cygwin, ale nie z wiersza polecenia systemu Windows. Działają z wiersza polecenia systemu Windows, ale nie ma danych wyjściowych. Wiem to, ponieważ mogę wydawać polecenia z cmd.exeokna i widzieć efekty na zdalnym hoście. Również zwykły ssh(Cygwin) działa dobrze z wiersza polecenia systemu Windows.

Jak mogę uzyskać dane wyjściowe, sshpassgdy są używane w wierszu polecenia systemu Windows?

rozgwiazdy
źródło
Przekonałem się, że mogę zmienić katalog na lokalizację wbudowanego sshpass.exe. To było jak: C: \ cygwinInstall \ usr \ local \ bin \ sshpass.exe Chociaż nie miałem szczęścia poza tym, że sshpass.exe wydrukował pomoc. Poza tym wszystko, co uruchamiam, wydaje się błędne. Próbowałeś tego?
Andrew
Upewnić się, że zarówno c:\cygwin\usr\bini c:\cygwin\usr\local\binw swojej %PATH%. Mój działa, ale wykazuje zachowanie opisane w tym pytaniu. Używam, StrictHostKeyCheckingaby uniknąć szybkiej oferty przyjęcia nieznanego klucza, którego nie zobaczysz, jeśli go użyjesz sshpass- po prostu nie powiedzie się. Proponuję zbudować zwykły stary sshwiersz poleceń i upewnić się, że działa on czysto przed dodaniem tego wiersza polecenia sshpass -p password. Sprawdziłem mój zarówno z poziomu terminalu Cygwin (który działa dobrze), jak iz wiersza polecenia systemu Windows (który pokazuje opisany problem).
starfry

Odpowiedzi:

5

Przyczyna tego nie działa z powodu niekompatybilności przekierowania stdin / stdout między cygwin i natywnymi programami Win32, ale istnieje program otoki, cygnativektóry rozwiązuje problem. Pozwala na użycie pożądanego wiersza poleceń w następujący sposób:

C:> cygnative sshpass -p password ssh -o StrictHostKeyChecking=no user@host ls

(działa to w przypadku poleceń nieinteraktywnych, ale nie w przypadku interaktywnych sesji terminalowych)

Linki do oryginalnego autora cygnative.exenie są dostępne, ale jest ono dostępne jako źródło C w tej liście lub jako źródło i jest możliwe do wykonania w tym pliku zip .


Odkryłem to rozwiązanie, próbując rozwiązać inny problem , tym razem próbując użyć programu rsyncPuTTY plink. Wystąpił błąd:

Unable to read from standard input: The parameter is incorrect.

co doprowadziło mnie do odkrycia cygnative, ale odnalezienie go było trudne, ponieważ oryginalne linki były martwe.

Problem został opisany tutaj i przedstawia rozwiązanie cygnative, tutaj , ze zaktualizowaną wersją 1.2 tutaj .

rozgwiazdy
źródło
1

Dzięki starfry za wyjaśnienie problemu.

Nie chciałem używać cygnative. Większość linków w Internecie jest martwa. Program nie jest obsługiwany i sam musisz skompilować kod.

Twoje polecenie w Cygwin działa, ponieważ Cygwin używa mintty jako terminala, który poprawnie obsługuje przekierowanie IO.

Obejście, którego użyłem, to nazywanie mennicy w trybie nieinteraktywnym. W wierszu polecenia systemu Windows uruchom coś takiego:

C:\Development\temp> mintty.exe -w hide bash -c "sshpass -p a ssh kshar@localhost ls 2>&1 > /tmp/mintty.log" && sh -c 'cat /tmp/mintty.log; rm /tmp/mintty.log'

Jak to działa:

  1. -w hide mówi mennicy, aby nie wyświetlała żadnego okna interfejsu użytkownika
  2. Mintty działa sh
  3. shdziała sshpassissh
  4. minttynie zwraca standardowego wejścia do Windows cmd. Dane wyjściowe są przekierowywane do pliku tymczasowego
  5. plik tymczasowy jest następnie drukowany przy użyciu polecenia shuruchom na zewnątrzmintty

Niewygodne, ale i tak szukałoby źródła cygnatywnego i kompilowało je.

Kshitiz Sharma
źródło