Windowsowy odpowiednik ssh - jak połączyć się ze zdalnym komputerem i uzyskać dostęp do wiersza poleceń?

19

Trudno mi znaleźć rozwiązanie polegające na rozszerzeniu frameworka zaprojektowanego dla komputerów * nix na Windows. Framework działa obecnie z jednego serwera * nix i ssh wychodzi na inne serwery * nix i wykonuje kilka różnych poleceń, takich jak sprawdzanie plików dziennika, synchronizowanie plików z kontroli źródła, przekazywanie dzienników z powrotem do kontroli źródła itp. utknąłem, jak połączyć się ze zdalnymi komputerami z systemem Windows i uzyskać dostęp do wiersza poleceń. Połączenie może pochodzić również z innego komputera z systemem Windows, nie musi zaczynać się od komputera z systemem UNIX, może przechodzić z systemu Windows do Windows zamiast z systemu UNIX do Windows.

Oto przykład, w jaki sposób polecenia są obecnie uruchamiane w systemach uniksowych. Coś takiego znajduje się w pętli, która przechodzi przez listę nazw serwerów. Potrzebuję coś takiego do uruchomienia na komputerach z systemem Windows.

ssh ${user}@${server} "cd /app/app_name/logs; <export source control params>; <submit logs to source control>" >> Log.txt

Ponadto wolałbym nie używać narzędzia innej firmy (mój budżet wynosi około 0 USD). Sprawdziłem PsExec i kilka innych, ale wygląda na to, że potrzebujesz dostępu administratora lub musisz przekazać użytkowników / przekazać zwykłym tekstem.


źródło
Z założenia użytkownik niebędący administratorem nie może normalnie uruchamiać kodu na zdalnym komputerze. Być może będziesz musiał zbudować własne rozwiązanie. Czy istnieje określony kontekst, w którym kod musi działać? Czy polecenia, które należy uruchamiać za każdym razem?
Harry Johnston,
Chociaż możesz zainstalować MobaSSH jako serwer i użyć putty jako klienta lub użyć psexec, aby zrobić cokolwiek chcesz mniej lub bardziej (co jest niezadowolone z mojego doświadczenia), równoważnym idiomem w świecie Windows nie jest używanie powłoki w wszystko, ale poleganie na obsłudze poziomu poleceń dla zdalnego wykonywania, niezależnie od tego, czy jest to starsze polecenie, czy PowerShell w połączeniu z udziałami sieciowymi i mapowanymi dyskami.
Shanteva

Odpowiedzi:

14

Użyj Powershell Remoting: https://msdn.microsoft.com/en-us/powershell/scripting/core-powershell/running-remote-commands

Bezwstydnie wklejone:

Windows PowerShell Remoting

Zdalne narzędzie Windows PowerShell, które korzysta z protokołu WS-Management, pozwala uruchomić dowolne polecenie Windows PowerShell na jednym lub wielu komputerach zdalnych. Umożliwia nawiązywanie trwałych połączeń, uruchamianie interaktywnych sesji 1: 1 i uruchamianie skryptów na wielu komputerach. Aby korzystać z usługi Windows PowerShell, komputer zdalny musi być skonfigurowany do zdalnego zarządzania. Po skonfigurowaniu zdalnego programu Windows PowerShell dostępnych jest wiele strategii. W pozostałej części tego dokumentu wymieniono tylko kilka z nich.

Rozpocznij sesję interaktywną

Aby rozpocząć sesję interaktywną z jednym komputerem zdalnym, użyj polecenia cmdlet Enter-PSSession. Na przykład, aby rozpocząć sesję interaktywną z komputerem zdalnym Server01, wpisz:

Enter-PSSession Server01

Wiersz polecenia zmienia się, aby wyświetlić nazwę komputera, z którym jesteś połączony. Od tego momentu wszelkie polecenia wpisywane po wyświetleniu monitu będą uruchamiane na komputerze zdalnym, a wyniki będą wyświetlane na komputerze lokalnym.

Aby zakończyć sesję interaktywną, wpisz:

Exit-PSSession

Uruchom polecenie zdalne

Aby uruchomić dowolne polecenie na jednym lub wielu komputerach zdalnych, użyj polecenia cmdlet Invoke-Command. Na przykład, aby uruchomić polecenie Get-UICulture na komputerach zdalnych Server01 i Server02, wpisz:

invoke-command -computername Server01, Server02 {get-UICulture}

Dane wyjściowe są zwracane do komputera.

LCID    Name     DisplayName               PSComputerName
----    ----     -----------               --------------
1033    en-US    English (United States)   server01.corp.fabrikam.com
1033    en-US    English (United States)   server02.corp.fabrikam.com

Uruchom skrypt

Aby uruchomić skrypt na jednym lub wielu komputerach zdalnych, użyj parametru FilePath polecenia cmdlet Invoke-Command. Skrypt musi być włączony lub dostępny dla twojego komputera lokalnego. Wyniki są zwracane na komputer lokalny.

Na przykład następujące polecenie uruchamia skrypt DiskCollect.ps1 na komputerach zdalnych Server01 i Server02.

invoke-command -computername Server01, Server02 -filepath c:\Scripts\DiskCollect.ps1

Nawiąż trwałe połączenie

Aby uruchomić serię powiązanych poleceń, które współużytkują dane, utwórz sesję na komputerze zdalnym, a następnie użyj polecenia cmdlet Invoke-Command, aby uruchomić polecenia w utworzonej sesji. Aby utworzyć sesję zdalną, użyj polecenia cmdlet New-PSSession.

Na przykład następujące polecenie tworzy sesję zdalną na komputerze Server01 i kolejną sesję zdalną na komputerze Server02. Zapisuje obiekty sesji w zmiennej $ s.

$s = new-pssession -computername Server01, Server02

Po ustanowieniu sesji możesz uruchomić w nich dowolne polecenie. A ponieważ sesje są trwałe, możesz gromadzić dane w jednym poleceniu i używać ich w kolejnym poleceniu.

Na przykład następujące polecenie uruchamia polecenie Get-Hotfix w sesjach w zmiennej $ s i zapisuje wyniki w zmiennej $ h. Zmienna $ h jest tworzona w każdej sesji w $ s, ale nie istnieje w sesji lokalnej.

invoke-command -session $s {$h = get-hotfix}

Teraz możesz używać danych w zmiennej $ h w kolejnych poleceniach, takich jak poniższe. Wyniki są wyświetlane na komputerze lokalnym.

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }
Shanteva
źródło
5
Jest to rodzimy sposób na zrobienie tego i powinna to być akceptowana odpowiedź IMHO.
Gregory Higley,
SSH używa portu 22 na serwerze, aby się połączyć. Czy możesz mi pomóc w sprawdzeniu portu tego rozwiązania PowerShell?
Łukasza
1
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/… 5985-5986 to wartości domyślne, ale podobnie jak większość rzeczy, możesz podać inny port
Shanteva
4

Wypróbuj tunnellier od Bitvise. To jest klient ssh. Istnieje również serwer ssh do łączenia się z komputerem z systemem Windows. Oba umożliwiają nawiązanie bardzo bezpiecznych połączeń wraz z bardziej zaawansowanymi rzeczami, takimi jak serwer proxy sieci Web lub tunelowanie portów.


źródło
Niestety serwer SSH nie jest darmowy.
Harry Johnston,
4

Zainstaluj port OpenSSH dla Windows - jest bezpłatny i zapewnia zarówno klienta, jak i serwer.

Oddzwonienie Eugeniusza Mayevskiego
źródło
1
Istnieją jednak problemy z bezpieczeństwem - ponieważ używa Cygwin, nie jest bezpieczny dla wielu użytkowników. (Chyba że moje informacje są nieaktualne?)
Harry Johnston,
1
Microsoft pracuje nad poprawnym przeniesieniem go do systemu Windows. Ale wydaje się, że postęp jest dość powolny: blogs.msdn.microsoft.com/powershell/2017/12/15/…
Martin Brown
2

Możesz spróbować psexec, który daje zdalną powłokę nad usługą udostępniania plików (lub jak się to nazywa). Istnieje również winexe, jeśli chcesz używać Linuksa jako klienta.

juliański
źródło
1

Naprawdę podoba mi się pomysł PowerShell, chociaż konfiguracja może potrwać kilka minut na serwerze i kliencie.

Oprócz pełnej odpowiedzi Shanteva, która sugeruje użycie PowerShell, powinieneś również rzucić okiem na Tutaj na stronie howtogeek, w jaki sposób faktycznie włączyć (i Zezwól) na zdalne połączenie z serwerem PowerShell. Na serwerze jest wymagana niewielka konfiguracja.

Dwie ważne rzeczy, które musisz zrobić: (Nie muszę wspominać, że musisz wykonać każdą konfigurację „jako administrator”, prawda? Wystarczy otworzyć PowerShell / cmd „Jako administrator”)

  • Najpierw włącz usługę WINRM (aplikacja systemu Windows przetwarzająca polecenia zdalne) na SERWERZE .

Na komputerze serwera otwórz PowerShell i uruchom:

Enable-PSRemoting -Force

Można to zrobić również w inny sposób. Możesz otworzyć wiersz polecenia i uruchomić:

winrm -quickconfig

Może być o wiele więcej konfiguracji do zmiany. Na razie nie ma takiej potrzeby.

  • Po drugie, warto zauważyć, że klient i serwer zawsze próbują się uwierzytelnić. Serwer chce się upewnić, że klient rzeczywiście zezwolił na dostęp do serwera, czy nie. W tym celu podasz serwerowi pewne informacje uwierzytelniające (podobnie jak SSH, być może podasz nazwę użytkownika / hasło). I odwrotnie, klient chce się upewnić, że serwer jest zaufany. Można stosować różne schematy, takie jak zaufanie do serwera, który zapewnia inteligentny certyfikat publiczny lub zaufanie oparte na adresie IP, a może po prostu zaufanie wszystkim !! Ponownie mamy taką samą procedurę na SSH, gdzie serwer może dostarczyć pewne informacje uwierzytelniające. (Na razie zapomnijmy o szczegółach SSH).

Jeśli oba komputery znajdują się w tej samej „domenie” (grupie komputerów, do których wszyscy mają przypisane inne reguły i role), procedura wydaje się prosta (nie próbowałem tego).

ALE, ponieważ prawdopodobnie chcesz uzyskać dostęp do serwera przez Internet (technicznie nazywany siecią WAN), istnieją pewne komplikacje i musisz zmienić konfigurację, aby umożliwić połączenie ze zdalnym serwerem. Na komputerze KLIENTA włącz usługę WINRM. Procedura jest podobna do tej, którą zrobiliśmy dla serwera powyżej. Po prostu uruchom polecenie:

Enable-PSRemoting -Force

(Znowu warte uwagi! Niektóre odniesienia mówią, że komputer kliencki i serwer musi znajdować się w sieci „prywatnej”, inaczej wszystko nie będzie działać. Otrzymuję komunikaty o błędach po uruchomieniu powyższego polecenia, ale wszystko działa Nie jestem tego pewien. Sprawdź wyżej wspomnianą stronę internetową).

Następnie uruchom na komputerze KLIENTA w PowerShell:

Set-Item wsman:\localhost\client\trustedhosts *

Co oznacza, że ​​klient będzie ufał wszystkim serwerom (hostom). Na koniec uruchom to ( ponownie podkreślam na KLIENCIE ):

Restart-Service WinRM

Jesteś gotowy do pracy. Sprawdź resztę odpowiedzi Shantevy. Na komputerze KLIENTA uruchom na przykład:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Poprosi o hasło i otworzy się zdalna konsola, która wygląda następująco:

[12.34.56.78]: PS C:\Users\Administrator\Documents>

Następnie po prostu wprowadź polecenia takie jak w przypadku SSH.

Ali Nakisaee
źródło