Ssh, เรียกใช้คำสั่งในการเข้าสู่ระบบและจากนั้นเข้าสู่ระบบอยู่หรือไม่


29

ฉันลองสิ่งนี้ด้วยความคาดหวัง แต่มันใช้งานไม่ได้: มันปิดการเชื่อมต่อในตอนท้าย

เราสามารถเรียกใช้สคริปต์ผ่าน ssh ซึ่งจะเข้าสู่เครื่องระยะไกลเรียกใช้คำสั่งและไม่ตัดการเชื่อมต่อ?

ดังนั้น ssh ในเครื่อง, cd ไปที่ไดเรคทอรีดังกล่าว, แล้วเรียกใช้คำสั่ง, และอยู่ในระบบต่อไป.

-Jonathan

(คาดว่าฉันใช้)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact

9
มันเป็นเพียงฉันหรือคุณ "อัตโนมัติ" การตรวจสอบรหัสผ่านด้วยวิธีนี้แทนที่จะใช้ pubkeys หรือวิธีการที่มีเหตุผลอื่น ๆ ?
grawity

คำตอบ:


25

เพิ่ม; /bin/bashไปยังจุดสิ้นสุดของบรรทัดคำสั่งของคุณในด้านระยะไกลหรือไม่ นั่นคือ:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"

ยิ่งกว่านั้นเปลี่ยน. bashrc ของรูทให้เป็นแบบนี้:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"

:)


2
คุณอาจต้องการเพิ่ม-iใน bash นั้น
เท็ดดี้

Yeh ผมคิดว่า :)
บิลไวส์

เมื่อฉันทำเช่นนั้นความสมบูรณ์ของแท็บจะแตกในเชลล์ใหม่ (แม้จะมี "-i") - มีความคิดใดที่จะแก้ไขได้อย่างไร
Coderer

1
ฉันทดสอบคำตอบใหม่ของฉันที่นี่มันใช้งานได้ดี หยาบเล็กน้อย แต่ใช้งานได้
Bill Weiss


4

ถ้าคุณทำสิ่งนี้ได้ใน Python pexpectก็มีตัวอย่างที่ทำตามที่คุณต้องการ

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

ในการทำเช่นนี้กับ ssh แทนที่จะเป็น ftp คุณจะต้องการโค้ดที่คล้ายกับสิ่งต่อไปนี้ (ไฟล์ตัวอย่างใน pexpect มีรายละเอียดและข้อมูลมากมาย แต่นี่คือพื้นฐาน):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.

อย่าเข้าใจฉันผิดฉันชอบที่จะคาดหวัง (โดยเฉพาะอย่างยิ่ง autoexpect) แต่หลามก็ง่ายขึ้นกว่าที่ฉันจะบ่น


ฉันก็กำลังเปลี่ยนจากที่คาดหวังเป็น pexpect หลามตอนนี้แพร่หลายมากขึ้น
JM Becker

4

วิธีที่ง่ายและสะอาดที่สุดในการ ssh ไปยังเซิร์ฟเวอร์วางไข่เชลล์แบบโต้ตอบและเรียกใช้คำสั่งภายในเชลล์นั้นคือการสร้างไฟล์ rc แบบกำหนดเองสำหรับทุบตี

ในไฟล์ bashrc ที่คุณกำหนดเองบนเซิร์ฟเวอร์อันดับแรกให้ไฟล์เริ่มต้นจากนั้นเพิ่มคำสั่งที่กำหนดเองของคุณเช่น

~ / .bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject

จากนั้นคุณสามารถเริ่มเซสชัน SSH ของคุณดังนี้:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"

-tตัวเลือกบังคับจัดสรรหลอก TTY เพื่อให้สิ่งที่ชอบการทำงานของแท็บเสร็จ

--rcfileระบุตัวเลือกซึ่ง rcfile โหลดแทนหนึ่งเริ่มต้น สำคัญ: คุณต้องใส่ "double-dash arguments" ในบรรทัดคำสั่งก่อนตัวเลือกอักขระเดียวเพื่อให้ได้รับการยอมรับ

-iอาร์กิวเมนต์ / bin / ทุบตีจะมีการเรียกใช้เปลือกโต้ตอบ


จริง ๆ แล้วไม่ได้ จะทำอย่างไรถ้าฉันต้องการรันคำสั่งที่แตกต่างกันสำหรับการเชื่อมต่อแต่ละครั้ง?
Eugen Konkov

1

หากใครต้องการข้อมูลเกี่ยวกับสิ่งที่เกิดขึ้นในพื้นหลังคุณควรดูคู่มือ sshd:

เมื่อผู้ใช้ล็อกอินสำเร็จ sshd จะทำสิ่งต่อไปนี้:

  1. หากการล็อกอินอยู่บน tty และไม่มีการระบุคำสั่งให้พิมพ์เวลาล็อกอินครั้งล่าสุดและ / etc / motd (ยกเว้นกรณีที่ถูกป้องกันในไฟล์กำหนดค่าหรือโดย ~ / .hushlogin ดูที่ส่วนไฟล์)
  2. หากการล็อกอินอยู่บน tty ให้บันทึกเวลาล็อกอิน
  3. ตรวจสอบ / etc / nologin และ / var / run / nologin; หากมีอยู่มันจะพิมพ์เนื้อหาและออก (ยกเว้นว่ามีรูท)
  4. การเปลี่ยนแปลงเพื่อทำงานด้วยสิทธิ์ผู้ใช้ปกติ
  5. ตั้งค่าสภาพแวดล้อมพื้นฐาน
  6. อ่านไฟล์ ~ / .ssh / environment หากมีอยู่และผู้ใช้ได้รับอนุญาตให้เปลี่ยนสภาพแวดล้อม ดูตัวเลือก PermitUserEnvironment ใน sshd_config (5)
  7. เปลี่ยนเป็นโฮมไดเร็กทอรีของผู้ใช้
  8. หากมี ~ / .ssh / rc ให้เรียกใช้ มิฉะนั้นหาก / etc / ssh / sshrc มีอยู่ให้รันมัน; เรียกใช้ xauth (1) ไฟล์ `` rc '' จะได้รับโปรโตคอลการตรวจสอบความถูกต้อง X11 และคุกกี้ในอินพุตมาตรฐาน ดู SSHRC ด้านล่าง
  9. รันเชลล์หรือคำสั่งของผู้ใช้

https://www.freebsd.org/cgi/man.cgi?sshd(8)#LOGIN_PROCESS


0

โดยทั่วไปคุณควรหลีกเลี่ยงการใช้ ssh ในลักษณะนี้เพราะมันมีจุดประสงค์
ทำ

ssh-add -l | grep "file_of_your_rsa_priv_key_here"

เพื่อดูว่าคีย์ของคุณอยู่ในรายการใน ssh active session pool หรือไม่หรือเพิ่มด้วยตนเอง (ด้วย ssh-add)

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