Windows эквивалент ssh - как подключиться к удаленной машине и получить доступ к командной строке?

19

Мне трудно найти решение для расширения платформы, которая была разработана для * nix машин до окон. В настоящее время платформа работает с одного * nix-сервера и ssh на другие * nix-серверы и выполняет множество различных команд, таких как проверка файлов журналов, синхронизация файлов из системы контроля версий, отправка журналов обратно в систему контроля версий и т. Д. застрял на том, как подключиться к удаленным машинам Windows и получить доступ к командной строке. Соединение может происходить и с другого компьютера с Windows, оно не должно запускаться с компьютера с Unix, оно может переходить с Windows на Windows, а не с Unix на Windows.

Вот пример того, как команды в настоящее время выполняются в системах Unix. Нечто подобное происходит в цикле, который проходит через список имен серверов. Мне нужно, чтобы что-то подобное запускалось на машинах с Windows.

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

Кроме того, я бы предпочел не использовать сторонние инструменты (мой бюджет составляет около $ 0). Я проверил PsExec и пару других, но похоже, что вам нужен доступ администратора или вы должны передать пользователей / передать в виде простого текста.


источник
В принципе, пользователь без прав администратора обычно не может запускать код на удаленной машине. Возможно, вам придется создать собственное решение. Есть ли конкретный контекст, в котором должен выполняться код? Команды будут запускаться одинаково каждый раз?
Гарри Джонстон
Хотя вы можете установить MobaSSH в качестве сервера и использовать putty в качестве клиента, или использовать psexec, чтобы делать что-то более или менее желаемое (что не приветствуется в моем опыте), эквивалентная идиома в мире Windows - не использовать оболочку в все, но полагаться на поддержку командного уровня для удаленного выполнения, будь то устаревшая команда или powershell в сочетании с общими сетевыми ресурсами и подключенными дисками.
Шантева

Ответы:

14

Используйте Powershell Remoting: https://msdn.microsoft.com/en-us/powershell/scripting/core-powershell/running-remote-commands

Бесстыдно скопировано:

Windows PowerShell Remoting

Удаленное взаимодействие Windows PowerShell, использующее протокол WS-Management, позволяет выполнять любую команду Windows PowerShell на одном или нескольких удаленных компьютерах. Он позволяет устанавливать постоянные соединения, запускать интерактивные сеансы 1: 1 и запускать сценарии на нескольких компьютерах. Чтобы использовать удаленное взаимодействие Windows PowerShell, удаленный компьютер должен быть настроен для удаленного управления. После настройки удаленного взаимодействия Windows PowerShell вам доступно множество стратегий удаленного взаимодействия. В оставшейся части этого документа перечислены только некоторые из них.

Начать интерактивный сеанс

Чтобы запустить интерактивный сеанс с одним удаленным компьютером, используйте командлет Enter-PSSession. Например, чтобы запустить интерактивный сеанс с удаленным компьютером Server01, введите:

Enter-PSSession Server01

В командной строке отобразится имя компьютера, к которому вы подключены. С этого момента все команды, которые вы вводите в командной строке, запускаются на удаленном компьютере и результаты отображаются на локальном компьютере.

Чтобы завершить интерактивный сеанс, введите:

Exit-PSSession

Запустите удаленную команду

Чтобы выполнить любую команду на одном или нескольких удаленных компьютерах, используйте командлет Invoke-Command. Например, чтобы запустить команду Get-UICulture на удаленных компьютерах Server01 и Server02, введите:

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

Вывод возвращается на ваш компьютер.

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

Запустить скрипт

Чтобы запустить сценарий на одном или нескольких удаленных компьютерах, используйте параметр FilePath командлета Invoke-Command. Сценарий должен быть включен или доступен для вашего локального компьютера. Результаты будут возвращены на ваш локальный компьютер.

Например, следующая команда запускает сценарий DiskCollect.ps1 на удаленных компьютерах Server01 и Server02.

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

Установить постоянное соединение

Чтобы выполнить ряд связанных команд, которые совместно используют данные, создайте сеанс на удаленном компьютере, а затем используйте командлет Invoke-Command для запуска команд в создаваемом сеансе. Чтобы создать удаленный сеанс, используйте командлет New-PSSession.

Например, следующая команда создает удаленный сеанс на компьютере Server01 и другой удаленный сеанс на компьютере Server02. Сохраняет объекты сеанса в переменной $ s.

$s = new-pssession -computername Server01, Server02

Теперь, когда сеансы установлены, вы можете запустить любую команду в них. А поскольку сеансы являются постоянными, вы можете собирать данные в одной команде и использовать их в следующей команде.

Например, следующая команда запускает команду Get-Hotfix в сеансах в переменной $ s и сохраняет результаты в переменной $ h. Переменная $ h создается в каждом из сеансов в $ s, но не существует в локальном сеансе.

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

Теперь вы можете использовать данные в переменной $ h в последующих командах, таких как следующая. Результаты отображаются на локальном компьютере.

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }
Shanteva
источник
5
Это родной способ сделать это и должен быть принятым ответом ИМХО.
Грегори
SSH использует порт 22 на сервере для подключения. Не могли бы вы помочь мне проверить порт, который использует это решение PowerShell?
Лука
1
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/… 5985-5986 являются значениями по умолчанию, но, как и большинство других вещей, вы можете указать другой порт
Shanteva
4

Попробуйте Tunnellier от Bitvise. Это клиент SSH. Также есть ssh-сервер для подключения к машине с Windows. Два позволяют вам создавать очень безопасные соединения наряду с более сложными вещами, такими как веб-прокси или туннелирование портов.


источник
К сожалению, сервер SSH не является бесплатным.
Гарри Джонстон
4

Установите порт OpenSSH для Windows - это бесплатно и предоставляет как клиент, так и сервер.

Евгений Маевский "Обратный звонок"
источник
1
Однако существуют проблемы с безопасностью - поскольку он использует Cygwin, он не безопасен для нескольких пользователей. (Разве моя информация устарела?)
Гарри Джонстон
1
Microsoft работает над тем, чтобы правильно портировать его на Windows. Но, похоже, это довольно медленный прогресс: blogs.msdn.microsoft.com/powershell/2017/12/15/…
Мартин Браун,
2

Вы можете попробовать psexec, который дает вам удаленную оболочку через сервис общего доступа к файлам (или как это называется). Существует также winexe, если вы хотите использовать Linux в качестве клиента.

юлианский
источник
1

Мне очень нравится идея PowerShell, хотя настройка может занять пару минут на сервере и клиенте.

Помимо полного ответа Shanteva, в котором предлагается использование PowerShell, вы также должны взглянуть на здесь, на сайте howtogeek, о том, как на самом деле включить (и разрешить) удаленное подключение к серверу PowerShell. На компьютере сервера требуется небольшая настройка.

Две важные вещи, которые вам нужно сделать: (Я не должен упоминать, что вы должны выполнять каждую конфигурацию «как администратор», верно? Просто откройте PowerShell / cmd «Как администратор»)

  • Сначала включите службу WINRM (приложение Windows, которое обрабатывает удаленные команды) на СЕРВЕРЕ .

На серверном компьютере откройте PowerShell и запустите:

Enable-PSRemoting -Force

Есть и другой способ сделать это. Вы можете открыть командную строку и запустить:

winrm -quickconfig

Там может быть гораздо больше настроек для изменения. Нет необходимости сейчас.

  • Во-вторых, следует отметить, что клиент и сервер всегда пытаются аутентифицировать друг друга. Сервер хочет убедиться, что клиент действительно разрешил доступ к серверу или нет. Для этого вы собираетесь предоставить некоторую аутентификационную информацию серверу (подобно SSH, вы можете указать имя пользователя / пароль). И наоборот, клиент хочет убедиться, что сервер является доверенным. Можно использовать разные схемы, например, доверять серверу, который предоставляет интеллектуальный публичный сертификат, доверять по IP-адресу или, может быть, просто доверять всем !! Опять же, у нас такая же процедура в SSH, где сервер может предоставить некоторую информацию для аутентификации. (Давайте просто забудем подробности SSH.)

Если оба компьютера находятся в одном и том же «домене» (группа компьютеров, каждому из которых назначены разные правила и роли), процедура кажется простой (я этого не пробовал).

НО, поскольку вы, вероятно, хотите получить доступ к вашему серверу через Интернет (технически называемый сетью WAN), существуют некоторые сложности, и вам необходимо изменить некоторую конфигурацию, чтобы разрешить подключение к удаленному серверу. На компьютере КЛИЕНТА включите службу WINRM. Процедура похожа на то, что мы сделали для сервера выше. Просто запустите команду:

Enable-PSRemoting -Force

(Еще раз примечательно! В некоторых ссылках говорится, что клиентский компьютер и серверный компьютер должны находиться в «частных» сетях, или все это не будет работать. Я получаю сообщения об ошибках, когда запускаю указанную выше команду, но все работает, найдите Я не уверен в этом факте. Проверьте вышеупомянутую веб-страницу.)

Затем запустите на компьютере КЛИЕНТА в PowerShell:

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

Это означает, что клиент будет доверять всем серверам (хостам). Наконец, запустите это (на КЛИЕНТА снова подчеркиваю):

Restart-Service WinRM

Вы готовы к работе. Проверьте остальную часть ответа Шантевой. На компьютере КЛИЕНТА запустите, например:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Он запросит пароль, и откроется удаленная консоль, которая выглядит следующим образом:

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

Затем просто введите команды, как вы делаете для SSH.

Али Накисаи
источник