SSH ไปยังเซิร์ฟเวอร์ดำเนินการคำสั่งและรักษาการเชื่อมต่อ


12

ฉันต้องการเขียนสคริปต์ที่เปิดเทอร์มินัลที่มีแท็บต่าง ๆ เข้าสู่ระบบเซิร์ฟเวอร์ที่ใช้sshในแต่ละแท็บและดำเนินการคำสั่งในแต่ละแท็บ ตัวอย่างเช่นhtop.

สคริปต์ด้านล่างเปิดเทอร์มินัลที่มี 4 แท็บทั้งหมดที่ล็อกอินในเซิร์ฟเวอร์ แต่ถ้าฉันพยายามเพิ่มhtopคำสั่งในcmd=บรรทัดมันจะไม่ทำงานอีกต่อไป ...

#bin/bash

tab="--tab"
cmd="bash -c 'ssh user@host';bash"
foo=""

for i in 1 2 3 4; do
      foo+=($tab -e "$cmd")         
done

gnome-terminal "${foo[@]}"

exit 0

ฉันได้ลองสิ่งนี้ ...

cmd="bash -c 'ssh user@host htop';bash"

... เพราะข้อความssh --helpบอกว่าไวยากรณ์สำหรับsshคือ:

การใช้งาน: ssh [user @] ชื่อโฮสต์ [คำสั่ง]

คำตอบ:


14

ในรูปแบบที่ง่ายที่สุด:

ssh -t user@host "command; bash"

-tเป็นส่วนสำคัญที่นี่ มันบังคับให้โฮสต์เพื่อจัดสรรเทอร์มินัลเสมือนกับกระบวนการซึ่งช่วยให้มันเปิดอยู่

หากคุณเพียงต้องการเรียกใช้ htop บนเซิร์ฟเวอร์ที่โหลดคุณสามารถละเว้นbashจุดสิ้นสุดได้ แต่นั่นหมายความว่าถ้าคุณออกจาก htop คุณจะต้องกลับไปที่เทอร์มินัลท้องถิ่น


ฉันลอง cmd = "bash -c 'ssh -t user @ host htop'; bash" มันใช้งานได้ แต่ถ้าฉันออกจาก htop ฉันจะกลับไปที่ terminal ท้องถิ่นและฉันไม่ต้องการให้สิ่งนี้เกิดขึ้น
Red

1
@Red ตรวจสอบคำพูดของคุณ - พวกเขาอยู่ทุกที่ - คุณต้องจัดกลุ่ม htop และทุบตีด้วยกันเพื่อให้ทั้งคู่ทำงานบนเซิร์ฟเวอร์ระยะไกล bash -c 'ssh -t user@host "htop;bash"'จะดีกว่า แต่ฉันไม่เห็นว่าทำไมคุณจึงพยายามทอดสิ่งนี้ในเสื้อคลุมทุบตีในตอนแรก ไม่จำเป็น - คุณใช้คำสั่งเดียวในเครื่องเท่านั้น
Oli

ขอบคุณตอนนี้มันใช้ได้กับ cmd = "ssh -t user @ host htop; bash"
Red

คำตอบที่ดี แต่ต้องมีสิ่งที่ดีกว่าการใช้ทุบตีเพื่อที่จะไม่ยุติ
mc0e

@ mc0e ขึ้นอยู่กับสิ่งที่คุณต้องการจะทำ คำถามนี้เกี่ยวกับการรับเชลล์ที่มีประโยชน์หลังจากรันคำสั่งของคุณ หากคุณเพียงแค่ต้องการที่จะหยุดคุณสามารถทดแทนสำหรับbash read
Oli
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.