ssh: execute คำสั่งบนรีโมตโฮสต์แทนเชลล์ล็อกอิน


2

ฉันกำลังเชื่อมต่อกับremote-serverจาก localhost remote-serverและฉันต้องการที่จะดำเนินการคำสั่งบน

ทำงานตามที่คาดไว้:

ssh remote-server "hostname"
remote-server

ฉันสับสน. เหตุใดจึงส่งคืนโลคัลโฮสต์แทนชื่อโฮสต์ของรีโมตเซิร์ฟเวอร์

ssh remote-server "print $HOST"
localhost

คำตอบ:


7

ตัวอย่างรหัสที่สองของคุณ:

ssh remote-server "print $HOST"
localhost

จะถูกตั้งค่าสถานะโดยเครื่องมือShellcheckที่ยอดเยี่ยมด้วยการวินิจฉัยSC2029 :

Bash ขยายการขัดแย้งทั้งหมดที่ไม่ได้หลบหนี / อ้างถึงเดี่ยว ซึ่งหมายความว่ารหัสปัญหานั้นเหมือนกัน

โฮสต์ ssh "echo clienthostname"

และจะพิมพ์ชื่อโฮสต์ของไคลเอ็นต์ไม่ใช่ชื่อโฮสต์ของเซิร์ฟเวอร์

โดยการหลีกเลี่ยง $ in $ HOSTNAME มันจะถูกส่งไปตามตัวอักษรและประเมินบนเซิร์ฟเวอร์แทน

โดยใช้

ssh host "print \$HOST"

หรือ

ssh host 'print $HOST'

คุณสามารถป้องกันเชลล์โลคัลของคุณไม่ให้ขยายโฮสต์และให้เชลล์remote-serverขยายแทน


โอ้ฉันจะต้องจำ Shellcheck
Shadur

6

เนื่องจากคุณใช้เครื่องหมายคำพูดคู่ดังนั้นเชลล์$HOSTจะประเมินก่อนที่จะดำเนินการคำสั่งและเรียกใช้sshดังนั้นคุณจึงส่งคำสั่ง " print localhost" ไปยังเซิร์ฟเวอร์ระยะไกล

ใช้เครื่องหมายคำพูดเดี่ยวแทน:

shadur@proteus:~$ ssh axiom "echo $HOSTNAME"
shadur@axiom's password:
proteus

shadur@proteus:~$ ssh axiom 'echo $HOSTNAME'
shadur@axiom's password:
axiom
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.