การเลือกเชลล์ที่ SSH ใช้?


31

ฉันจะตั้งค่าเชลล์ที่ใช้เมื่อผู้ใช้ SSHs ไปยังเซิร์ฟเวอร์ได้อย่างไร ตัวอย่างเช่นฉันไม่สามารถยืน BASH และจำเป็นต้องใช้ ZSH ฉันจะทำอย่างไรเพื่อให้ ZSH ถูกโหลดพร้อมกับโปรไฟล์ของฉัน ( .zsh_profile) เมื่อฉันไปที่เครื่อง

ฉันไม่ต้องการที่จะผ่านพารามิเตอร์จำนวนมากด้วย ssh เช่นกันฉันไม่สามารถตั้งค่าเปลือกเริ่มต้นได้หรือไม่

คำตอบ:


34

สมมติว่าคุณทำงานบน Linux คุณสามารถใช้chshคำสั่ง

chsh -s /bin/ksh foo
chsh -s /bin/bash username

4
โปรดทราบว่าจะต้องมีพา ธ ไปยังไบนารีเพื่อ/etc/shellsให้เชลล์เลือกได้
Kimvais

Ubuntu 16.04 ไม่มีคำสั่งนี้
david.perez

@ david.perez ใช่มันไม่ในแพคเกจ passwd
ของหวาน

สิ่งนี้ไม่ทำงานเมื่อมีการจัดการการรับรองความถูกต้องผ่าน LDAP
Daniel Kats

10

man chsh การเปลี่ยนแปลงเปลือกไม่ได้ทำงานเสมอ

หรือคุณสามารถexec /bin/zshใช้สคริปต์ล็อกอิน bash ซึ่งจะแทนที่อินสแตนซ์ของ bash ด้วยเชลล์ของคุณ

หรือคุณสามารถทำได้ ssh host "zsh -l"


ทำไมต้อง -1 (15 ตัวอักษร ... )
Noufal Ibrahim

นั่นเป็นตัวพิมพ์เล็กL
driftcatcher

1
ssh -tจะต้องได้รับ TTY สำหรับตัวเลือกสุดท้าย โดยค่าเริ่มต้นหากมีคำสั่ง (เหมือนzsh -l) OpenSSH จะทำเชลล์ที่ไม่ใช่การเข้าสู่ระบบซึ่งจะไม่จัดสรร TTY ให้คุณและ-lจะไม่เปลี่ยนแปลง (เพราะถูกดำเนินการหลังจากเข้าสู่ระบบ)
Franklin Yu

8

แก้ไข / etc / passwd (หากคุณมีสิทธิ์หรือขอให้ผู้ดูแลระบบของคุณ) เปลี่ยนเชลล์เริ่มต้นของคุณ


ด้วยเหตุผลบางอย่างผู้ใช้ที่ฉันเพิ่งสร้างขึ้นไม่มีเชลล์เริ่มต้น สิ่งนี้ใช้ได้สำหรับฉัน ขอบคุณ
mimoralea

2
ขอบคุณคำตอบนี้ดีมาก ฉันไม่มีกระสุนเลย ฉันพบบรรทัด myusername: x: 1000: 1000 :: / home / myusername: และเพิ่ม / bin / bash จนจบ ออกจากระบบและเข้าสู่ระบบและเซสชัน ssh ของฉันกำลังใช้ bash :)
Stewart Evans

6

หากคุณไม่สามารถเปลี่ยนเปลือกเริ่มต้นได้ssh -t user@host 'zsh -l'ผล

-tธงกองกำลังจัดสรรหลอก TTY และ-lspawns ธงเปลือกเข้าสู่ระบบ


4

ฉันไม่แน่ใจว่าคุณจะวางโลคัล.zshrcเซิร์ฟเวอร์ของคุณไว้ในที่ใดได้บ้าง (นั่นคือไม่มีการจัดเก็บไว้อย่างถาวร) มันใช้งานได้สำหรับฉันที่จะเปลี่ยนเปลือกล็อกอินของฉันบนเซิร์ฟเวอร์ระยะไกล

เนื่องจากเป็นบัญชีที่ใช้ร่วมกันฉันจึงสามารถใช้zshวิธีนี้ได้ด้วยตัวเองเท่านั้น

เพิ่มสิ่งนี้ไปยัง~/.ssh/configไฟล์ของคุณในเครื่องท้องถิ่นของคุณ

Host yourServer
    HostName <IP, FQDN or DNS resolvable name>
    IdentityFile ~/.ssh/<your keyfile>
    RemoteCommand zsh -l
    RequestTTY force
    User <yourUsername>

อาจมีวิธีแฮ็กที่จะบรรลุสิ่งที่คุณต้องการเช่นด้านล่าง

คำเตือน สิ่งนี้มาพร้อมกับการรับประกันและไม่ดู 'ฉลาด' แต่ฉันจัดการเพื่อวางไฟล์ในเครื่องของฉันไปยังเซิร์ฟเวอร์และส่งมาที่เชลล์การเข้าสู่ระบบโดยใช้สิ่งนี้

Host someHost
    HostName someIP
    IdentityFile ~/.ssh/somekey.pem
    RemoteCommand zsh -l -c 'sleep 1; source /tmp/somefile; zsh'
    PermitLocalCommand yes
    LocalCommand bash -c 'sftp %r@%h <<< "put /tmp/somefile /tmp/somefile"'
    RequestTTY force
    User someUser

มันทำงานอย่างไร?

  • RemoteCommand กำหนดสิ่งที่จะต้องทำงานในด้านระยะไกล
  • LocalCommandกำหนดสิ่งที่ต้องรันบนโลคัลซึ่งใช้เพื่อคัดลอกโลคัลไฟล์ของคุณไปยังรีโมตเซิร์ฟเวอร์สำหรับการจัดหา นี่คือการจับมันเกิดขึ้นหลังจากการเชื่อมต่อ 'สำเร็จ' กับโฮสต์ระยะไกล

ความหมาย:

  1. การเชื่อมต่อของคุณกับรีโมตควรเปิดและมีชีวิตชีวา
  2. รีโมตเชลล์ของคุณยังไม่มีไฟล์ดังนั้นจึงต้องรอจนกว่าไฟล์จะอยู่ที่นั่นดังนั้น sleep
  3. โลคัลของคุณใช้sftpเพื่อนำไฟล์ของคุณไปยังเซิร์ฟเวอร์ระยะไกลเซิร์ฟเวอร์ระยะไกลจะตื่นขึ้นมาsleepและสคริปต์ของคุณที่มา

มันแฮ็คสุดฉันอยากจะรู้ว่ามีวิธีที่ดีกว่าเช่นกัน

อัปเดต: สามารถใช้งานได้แทนที่จะใช้เวลาพักเครื่องนาน
RemoteCommand zsh -l -c 'while [[ ! -f /tmp/somefile ]]; do sleep 0.05; done; source /tmp/somefile; zsh'

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