ssh, เริ่มเชลล์เฉพาะ, และรันคำสั่งบนเครื่องรีโมต?


11

ฉันอยู่ในสถานการณ์ที่ผู้ใช้หลายคนกำลังแบ่งปันบัญชีผู้ใช้เดียวกันบนเครื่องระยะไกล ฉันมีไดเรกทอรี "ส่วนตัว" ที่ฉันเขียน.zshrcไฟล์ของตัวเองและฉันต้องการวิธี:

  1. เริ่มเซสชัน ssh ในเครื่องระยะไกลด้วยคำสั่งจากไฟล์ ssh config ของฉัน (เช่นControlMaster auto)
  2. เซสชั่นนี้รัน Z shell
  3. มันทำงาน.zshrcในไดเรกทอรี "ส่วนตัว" ของฉัน (ไม่ใช่ในไดเรกทอรีบ้านของผู้ใช้ที่ใช้ร่วมกัน)

มันคงจะดีถ้ามีนามแฝงหรือวิธีง่าย ๆ ในการเริ่มเซสชัน ssh (นั่นคือเหตุผลที่ฉันคิดเกี่ยวกับการใช้ไฟล์ config ของ OpenSSH) แต่ฉันเปิดรับแนวคิดอื่น ๆ !

กำลังใช้ไฟล์ปรับแต่งของ OpenSSH?

ฉันอ่านหน้า man 's ssh_config ของ OpenSSH ที่ฉันสามารถใช้ directive LocalCommandเพื่อระบุคำสั่งให้รันแบบโลคัลหลังจากเชื่อมต่อกับเซิร์ฟเวอร์สำเร็จ นี่ทำให้ฉันคิดว่าอาจมีวิธีบอกconfigไฟล์ว่าคำสั่งให้เรียกใช้จากระยะไกลหลังจากเชื่อมต่อกับเซิร์ฟเวอร์ แต่ดูเหมือนจะไม่มีอะไรเกิดขึ้น


ฉันไม่คิดว่าคุณจะทำได้ แต่ฉันงงว่าทำไมคุณถึงต้องการสิ่งนี้ มีคำสั่งในบรรทัดคำสั่ง ssh แล้ว ทำไมคุณวิ่งssh mycommandไม่ได้ และถ้าคุณต้องการเรียกใช้คำสั่งการตั้งค่าบางคำสั่งก่อนคำสั่ง ssh ทำไมไม่กำหนดค่าฝั่งเซิร์ฟเวอร์
Gilles 'หยุดความชั่วร้าย'

ขอบคุณ @ Guilles ฉันอยู่ในสถานการณ์ที่ผู้ใช้หลายคนกำลังแบ่งปันบัญชีระยะไกลเดียวกันดังนั้นฉันต้องการตั้งค่าบางสิ่งอย่างรวดเร็วขณะที่ฉันลงชื่อเข้าใช้จากระยะไกล โดยเฉพาะฉันต้องการเริ่มต้นเปลือก Z และขอให้เรียกใช้.zshrcในไดเรกทอรีเฉพาะ (เช่นไดเรกทอรีบ้าน "ส่วนบุคคล") ฉันพยายามssh -t host_name 'zsh & source /path/to/my_zshrc'แต่มันไม่ทำงาน (ฉันได้รับFPATH variable not definedและฉันคิดว่ามันเป็นเพราะzshเสร็จสิ้นก่อนที่มันจะทำงานmy_zshrcให้คนเดียวสิ่งนี้ไม่ได้ให้เปลือกหอย Z)
Amelio Vazquez-Reina

ฉันคิดว่านี่สมควรได้รับการอัปเดตของ OP ดังนั้นฉันเพิ่งอัปเดต
Amelio Vazquez-Reina

เมื่อฉันไปหาคำตอบที่คล้ายกันของฉันมันเกิดขึ้นกับฉันว่าคำถามนี้ค่อนข้างใกล้เคียงกับสิ่งที่คุณพยายามทำ
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


15

วิธีที่ชัดเจนที่สุดในการเรียกใช้คำสั่งจากระยะไกลคือการระบุไว้ในบรรทัดคำสั่ง ssh คำสั่ง ssh ถูกตีความโดยเชลล์ของผู้ใช้ระยะไกลเสมอ

ssh bob@example.com '. ~/.profile; command_that_needs_environment_variables'
ssh -t bob@example.com '. ~/.profile; exec zsh'

บัญชีที่ใช้ร่วมกันโดยทั่วไปเป็นแนวคิดที่ไม่ดี ถ้าเป็นไปได้รับบัญชีแยกต่างหากสำหรับผู้ใช้ทุกคน หากคุณติดอยู่กับบัญชีที่ใช้ร่วมกันคุณสามารถสร้างชื่อแทนได้:

ssh -t shared-account@example.com 'HOME=~/bob; . ~/.profile; exec zsh'

หากคุณใช้การพิสูจน์ตัวตนคีย์สาธารณะ (แนะนำอีกครั้ง) คุณสามารถกำหนดคำสั่งต่อคีย์~/.ssh/authorized_keysได้ ดูคำตอบนี้สำหรับคำอธิบายเพิ่มเติม แก้ไขบรรทัดสำหรับคีย์ของคุณใน~/.ssh/authorized_keysเซิร์ฟเวอร์ (ทั้งหมดในบรรทัดเดียว):

command="HOME=$HOME/bob;
     if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
       eval \"$SSH_ORIGINAL_COMMAND\";
     else exec \"$SHELL\"; fi" ssh-rsa AAAA…== bob@some.where

Fantastic @ Guilles การมีส่วนร่วมของคุณในเว็บไซต์นี้ทำให้เป็นทรัพยากรที่มีประโยชน์อย่างมากสำหรับเราทุกคน ขอบคุณมากจริงๆ โดยวิธีการที่ฉันไม่ทราบเกี่ยวกับexecคำสั่ง เป็นวิธีการexec zshที่แตกต่างกันจากการเรียกzshโดยตรง? เหตุใดจึงสำคัญในกรณีนี้
Amelio Vazquez-Reina

อืมเมื่อฉันเรียกฉันได้รับssh -t shared-account@example.com 'HOME=~/bob; exec zsh' ผมคิดว่าผมได้ที่HOME=~/bob: command not found ฉันได้รับปัญหาเดียวกันถ้าลองtcsh HOME=/home/bobฉันพยายามทุบตีและ zsh เบาะแสอะไรที่ทำให้เกิดสิ่งนี้ ในที่สุดไวยากรณ์ข้างต้นจะทิ้งฉันไว้กับเซสชัน ssh หรือไม่ (สิ่งที่ฉันต้องการ) ขอบคุณอีกครั้ง.
Amelio Vazquez-Reina

1
@intrpc execแทนที่เชลล์เดิมด้วย zsh; โดยไม่ต้องzshเปลือกเดิมจะยังคงอยู่ในหน่วยความจำจนกว่า zsh ออกแล้วออกจาก ความแตกต่างหลักคือการประหยัดหน่วยความจำเล็กน้อยมันไม่สำคัญมาก ถ้าเปลือกเข้าสู่ระบบของคุณ (t) csh setenv HOME ~/bob; exec zshใช้ ในที่สุดเนื่องจาก zsh เริ่มต้นโดยไม่มีการโต้แย้งคุณจะได้รับเซสชันของเชลล์เช่นคุณจะได้รับถ้าคุณเพิ่งวิ่งsshและมี zsh เป็นเชลล์ล็อกอินของคุณ
Gilles 'SO- หยุดความชั่วร้าย'

ขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ หนึ่งคำถามติดตามที่นี่ วิธีใดในการรันคำสั่งเพิ่มเติมหลังจากexec zshคำสั่ง?
Amelio Vazquez-Reina

1
@ AmelioVazquez-Reina ไม่สะดวกหากคุณไม่สามารถควบคุมไฟล์ dot ได้ คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมZDOTDIRเพื่อให้ zsh มองหาไฟล์ dot ในไดเรกทอรีอื่น หากคุณมีการควบคุมบางกว่าไฟล์ที่จุดแล้วคุณสามารถทำสิ่งที่ต้องการเพิ่มeval $LC_STARTUP_CODEการและส่งรหัสในการดำเนินการในตัวแปรสภาพแวดล้อม$ZDOTDIR/.zshrc LC_STARTUP_CODE
Gilles 'SO- หยุดความชั่วร้าย'

-3

ในการเรียกใช้คำสั่งจากระยะไกลหลังจากเชื่อมต่อเซิร์ฟเวอร์ให้เพิ่มไฟล์. ssh / config ในไฟล์ต่อไปนี้

PermitLocalCommand yes

Host <server-ip-address>
    LocalCommand *command*

2
ขอบคุณ @ user626129 แต่ที่ฉันพูดถึงในคำถามเดิมLocalCommandคำสั่งคือการเรียกใช้คำสั่งในเปลือกท้องถิ่นไม่ได้อยู่ในเปลือกระยะไกล
Amelio Vazquez-Reina
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.