Cree un archivo por lotes o acceso directo a PuTTY (ssh) que abra una sesión y ejecute un comando

10

A menudo me encuentro abriendo una sesión SSH para ejecutar el mismo comando único. Tengo todo configurado para iniciar sesión sin ingresar una contraseña (a través de SSH Key-Based Auth), por lo que me pregunté si había una manera de crear un acceso directo o un archivo por lotes en Windows que cargara PuTTY o un programa similar, luego disparó eso comando (y probablemente salga si el resultado es bueno).

FreeSoftwareServers
fuente

Respuestas:

14

Use la versión PuTTY de la línea de comandos plink.exepara iniciar una conexión SSH a un host de elección. Use el -sshinterruptor para conectarse con SSH. Con el -minterruptor puede incluir un archivo de comando:

plink.exe -ssh host1 -m C:\path\to\commands.txt

Puedes descargar plink.exedesde aquí.

El último paso sería crear un acceso directo incluso plink.execon los parámetros deseados.

Consulte la documentación de Plink para ver otros parámetros: documentación de Plink.exe

Smeerpijp
fuente
1
No es necesario usar el -minterruptor con Plink, ya que permite especificar el comando directamente en su línea de comando, vea mi respuesta .
Martin Prikryl
Elijo esta respuesta porque prefiero usar la -ssh host1que se relaciona con Putty Profile vsuser@host
FreeSoftwareServers
@FreeSoftwareServers No hay diferencia para PuTTY a este respecto. Puede hacer plink site commandlo mismo que con PuTTY (excepto para command). Plink and PuTTY tiene básicamente el mismo conjunto de opciones de línea de comandos.
Martin Prikryl
8

Para automatizar la ejecución de un comando, use Plink (del paquete PuTTY) , no PuTTY en sí.

Plink acepta un comando en su línea de comando:

plink.exe user@host command

Si desea seguir usando PuTTY, puede usar el -minterruptor para especificar un archivo de comando (Plink también admite el -minterruptor).

Martin Prikryl
fuente
Cuando dije que no tenía contraseña, debería haber especificado que quería decir con SSH Key-based Auth, pero pensé que se supondría. No creo que esto funcione como es, necesitaría parámetros añadidos como -i keyo-pw password
FreeSoftwareServers
@FreeSoftwareServers No hay diferencia para PuTTY a este respecto. Puede hacer plink site commandlo mismo que con PuTTY (excepto para command). Plink and PuTTY tiene básicamente el mismo conjunto de opciones de línea de comandos.
Martin Prikryl
su respuesta no incluía las opciones para usar SSH Key Based Auth, también conocido como inicio de sesión PWDless, aunque existen los indicadores correctos, los encontré en las páginas de manual para plink que se incluyeron en la respuesta de MrPowerUsers, entiendo que ambos podrían funcionar, pero la respuesta de los usuarios de MrPower se ajusta a mi pregunta mejor y enlazó las páginas man también
FreeSoftwareServers
6

Puede usar configuraciones de masilla para lograr esto.

Cargue masilla y configure su sesión.

Ingrese el comando remoto que desea ejecutar aquí:

Cuadro de comando remoto de masilla

Luego, antes de hacer clic en " Abrir ", regrese a la pestaña " Sesión " (en la parte superior) y guarde su configuración.

Ahora, cree un acceso directo a putty.exe, agregando la -loadbandera, por ejemplo:

%PATH_TO_PUTTY%\putty.exe -load my_config

Ahora, puede hacer clic en el acceso directo y cargará su sesión, ejecutando su comando.

Attie
fuente
Ve impresionante, enfermo examen mañana, supongo que simplemente voy a ejecutar una secuencia de comandos y puede terminar la sesión en base a los resultados de la escritura
FreeSoftwareServers
Sí, la sesión finalizará cuando finalice el comando. Si desea que PuTTY se quede una vez hecho (por ejemplo: para inspeccionar la salida), configure " Cerrar ventana al salir " en la pestaña " Sesión ".
Attie
2

Si usa Windows 10, es posible que le interese saber que, según los informes, Microsoft tiene una versión beta de OpenSSH (cliente y servidor ):

[…] Vaya a "Administrar funciones opcionales" y luego + "Agregar una función". Luego, puede desplazarse hacia abajo en la lista y encontrar las características de OpenSSH Client (Beta) y OpenSSH Server (Beta) en Windows. La idea de ejecutar otro servicio remoto en Windows puede ser desalentadora, por lo que no le culpamos si no desea instalar el servidor.

Una vez instalado, simplemente puede iniciar su línea de comando y usar el cliente OpenSSH escribiendo ssh seguido del comando como ssh ubuntu@someIP.

Aquí está la sshguía de uso de comandos actual (a partir del 28 de noviembre de 2017) que estamos obteniendo con el cliente Windows OpenSSH:

C:\WINDOWS\system32>ssh
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-J [user@]host[:port]] [-L address] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
           [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]
C:\WINDOWS\system32>

Si esto funciona, debería poder usar sshcomo lo haría en un * Nix:

C:\WINDOWS\system32>ssh user@host "ls -l ~"
Michael - ¿Dónde está Clay Shirky?
fuente
Es realmente genial saberlo, pero me encanta SuperPuTTY. También vigilaré Windows OpenSSH.
FreeSoftwareServers
¿Necesita tener el cliente ssh en la máquina en la que se está conectando? Pregunto porque algunas de las máquinas en las que me remoto no son Windows 10.
Nelda.techspiress
1
@ Nelda.techspiress Sólo es necesario que el servidor se ejecuta en máquinas que se conecte a y sólo necesita el cliente en las máquinas que se conecte a. (En consecuencia, si inicia sesión en una máquina como proxy para saltar a otra, esa máquina intermedia necesitará ambas)
Michael: ¿Dónde está Clay Shirky el
2

Solo pensé en insertar el guión que hice para, con suerte, ahorrarle a algunas personas horas de sintaxis e investigación de la página de manual

a) Archivo SingleIP, IP Range o IPList

b) nombre de script para ejecutar en el IP / rango (script de tipo sh / ksh de Unix real)

c) opcionalmente, haga un escaneo nmap para el puerto 22 abierto (es decir, subred con algunas máquinas que no sean Linux)

-Quiero evitar que IP putty no pueda conectarse, evitando que el script pueda continuar correctamente

d) opcionalmente, ejecute el comando pscp para autocachear la clave del host (la masilla no hace esto automáticamente)

Este lote asume:

1. tiene instalado el paquete completo PuTTY y la clave SSH en C: \ Archivos de programa \ PuTTY \

2. archivos por lotes / scripts / IPlist instalados en C: \ Archivos de programa \ PuTTY \ scripts \

3. Los directorios de trabajo NMAP y PuTTY están en su ruta de comando

https://www.harmonyhit.com/PuttyBatch.bat

Esto es principalmente útil para tener un solo script (como actualizar un certificado SSL) en una variedad de máquinas

Aquí está el archivo por lotes completo:

@ECHO OFF

rem Debe modificar la sección CACHEKEY y SCRIPT para reflejar la ubicación de su clave SSH

establecer IPFILE = IPList_temp.txt
establecer runagain = n
establecer OPCIÓN = 1
establecer RANGE =
establecer IP =
establecer SCAN = n
establecer KEYCACHE = n

:OPCIÓN
CLS
ECHO (el directorio de trabajo está configurado en C: \ Archivos de programa \ PuTTY \ scripts \)
ECO. 
ECHO 1. IP única
ECHO 2. Archivo de lista de IP
ECHO 3. Rango de IP
ECO.
set / p OPTION = "Elija el tipo de IP:"
SI% OPCIÓN% == 3 GOTO IPRANGE
IF% OPTION% == 2 GOTO IPLIST
IF% OPTION% == 1 GOTO SINGLEIP
echo Seleccione una opción válida
OPCIÓN GOTO

: IPRANGE
ECHO Ingrese los rangos de IP como en el siguiente ejemplo. Use un espacio entre múltiples rangos:
ECHO, es decir, "10.21.0.15-99 10.21.1.15-100"
set / p RANGE = Ingrese el rango: 
echo% RANGE%>% IPFILE%
GOTO SCRIPTNAME

: SINGLEIP
set / p IP = Ingrese IP:
echo% IP%>% IPFILE%
GOTO SCRIPTNAME

: IPLIST
set / p IP = Ingrese el nombre del archivo IPList:
copiar / Y% IP%% IPFILE%
GOTO SCRIPTNAME

: SCRIPTNAME
set / p SCRIPT = Ingrese el nombre del script:
si no existe% SCRIPT% (
echo nombre de archivo no existe!
GOTO SCRIPTNAME)

ECO.
set / p SCAN = ¿Escanea Nmap primero? (recomendado):
if% SCAN% == n GOTO: RUNCACHE

rem Compruebe si el tipo de IP es "rango" ya que nmap no puede leer un rango de IP del archivo y debe escribirse directamente en el comando nmap
IF% OPTION% == 3 GOTO NMAPRANGE 
: NMAP
echo Escaneo de IP para el puerto 22 abierto ...
nmap --open -n -p22 -iL% IPFILE% -oG - | Findstr / E Up> nmap_temp.txt
GOTO AFTERNMAP

: NMAPRANGE
echo Escaneo de IP para el puerto 22 abierto ...
nmap --open -n -p22% RANGE% -oG - | Findstr / E Up> nmap_temp.txt

: AFTERNMAP
echo HECHO
El formato rem nmap no es correcto, lo siguiente elimina información adicional
para / f "tokens = 2" %% A en (nmap_temp.txt) do echo %% A >> nmap_temp2.txt
rem elimina el espacio oculto al final de la IP (requiere que "repl" esté en el directorio de archivos por lotes)
escriba "nmap_temp2.txt" | repl "" "">% IPFILE%

: RUNCACHE
set / p KEYCACHE = Escanear y almacenar en caché la clave SSH (y / n)?
if% KEYCACHE% == n GOTO SCRIPT

: CACHEKEY
rem Ejecutar a través de todas las IP para almacenar en caché la clave de host SSH si aún no está en caché
para / F "tokens = *" %% A en (% IPFILE%) do (echo y | "C: \ Program Files \ PuTTY \ pscp.exe" -l root -i "C: \ Program Files \ PuTTY \ SSH .ppk "-touch %% A: / tmp / test)

:GUIÓN
para / F "tokens = 1" %% A en (% IPFILE%) do ("C: \ Archivos de programa \ PuTTY \ putty.exe" -ssh %% A -t -l root -i "C: \ Archivos de programa \ PuTTY \ SSH.ppk "-m" C: \ Archivos de programa \ PuTTY \ scripts \% SCRIPT% ")
si existe nmap_temp.txt (del nmap_temp.txt)
si existe nmap_temp2.txt (del nmap_temp2.txt)
set / p runagain = "Presione Enter para finalizar o y para volver a ejecutar"
if% runagain% == y GOTO OPTION
Todd Porter
fuente
1
Las respuestas de solo enlace están mal vistas, ¿y si su sitio deja de funcionar? Si quieres contribuir, comparte el guión aquí. Le invitamos a publicar una fuente / enlace al sitio junto con el código aquí, pero las respuestas deben ser independientes y no requieren los siguientes enlaces.
FreeSoftwareServers
1
contenido del lote pegado
Todd Porter
No "autocachear" una clave de host. Verificar la clave de host es una parte integral de asegurar su sesión SSH. PuTTY (y sus herramientas) no le piden la clave de host para divertirse o acosarlo. Tiene una razon! + Tampoco debe almacenar los datos del usuario ( SSH.ppky la ) to carpeta de archivos de programa del script.)
Martin Prikryl
¿Me puede recomendar cómo ejecutar un script en varias direcciones IP sin él? a) esto no está destinado a un escritorio de usuario típico, más para un servidor de administración donde la seguridad es más quién tiene acceso al servidor b) ¿cuál es exactamente el riesgo de seguridad? El almacenamiento en caché de la clave de host es opcional y solo debe hacerse una vez en todo el rango. Si ejecuta el script nuevamente sin almacenar en caché la clave, aún verá cambios en la clave del host y el script no continuará ...
Todd Porter
...... De acuerdo con la clave tú. Apunto a una carpeta compartida en nuestro NAS donde vive la carpeta compartida, a la que solo yo tengo acceso. Acabo de elegir un camino ya que otros usuarios serán diferentes
Todd Porter
1

También puede buscar software como mRemoteNG, MOBAxTerm o SecureCRT que administrará sus conexiones SSH por usted, esto también se vincula con las sesiones PuTTY guardadas para que pueda aplicar una plantilla a la sesión.

Gubbins
fuente
0

Este es el "CMD" final que puedo guardar en mi FileServer y crear un acceso directo en mi escritorio.

::FreeSoftwareServers
::Automated Opening of SSH Tunnel & Execute CMD on Remote Host
::/superuser/1278434/create-a-batch-file-or-shortcut-to-putty-ssh-that-opens-a-session-and-runs-a-c

set puttydir="C:\Program Files\PuTTY"
set exe=plink.exe
::Profile must exist in PuTTY
set remotehost=FileServer
set remotecmd="chmod 777 /mnt/mdadm/torrents -R"

cd %puttydir% 

%exe% %remotehost% %remotecmd%

::Test First Manually in CMD Prompt
::Note Remote Host does NOT have access to BashRC Alias's
::start "C:\Program Files\PuTTY\" plink.exe -ssh FileServer touch /tmp/testfile
::start "C:\Program Files\PuTTY\" plink.exe -ssh FileServer ~/script.sh
FreeSoftwareServers
fuente