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.exe
okna 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, sshpass
gdy są używane w wierszu polecenia systemu Windows?
c:\cygwin\usr\bin
ic:\cygwin\usr\local\bin
w swojej%PATH%
. Mój działa, ale wykazuje zachowanie opisane w tym pytaniu. Używam,StrictHostKeyChecking
aby uniknąć szybkiej oferty przyjęcia nieznanego klucza, którego nie zobaczysz, jeśli go użyjeszsshpass
- po prostu nie powiedzie się. Proponuję zbudować zwykły staryssh
wiersz poleceń i upewnić się, że działa on czysto przed dodaniem tego wiersza poleceniasshpass -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).Odpowiedzi:
Przyczyna tego nie działa z powodu niekompatybilności przekierowania stdin / stdout między cygwin i natywnymi programami Win32, ale istnieje program otoki,
cygnative
który rozwiązuje problem. Pozwala na użycie pożądanego wiersza poleceń w następujący sposób:(działa to w przypadku poleceń nieinteraktywnych, ale nie w przypadku interaktywnych sesji terminalowych)
Linki do oryginalnego autora
cygnative.exe
nie 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
rsync
PuTTYplink
. Wystąpił błąd: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 .źródło
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:
Jak to działa:
sh
sh
działasshpass
issh
mintty
nie zwraca standardowego wejścia do Windows cmd. Dane wyjściowe są przekierowywane do pliku tymczasowegosh
uruchom na zewnątrzmintty
Niewygodne, ale i tak szukałoby źródła cygnatywnego i kompilowało je.
źródło