รันคำสั่งบนเครื่องคอมพิวเตอร์จากโฮสต์ SSH ระยะไกลที่เชื่อมต่อหรือไม่


13

สมมติว่าฉันได้เชื่อมต่อกับคอมพิวเตอร์ระยะไกลผ่าน SSH จากโปรแกรมในคอมพิวเตอร์ระยะไกลนี้ฉันต้องดำเนินการคำสั่งบนเครื่องคอมพิวเตอร์ของฉัน (ผู้ริเริ่มการเชื่อมต่อ)

ข้อใดที่ทำให้เกิดคำถาม: เป็นไปได้ไหมที่จะใช้การเชื่อมต่อที่มีอยู่ระหว่างคอมพิวเตอร์สองเครื่องเพื่อรันคำสั่งบนเครื่องคอมพิวเตอร์?

ฉันได้พิจารณาใช้คำสั่งssh user@host-of-connecting-party <command>บนคอมพิวเตอร์ระยะไกลเพื่อสร้างการเชื่อมต่อย้อนกลับ แต่การทำเช่นนี้จะทำได้ยากกว่าโดยอัตโนมัติ ฉันหวังว่าฉันสามารถทำให้เป็นแบบอัตโนมัติได้อย่างเต็มที่หรืออย่างน้อยก็ตรวจสอบชื่อผู้ใช้ / ชื่อโฮสต์ของผู้ใช้ที่เชื่อมต่ออยู่


เป็นที่ชัดเจนว่าคุณต้องการทำอะไร สิ่งที่ไม่ชัดเจนสำหรับฉันคือส่วนที่คุณพูดว่า "ฉันหวังว่าฉันจะทำให้มันเป็นอัตโนมัติโดยสมบูรณ์หรืออย่างน้อยก็ตรวจสอบชื่อผู้ใช้ / ชื่อโฮสต์ของผู้ใช้ที่เชื่อมต่อ" คุณหมายถึงอะไร
hytromo

"ยากที่จะทำให้เป็นอัตโนมัติและต้องการการแทรกแซงจากผู้ใช้" มีความหมายเหมือนกันกับ "ปลอดภัย" ในกรณีนี้ หากรีโมตโฮสต์สามารถรันคำสั่งบนไคลเอนต์ที่เชื่อมต่อได้นั่นจะไม่ปลอดภัยอย่างมาก ... ลองนึกภาพว่าเซิร์ฟเวอร์ถูกโจมตีและใครก็ตามที่เชื่อมต่อกับมันจะได้รับเครื่องที่ติดไวรัสในตัว ... จะสนุก :)
Sergey

คำตอบ:


5

บางครั้งฉันมีความต้องการที่คล้ายกันตราบใดที่ฉันเชื่อมต่อผ่าน Putty ไปยังเซิร์ฟเวอร์ VPN ของเราและจากที่นั่นไปยังโฮสต์อื่น ๆ ซึ่งไม่สามารถเข้าถึงได้โดยตรงสำหรับฉันเนื่องจากการตั้งค่า VPN

บางครั้งฉันต้องตรวจสอบบางสิ่งบางอย่างอย่างรวดเร็วบนเครื่องเซิร์ฟเวอร์ VPN ในขณะที่ยังคง "ssh-session" ของฉันทำงานอยู่ วิธีหนึ่งคือการใช้งานเซสชัน ssh screenซึ่งตามที่ฉันสังเกตเห็นให้เพิ่มความล่าช้าในการเปรียบเทียบกับ "ssh ปกติ" อีกวิธีหนึ่งที่ฉันต้องการแบ่งปันที่นี่มีดังต่อไปนี้:

ขณะที่ภายใต้เซสชั่น SSH กดEnterแล้ว~(ให้แน่ใจว่ามันไม่ได้แสดงคือคุณอยู่ในโหมดคำสั่ง) แล้ว-Ctrl Zสิ่งนี้จะทำให้กระบวนการไคลเอนต์ ssh บน "host" เป็นแบ็คกราวน์และคุณจะได้รับสิ่งต่าง ๆ ตาม:

[root@client170 ~]# ~^Z [suspend ssh]

[1]+  Stopped                 ssh root@10.0.0.167
[root@vps291736 ~]#

ตอนนี้คุณอยู่ใน "เจ้าภาพ" สามารถทำสิ่งที่คุณต้องการ ( แต่ผมไม่แน่ใจว่าครั้ง ssh ยาวจะยังมีชีวิตอยู่) แล้วกลับไปที่เซสชั่น SSH fgโดยการเรียกใช้

อย่างน้อยมันก็ใช้ได้กับฉันในขณะที่ฉันเชื่อมต่อจากเวิร์กสเตชัน Win10 ผ่าน Putty บน VM ที่ใช้ CentOS และจากนั้น VM ก็เชื่อมต่อผ่าน SSH ไปยังโฮสต์อื่น ๆ

หวังว่ามันจะช่วยให้ใครบางคน!


2
ถ้าคุณมีPermitLocalCommand yesในของคุณ.ssh/configสำหรับโฮสต์คุณยังสามารถทำแล้ว<Enter>~C !<command>
muru

5

@ คำตอบของ 62mkv เป็นทางออกที่ดีกว่ามาก ใช้มัน

เพื่อความสมบูรณ์และความอยากรู้อยากเห็นหากคุณมีเซิร์ฟเวอร์ ssh ทำงานอยู่ในเครื่องของคุณคุณสามารถสร้าง ssh tunnel เพื่ออนุญาตการเชื่อมต่อ ssh จากรีโมตโฮสต์บนพอร์ต 20202 กลับไปยังโลคอลหนึ่งบนพอร์ต 22 คำสั่งตัวอย่าง:

ssh -R20202:localhost:22 remoteuser@remotehost.com

นี่จะเริ่มการเชื่อมต่อ ssh แต่ยังตั้งค่าช่องสัญญาณกลับไปที่เซิร์ฟเวอร์ ssh ที่ทำงานบนเครื่องของคุณ จากนั้นคุณสามารถทำสิ่งนี้เมื่อ ssh'ed เป็นโฮสต์ระยะไกล:

ssh -p 20202 localuser@localhost

แน่นอนว่าสิ่งนี้อาจทำให้สับสนได้อย่างรวดเร็ว - โดยเฉพาะอย่างยิ่งหากเทคนิคซ้อนกันมากกว่าหนึ่งครั้ง มันเพิ่มบิตของเวลาแฝงด้วยเช่นกันเนื่องจากทุกสิ่งที่คุณเรียกใช้บนเครื่องท้องถิ่นของคุณจะถูกเด้งผ่านรีโมตโฮสต์

ข้อมูลเพิ่มเติมเกี่ยวกับ ssh tunneling สำหรับผู้ที่มีความอยากรู้ยังไม่เป็นที่พอใจสามารถพบได้ในคำตอบสำหรับคำถามยูนิกซ์ stackexchangeนี้


นี่คือคำตอบที่ยอดเยี่ยม สิ่งที่ฉันต้องทำเพื่อ ssh กับเครื่องระยะไกลซึ่งอยู่หลังไฟร์วอลล์และสามารถเข้าถึงได้ผ่านทางทีมมุมมองเท่านั้น ฉันเพิ่งเชื่อมต่อผ่าน teamviewer จากนั้นจากเซสชัน teamviewer กลับไปที่เครื่องของฉันสร้างอุโมงค์ ssh และจากนั้นฉันสามารถเปิดเซสชัน ssh ได้หลายเครื่องจากคอมพิวเตอร์ของฉันจนถึงระยะไกลตามที่ต้องการ
แมเรียน

แน่นอนว่านี่เป็นกรณีใช้ที่ดีกว่าสำหรับอุโมงค์แบบนี้ @Marian ฉันทำสิ่งนี้ด้วยตัวเอง
starbeamrainbowlabs

0

หากทั้งคอมพิวเตอร์ท้องถิ่นและคอมพิวเตอร์ระยะไกลของคุณสามารถเข้าถึงได้จากอินเทอร์เน็ตคุณสามารถเปิดเซสชัน SSH จากคอมพิวเตอร์ท้องถิ่นของคุณบนคอมพิวเตอร์ระยะไกลจากนั้นในเซสชันนั้นให้เปิดเซสชัน ssh อื่นจากคอมพิวเตอร์ระยะไกลบนคอมพิวเตอร์ท้องถิ่น:

localuser@local> ssh remoteuser@remote
Password:
remoteuser@remote> hostname
remote
remoteuser@remote> ssh localuser@local
Password:
localuser@local> hostname
local
localuser@local> exit
remoteuser@remote> exit
localuser@local>

สำหรับสิ่งอัตโนมัติดูที่เนื้อผ้า (จำเป็นต้องมีความรู้ Python)

from fabric.api import *

@hosts('host1')
def clean_and_upload():
    local('find assets/ -name "*.DS_Store" -exec rm '{}' \;')
    local('tar czf /tmp/assets.tgz assets/')
    put('/tmp/assets.tgz', '/tmp/assets.tgz')
    with cd('/var/www/myapp/'):
        run('tar xzf /tmp/assets.tgz')

0

คุณสามารถใช้sshpassเพื่อเชื่อมต่อกับคอมพิวเตอร์ระยะไกลและเรียกใช้คำสั่ง

./sshpass -p "password" ssh user@remoteIP 'bash -s < EOI "Your Commands go here" EOI'

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


0

ไม่คุณไม่สามารถเข้าสู่เซสชันที่มีอยู่ได้

แอปพลิเคชันของคุณต้องการวิธีการเชื่อมต่อกลับไปยังไคลเอนต์ SSH จะทำงานหากไคลเอนต์มีเซิร์ฟเวอร์ SSH ที่ทำงานอยู่และเซิร์ฟเวอร์สามารถเข้าถึงพอร์ต 22 บนไคลเอ็นต์ได้ จะไม่เป็นการยากหากคุณใช้การพิสูจน์ตัวตนแบบใช้คีย์แทนการพิสูจน์ตัวตนด้วยรหัสผ่านวิธีนี้จะไม่จำเป็นต้องมีการแทรกแซงผู้ใช้

ข้อมูลเกี่ยวกับการตั้งค่าการรับรองความถูกต้องตามคีย์สามารถดูได้ที่นี่: http://tombuntu.com/index.php/2008/02/20/public-key-authentication-for-ssh-made-easy/


0

หากคุณสามารถเข้าถึงเทอร์มินัลอื่นคุณสามารถส่ง SIGSTOP โดยใช้ "kill -19 PID" ไปยังคำสั่ง ssh ที่เริ่มต้น conection จากนั้นคุณจะได้รับการควบคุมของเทอร์มินัลในเครื่องบนเครื่องไคลเอนต์ เมื่อเสร็จแล้วคุณสามารถคืนค่าการเชื่อมต่อ ssh เพียงพิมพ์ fg เพื่อปลุกไคลเอ็นต์ ssh

แต่แน่นอนคำถามที่นี่คือ: ถ้าคุณมีเทอร์มินัลบนเครื่องไคลเอ็นต์ทำไมคุณถึงทำเช่นนี้ :)

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