รหัสของฉัน. sh ไม่สามารถทำงานได้ ช่วยฉันด้วย


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

ป้อนคำอธิบายรูปภาพที่นี่

ฉันแน่ใจว่าพอร์ต 10034 1234 ทำงานอยู่ เพราะฉันตรวจสอบมัน ps aux | grep ssh และดู ดังนั้นในรหัสของฉันคืออะไร ขอบคุณ


ดังนั้นหนอทำไมตรงที่คุณใช้expect?
Daniel B

ฉันไม่รู้มือใหม่ คุณช่วยฉันแก้ไขรหัสได้ไหม
Edward Tr Edwardng

เมื่อคุณเรียกใช้สคริปต์มันจะพยายามแทนที่อาร์กิวเมนต์ # 2 เป็น $ 2 อย่างไรก็ตามคุณให้ 1 อาร์กิวเมนต์เท่านั้น ฉันไม่ค่อยเชี่ยวชาญกับคำสั่งเชลล์ แต่ฉันเดาว่าคุณควรหลีกเลี่ยง $ ในสคริปต์ดังนี้: awk '{print \ $ 2}'
Seyren

ลองแค่นี้ในไฟล์. sh ของคุณ: spawn ps xu | grep "ssh -f -N -o ConnectTimeout = 5 -D $ 1" | grep -v grep | awk '{print \ $ 2}' | xargs kill -9
Seyren

คุณสามารถใช้ssh <host> -O exitคุณรู้ว่า ...
grawity

คำตอบ:


0

เมื่อคุณวางสิ่งนี้ในเชลล์สคริปต์ $ 2 จะถูกแทนที่ด้วยหมายเลขอาร์กิวเมนต์ 2:

                  v This
./myscript.sh one two

เมื่อคุณรันสคริปต์ของคุณคุณไม่ได้รวมอาร์กิวเมนต์ที่สอง

อย่างไรก็ตามนี่คือสิ่งที่นอกเหนือจากจุดเพราะคุณต้องการโดยเฉพาะ:

awk '{ print $2 }'

คุณต้องหลีกเลี่ยงสัญลักษณ์ '$' ด้วย '\'

สิ่งนี้น่าจะใช้ได้:

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

บรรทัดแรกไม่จำเป็นเนื่องจากพอร์ตจะเป็นอาร์กิวเมนต์แรกที่คุณสามารถใช้ '$ 1' เพื่อรับมัน


1

ดูเหมือนว่าจะเป็นวิธีที่ซับซ้อนในการออกการฆ่าหากคาดว่าไม่ได้บังคับ

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

ที่ไหน

  • -v port=$1 ตัวแปร awk เริ่มต้นด้วย $ 1
  • index($0,"...") จะค้นหาผลลัพธ์ปัจจุบันของ ps สำหรับ ssh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.