Windows equivalente a ssh: ¿cómo conectarse a una máquina remota y acceder a la línea de comandos?

19

Me está costando trabajo encontrar una solución para extender un marco diseñado para máquinas * nix a Windows. El marco actualmente se ejecuta desde un servidor * nix y ssh's a otros servidores * nix y realiza un montón de comandos diferentes como verificar archivos de registro, sincronizar archivos desde el control de origen, enviar registros de nuevo al control de origen, etc. pegado es cómo conectarse a las máquinas remotas de Windows y acceder a la línea de comando. La conexión también puede provenir de otra máquina Windows, no tiene que comenzar desde una máquina Unix, puede ir de Windows a Windows en lugar de Unix a Windows.

Aquí hay un ejemplo de cómo los comandos se ejecutan actualmente en sistemas unix. Algo como esto está en un bucle que pasa por una lista de nombres de servidores. Necesito obtener algo como esto para ejecutarlo en máquinas con Windows.

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

Además, preferiría no usar una herramienta de terceros (mi presupuesto es de aproximadamente $ 0). He revisado PsExec y un par de otros, pero parece que necesita acceso de administrador o tiene que pasar usuarios / pasar en texto plano.


fuente
Por diseño, un usuario no administrativo normalmente no puede ejecutar código en una máquina remota. Puede que tenga que construir su propia solución. ¿Hay un contexto específico en el que el código debe ejecutarse? ¿Los comandos se deben ejecutar siempre?
Harry Johnston el
Si bien podría instalar MobaSSH como servidor y usar masilla como cliente, o usar psexec para hacer lo que quiera más o menos (lo cual está mal visto en mi experiencia), el idioma equivalente en el mundo de Windows es no usar un shell en todo, pero confiar en el soporte de nivel de comando para la ejecución remota, ya sea un comando heredado o PowerShell combinado con recursos compartidos de red y unidades mapeadas.
Shanteva

Respuestas:

14

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

Descaradamente copiado pegado:

Windows PowerShell Remoting

La comunicación remota de Windows PowerShell, que utiliza el protocolo WS-Management, le permite ejecutar cualquier comando de Windows PowerShell en una o varias computadoras remotas. Le permite establecer conexiones persistentes, iniciar sesiones interactivas 1: 1 y ejecutar scripts en varias computadoras. Para usar la comunicación remota de Windows PowerShell, la computadora remota debe estar configurada para la administración remota. Después de configurar la comunicación remota de Windows PowerShell, tendrá a su disposición muchas estrategias de comunicación remota. El resto de este documento enumera solo algunos de ellos.

Comience una sesión interactiva

Para iniciar una sesión interactiva con una sola computadora remota, use el cmdlet Enter-PSSession. Por ejemplo, para iniciar una sesión interactiva con la computadora remota Server01, escriba:

Enter-PSSession Server01

El símbolo del sistema cambia para mostrar el nombre de la computadora a la que está conectado. A partir de ese momento, cualquier comando que escriba en el indicador se ejecutará en la computadora remota y los resultados se mostrarán en la computadora local.

Para finalizar la sesión interactiva, escriba:

Exit-PSSession

Ejecute un comando remoto

Para ejecutar cualquier comando en una o varias computadoras remotas, use el cmdlet Invoke-Command. Por ejemplo, para ejecutar un comando Get-UICulture en las computadoras remotas Server01 y Server02, escriba:

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

La salida se devuelve a su computadora.

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

Ejecutar un script

Para ejecutar un script en una o varias computadoras remotas, use el parámetro FilePath del cmdlet Invoke-Command. El script debe estar activado o accesible para su computadora local. Los resultados se devuelven a su computadora local.

Por ejemplo, el siguiente comando ejecuta el script DiskCollect.ps1 en las computadoras remotas Server01 y Server02.

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

Establecer una conexión persistente

Para ejecutar una serie de comandos relacionados que comparten datos, cree una sesión en la computadora remota y luego use el cmdlet Invoke-Command para ejecutar comandos en la sesión que cree. Para crear una sesión remota, use el cmdlet New-PSSession.

Por ejemplo, el siguiente comando crea una sesión remota en la computadora Server01 y otra sesión remota en la computadora Server02. Guarda los objetos de sesión en la variable $ s.

$s = new-pssession -computername Server01, Server02

Ahora que las sesiones están establecidas, puede ejecutar cualquier comando en ellas. Y debido a que las sesiones son persistentes, puede recopilar datos en un comando y usarlos en un comando posterior.

Por ejemplo, el siguiente comando ejecuta un comando Get-Hotfix en las sesiones en la variable $ s y guarda los resultados en la variable $ h. La variable $ h se crea en cada una de las sesiones en $ s, pero no existe en la sesión local.

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

Ahora puede usar los datos en la variable $ h en comandos posteriores, como el siguiente. Los resultados se muestran en la computadora local.

invoke-command -session $s {$h | where {$_.installedby -ne "NTAUTHORITY\SYSTEM"} }
Shanteva
fuente
55
Esta es la forma nativa de hacerlo y debería ser la respuesta aceptada en mi humilde opinión.
Gregory Higley
SSH usa el puerto 22 en el servidor para conectarse, ¿podría ayudarme a verificar el puerto que usa esta solución PowerShell?
Lucas
1
@Luke blogs.technet.microsoft.com/christwe/2012/06/20/… 5985-5986 son los valores predeterminados, pero como la mayoría de las cosas, puede especificar otro puerto
Shanteva
4

Prueba el tunnellier de Bitvise. Ese es un cliente ssh. También hay un servidor ssh para conectarse a una máquina con Windows. Los dos le permiten hacer conexiones muy seguras junto con cosas más avanzadas como un proxy web o un túnel de puerto.


fuente
Lamentablemente, el servidor SSH no es gratuito.
Harry Johnston el
4

Instale el puerto OpenSSH para Windows: es gratuito y proporciona tanto el cliente como el servidor.

Devolución de llamada de Eugene Mayevski
fuente
1
Sin embargo, hay problemas de seguridad, ya que utiliza Cygwin, no es seguro para múltiples usuarios. (¿A menos que mi información esté desactualizada?)
Harry Johnston
1
Microsoft está trabajando en portarlo correctamente a Windows. Pero parece ser un progreso bastante lento: blogs.msdn.microsoft.com/powershell/2017/12/15/…
Martin Brown
2

Puede probar psexec, que le proporciona un shell remoto sobre el servicio de archivos compartidos (o como se llame). También hay winexe si desea utilizar Linux como cliente.

Julian
fuente
1

Realmente me gusta la idea de PowerShell, aunque la configuración puede tardar un par de minutos en el servidor y el cliente.

Además de la respuesta completa de Shanteva, que sugiere el uso de PowerShell, también debe consultar Aquí en el sitio web howtogeek sobre cómo habilitar (y permitir) realmente una conexión remota al servidor PowerShell. Se requiere un poco de configuración en la computadora servidor.

Hay dos cosas importantes que debe hacer: (No tengo que mencionar que debe hacer todas las configuraciones 'como administrador', ¿verdad? Simplemente abra PowerShell / cmd 'Como administrador')

  • Primero, habilite el servicio WINRM (la aplicación de Windows que procesa comandos remotos) en el SERVIDOR .

En la computadora servidor, abra PowerShell y ejecute:

Enable-PSRemoting -Force

También hay otra forma de hacerlo. Puede abrir un símbolo del sistema y ejecutar:

winrm -quickconfig

Podría haber muchas más configuraciones para cambiar. No hay necesidad por ahora.

  • En segundo lugar, cabe destacar que el cliente y el servidor siempre intentan autenticarse mutuamente. El servidor quiere asegurarse de que el cliente realmente haya permitido el acceso al servidor o no. Por este motivo, proporcionará información de autenticación al servidor (similar a SSH, tal vez proporcione nombre de usuario / contraseña). Por el contrario, el cliente quiere asegurarse de que el servidor sea de confianza. Se pueden usar diferentes esquemas, como confiar en un servidor que proporciona un certificado público inteligente o confiar en la dirección IP o tal vez simplemente confiar en todos. Nuevamente tenemos el mismo procedimiento en SSH donde un servidor puede proporcionar cierta información de autenticación. (Olvidemos los detalles de SSH por ahora).

Si ambas computadoras están en el mismo 'dominio' (un grupo de computadoras a las que todos tienen diferentes reglas y roles asignados), el procedimiento parece ser simple (no lo he intentado).

PERO, como probablemente desee acceder a su servidor a través de Internet (técnicamente llamada red WAN), existen algunas complicaciones y debe cambiar alguna configuración para permitir la conexión al servidor remoto. En la computadora CLIENTE habilite el servicio WINRM. El procedimiento es similar a lo que hemos hecho para el servidor anterior. Solo ejecuta el comando:

Enable-PSRemoting -Force

(¡Otra vez digno de mención! Algunas referencias dicen que la computadora cliente y la computadora del servidor deben estar en redes "privadas", o todo no funcionará. Recibo mensajes de error para esto cuando ejecuto el comando anterior pero todo funciona encontrar No estoy seguro de este hecho. Consulte la página web antes mencionada).

Luego, ejecute en la computadora CLIENTE en PowerShell:

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

Lo que significa que el cliente confiará en todos los servidores (hosts). Finalmente, ejecute esto (en el CLIENTE nuevamente enfatizo):

Restart-Service WinRM

Estás listo para partir Verifique el resto de la respuesta de Shanteva. En la computadora CLIENTE, ejecute por ejemplo:

Enter-PSSession -ComputerName 12.34.56.78 -Credential Administrator

Le pedirá una contraseña y se abrirá la consola remota que se ve así:

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

Luego simplemente ingrese los comandos como lo hace para SSH.

Ali Nakisaee
fuente