Uruchom mój kod .sh cant. Pomóż mi

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

enter image description here

Upewniam się, że działa 100% port 1234. Ponieważ sprawdzam to ps aux | grep ssh. i zobaczyć. Więc co złego w moim kodzie? Podziękować

Edward Trọng
źródło
Więc, dlaczego właściwie używasz expect?
Daniel B
Nie wiem, czy jestem nowicjuszem. Czy możesz mi pomóc naprawić mój kod?
Edward Trọng
Po uruchomieniu skryptu spróbuje on zastąpić argument # 2 na 2 $. Jednak podałeś tylko 1 argument. Nie jestem zbyt biegły w komendach powłoki, ale zgaduję, że powinieneś uciec z $ w skrypcie w ten sposób: awk '{print $ 2}'
Seyren
Spróbuj po prostu mieć to w swoim pliku .sh: spawn ps xu | grep "ssh -f -N -o ConnectTimeout = 5 -D $ 1" | grep -v grep | awk '{print 2 $}' | xargs zabijają -9
Seyren
Możesz użyć ssh <host> -O exit, wiesz...
grawity

Odpowiedzi:

0

Kiedy umieścisz to w skrypcie powłoki, $ 2 zostanie zastąpione argumentem numer 2:

                  v This
./myscript.sh one two

Po uruchomieniu skryptu nie podałeś drugiego argumentu.

Jest to jednak oprócz tego, ponieważ chcesz, a konkretnie:

awk '{ print $2 }'

Musisz uciec od symbolu „$” za pomocą „”.

To powinno działać:

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

Pierwsza linia nie była konieczna, ponieważ port będzie pierwszym argumentem, którego można użyć „$ 1”, aby go pobrać.

Seyren
źródło
1

wygląda to na skomplikowany sposób na zabicie, jeśli nie jest to wymagane

#!/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

gdzie

  • -v port=$1 początkowa zmienna awk z 1 $
  • index($0,"...") przeszuka bieżące wyjście ps dla ssh
Archemar
źródło