Mi código .sh no puede ejecutarse. Ayuadame

0
#!/usr/bin/expect -f
set port [lindex $argv 0]
spawn ps xu | grep "ssh -f -N -o ConnectTimeout=5 -D $port" | grep -v grep | awk '{ print $2 }' | xargs kill -9
expect eol

ingrese la descripción de la imagen aquí

Me aseguro de que el 100% del puerto 1234 se esté ejecutando. Porque lo compruebo ps aux | grep ssh. y ver. Entonces, ¿qué hay de malo en mi código? Gracias

Edward Trọng
fuente
Entonces, ¿por qué estás usando exactamente expect?
Daniel B
No sé, soy novato. ¿Me pueden ayudar a arreglar mi código?
Edward Trọng
Cuando ejecute el script, intentará sustituir el argumento # 2 en $ 2. Sin embargo, solo proporcionó 1 argumento. No soy muy competente con los comandos de shell, pero supongo que deberías escapar de $ en el script de esta manera: awk '{print \ $ 2}'
Seyren
Intente simplemente tener esto en su archivo .sh: spawn ps xu | grep "ssh -f -N -o ConnectTimeout = 5 -D $ 1" | grep -v grep | awk '{print \ $ 2}' | xargs kill -9
Seyren
Podrías usar ssh <host> -O exit, ya sabes ...
Grawity

Respuestas:

0

Cuando pones esto en un script de shell, los $ 2 serán reemplazados por el argumento número 2:

                  v This
./myscript.sh one two

Cuando ejecutó su script, no incluyó un segundo argumento.

Sin embargo, esto no viene al caso, porque quieres, específicamente:

awk '{ print $2 }'

Debe escapar del símbolo '$' con '\'.

Esto debería funcionar:

#!/bin/bash
spawn ps xu | grep "ssh -f -N -o ConnectTimeout=5 -D $1" | grep -v grep | awk '{ print \$2 }' | xargs kill -9

La primera línea no era necesaria, ya que el puerto será el primer argumento que puede usar '$ 1' para obtenerlo.

Seyren
fuente
1

esto parece una forma compleja de emitir un kill, si esperar no es obligatorio

#!/bin/bash
ps xu |awk -v port=$1 'index($0,"ssh -f -N -o ConnectTimeout=5 -D " port) > 0 { printf "kill %d\n",$2}' | bash

dónde

  • -v port=$1 variable inicial awk con $ 1
  • index($0,"...") buscará la salida actual de ps para ssh
Archemar
fuente