ssh รันคำสั่งอย่างไร


15

ฉันกำลังใช้ Bash กับทั้งลูกค้าและเซิร์ฟเวอร์ เมื่อรันคำสั่งผ่าน SSH:

  • ssh <host> 'declare' ให้รายการของตัวแปรเชลล์

  • ssh <host> 'mount' ให้รายการของจุดเมานท์

อย่างไรก็ตามdeclareเป็น Bash builtin ในขณะที่mountเป็นคำสั่งภายนอก SSH จะรู้ได้อย่างไรว่าจะใช้งานอะไรถ้ามี shell builtin และคำสั่งภายนอกที่มีชื่อเดียวกันบนเซิร์ฟเวอร์?


2
SSH /etc/passwdใช้เปลือกของคุณซึ่งถูกเก็บไว้ในเสมอ ถ้าเป็น/usr/sbin/nologinคุณไม่สามารถเข้าสู่ระบบได้
Ipor Sircer

คำตอบ:


21

sshรันคำสั่งที่คุณให้ในเปลือกผู้ใช้ระยะไกล (ที่ได้รับจาก/etc/passwd) เช่นมองเห็นได้จากรหัสที่มา :

argv[0] = (char *) shell0;
argv[1] = "-c";
argv[2] = (char *) command;
argv[3] = NULL;
execve(shell, argv, env);

ดังนั้นคำสั่งที่เกี่ยวข้องที่ดำเนินการสำหรับตัวอย่างของคุณบนเซิร์ฟเวอร์ระยะไกลคือ:

  • bash -c declare
  • bash -c mount

ทั้งคู่ถูกส่งไปยังbashและประเมินผล Built-in จะถูกประเมินภายในและคำสั่งภายนอกจะถูกเรียกราวกับว่าคุณทำจากพรอมต์บรรทัดคำสั่งท้องถิ่นของคุณ


หากเชลล์เริ่มต้นด้วย ssh daemon เสมอสิ่งที่น่าสนใจคือเมื่อผู้ใช้เรียก ssh ด้วยคำสั่งจากนั้นเชลล์นั้นไม่ใช่เชลล์ล็อกอินแม้ว่าผู้ใช้จะทำการล็อกอินบางประเภท ความคิดใด ๆ
Cyker

ใช่. เชลล์ที่รันคำสั่งคือ 1) ไม่มีล็อกอินเชลล์ 2) ไม่ใช่แบบโต้ตอบ คุณสามารถบังคับให้การโต้ตอบโดย-tสวิตช์ แต่มันจะยังไม่โหลดไฟล์ rc
Jakuje

1
โปรดทราบว่าsshd(เซิร์ฟเวอร์) กำลังทำสิ่งนี้ไม่ใช่ssh(ไคลเอ็นต์)
ysdx

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