เชลล์สคริปต์คำสั่งระยะไกลผ่าน ssh


3

ฉันพยายามสร้างเชลล์สคริปต์ซึ่งจะดำเนินการคำสั่งบางอย่างที่ฉันต้องการบ่อยๆ ฉันทำการล็อกอิน ssh เพื่อข้ามการถามรหัสผ่านโดยใช้คู่คีย์สาธารณะ / ส่วนตัว และหลังจากการค้นหาบางอย่างฉันสามารถรันโค้ดบางอย่างเช่น:

ไฟล์: ssh.sh

ssh -X root@172.16.0.1 << EOF
cd /root/myDir
gedit a.c b.c
EOF

แต่ฉันไม่เห็นความแตกต่างถ้าฉันชอบ:

ssh -X root@172.16.0.1 << EOF
cd /root/myDir
gedit a.c b.c &
EOF

&ไม่ได้ทำให้ difference.With ใด ๆ&โดยทั่วไปหลังจากรัน Gedit ก็จะถูกส่งไปยังพื้นหลังและพร้อมรับคำจะมา แต่ฉันไม่ได้รับพรอมต์หลังจาก gedit (แม้ว่าจะมีสิ่งใดในบรรทัดถัดไปที่กำลังถูกประหารชีวิตเช่นเดียวกับที่ฉันใส่echo "Hello"มันกำลังแสดงHelloอยู่)

เกิดอะไรขึ้นที่นี่? มีวิธีอื่นอีกไหม? ฉันต้องการทำ SSH และดำเนินการคำสั่งผ่านเชลล์สคริปต์ แต่ฉันไม่ต้องการออกจากระบบหลังจากที่สคริปต์เชลล์ทำงานเสร็จสิ้น ฉันต้องการออกจากระบบด้วยตนเองหลังจากดำเนินการคำสั่งของฉันซึ่งไม่ซ้ำเหมือนสคริปต์ด้านบน


คุณคาดหวังว่าจะเกิดอะไรขึ้นและเกิดอะไรขึ้นแทน?
lcd047

ฉันคาดหวังด้วย&ฉันจะได้รับพรอมต์โดยการส่งgeditภาพพื้นหลัง แต่ฉันไม่ได้รับการตอบกลับ
RatDon

นั่นเป็นเพราะsshได้รับในEOF stdinการเชื่อมต่อยังคงเปิดอยู่เพราะgeditยังทำงานอยู่ แต่เชลล์หายไป
lcd047

@ lcd047 อัปเดตคำถามที่ฉันต้องการและคาดหวัง หากไม่มี EOF ฉันไม่สามารถเปิด gedit จากระยะไกลได้ เมื่อ ssh ถูกเรียกใช้งานจากนั้นเมื่อฉันออกจากระบบส่วนที่เหลือจะถูกเรียกใช้งานในเครื่อง มีทางเลือกอื่นอีกไหม?
RatDon

1
จากนั้นฉันแนะนำให้เรียกใช้tmuxบนเซิร์ฟเวอร์และใช้โปรแกรมแก้ไขโหมดข้อความ คุณสามารถแยกออกtmuxจากเทอร์มินัลและปล่อยให้มันรันหลังจากที่คุณออกจากsshและแนบอีกครั้ง
lcd047

คำตอบ:


3

หากไม่มี&สคริปต์ที่คุณกำลังเรียกใช้จากระยะไกลจะพูดว่า“ เปลี่ยนเป็น/root/myDirจากนั้นดำเนินการgeditและรอจนกว่าจะออก” ตัวแปรที่มีข้อความแจ้ง&ว่าไม่ต้องรอgeditให้ออก ไม่ว่าจะด้วยวิธีใดเชลล์จะออกเมื่อดำเนินการคำสั่งสุดท้ายในสคริปต์

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

ssh -Xt root@172.16.0.1 'cd /root/myDir && gedit a.c b.c; exec bash'

ตัวเลือก-tบอก SSH ให้ตั้งค่าเทอร์มินัลเสมือนบนเซิร์ฟเวอร์ โดยค่าเริ่มต้นจะไม่ทำอย่างนั้นเมื่อคุณส่งคำสั่งระยะไกลเพื่อดำเนินการ exec bashในตอนท้ายบอกให้เชลล์แทนที่ตัวเองด้วยอินสแตนซ์ใหม่ของ bash ซึ่งจะเป็นเชลล์แบบโต้ตอบ (แสดงพรอมต์, ฟังคำสั่งของคุณ ฯลฯ ) เนื่องจากอินพุตนั้นมาจากเทอร์มินัล


0

คุณสามารถกำหนดแล้วรันว่ากว่าfunctionssh

#!/bin/bash
ssh_func(){

    cd /root/myDir
    gedit a.c b.c
}

ssh -X root@172.16.0.1 "$(typeset -f); ssh_func"

typeset -f จะแสดงฟังก์ชั่นที่กำหนดไว้ในสคริปต์

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