วิธีการที่ฉันชอบคือการใช้ไฟล์กำหนดค่า SSH (อธิบายไว้ด้านล่าง) แต่มีวิธีแก้ไขที่เป็นไปได้สองสามข้อขึ้นอยู่กับการใช้งานของคุณ
อาร์กิวเมนต์บรรทัดคำสั่ง
ฉันคิดว่าคำตอบที่ดีที่สุดสำหรับวิธีนี้คือคำตอบที่ตอบรับได้ของ christianbund:
ssh -t example.com "cd /foo/bar; exec \$SHELL -l"
การใช้เครื่องหมายคำพูดคู่จะช่วยให้คุณสามารถใช้ตัวแปรจากเครื่องท้องถิ่นของคุณเว้นแต่ว่าพวกเขาจะหลบหนี (เหมือน$SHELL
ที่นี่) อีกทางหนึ่งคุณสามารถใช้เครื่องหมายคำพูดเดี่ยวและตัวแปรทั้งหมดที่คุณใช้จะเป็นเครื่องหมายคำพูดจากเครื่องเป้าหมาย:
ssh -t example.com 'cd /foo/bar; exec $SHELL -l'
ฟังก์ชั่นทุบตี
คุณสามารถทำให้คำสั่งง่ายขึ้นด้วยการล้อมในฟังก์ชัน bash สมมติว่าคุณต้องการพิมพ์สิ่งนี้:
sshcd example.com /foo/bar
คุณสามารถใช้งานได้โดยเพิ่มสิ่งนี้ใน~/.bashrc
:
sshcd () { ssh -t "$1" "cd \"$2\"; exec \$SHELL -l"; }
หากคุณกำลังใช้ตัวแปรที่มีอยู่ในเครื่องระยะไกลสำหรับไดเรกทอรีโปรดหลีกเลี่ยงหรือใส่ไว้ในเครื่องหมายคำพูดเดี่ยว ตัวอย่างเช่นสิ่งนี้จะ cd ไปยังไดเรกทอรีที่เก็บไว้ในJBOSS_HOME
ตัวแปรบนเครื่องระยะไกล:
sshcd example.com \$JBOSS_HOME
ไฟล์กำหนดค่า SSH
หากคุณต้องการที่จะเห็นพฤติกรรมนี้ตลอดเวลาสำหรับโฮสต์ที่เฉพาะเจาะจง (หรือใด ๆ ) ด้วยคำสั่ง ssh ปกติโดยไม่ต้องใช้อาร์กิวเมนต์บรรทัดคำสั่งพิเศษคุณสามารถตั้งค่าRequestTTY
และRemoteCommand
ตัวเลือกในไฟล์ ssh config ของคุณ
ตัวอย่างเช่นฉันต้องการพิมพ์เฉพาะคำสั่งนี้:
ssh qaapps18
แต่ต้องการให้มันทำตัวเหมือนคำสั่งนี้เสมอ:
ssh -t qaapps18 'cd $JBOSS_HOME; exec $SHELL'
ดังนั้นฉันจึงเพิ่มลงใน~/.ssh/config
ไฟล์ของฉัน:
Host *apps*
RequestTTY yes
RemoteCommand cd $JBOSS_HOME; exec $SHELL
ตอนนี้กฎนี้ใช้กับโฮสต์ใด ๆ ที่มี "แอพ" ในชื่อโฮสต์
สำหรับข้อมูลเพิ่มเติมดูที่http://man7.org/linux/man-pages/man5/ssh_config.5.html