ตั้งค่า $ PS1 แตกต่างกันในเครื่องคอมพิวเตอร์และในเซสชั่น ssh


9

ฉันเก็บไดเรกทอรีบ้านของฉันไว้ภายใต้การควบคุมเวอร์ชันเพื่อให้การกำหนดค่าพื้นฐานของฉันนั้นสามารถใช้ได้อย่างง่ายดายบนคอมพิวเตอร์เครื่องใดก็ได้

พรอมต์คำสั่ง bash ของฉันบนเครื่องคอมพิวเตอร์ของฉันเป็นสิ่งที่ซับซ้อนและมีสีสันที่มีที่เก็บ git ปัจจุบันและสถานะของมัน แต่ฉันควรจะมีuser@host ~ $พรอมต์คำสั่งง่ายๆเมื่อฉันsshเข้าไปในเครื่องระยะไกล

ฉันต้องการที่จะสามารถอัปเดตของฉัน.profileเพื่อที่จะตั้งค่าที่ซับซ้อน$PS1เมื่อเรียกใช้ในพื้นที่และแบบที่ง่ายขึ้นเมื่อทำงานในsshเซสชั่น

โดยทั่วไปฉันต้องการบางสิ่งบางอย่างเช่นตัวแปรในการทดสอบในของฉัน$AM_I_LOGGED_IN_VIA_SSH .profileเป็นไปได้ไหม

คำตอบ:


8

เมื่อคุณเข้าสู่ระบบผ่าน SSH ตัวแปรสภาพแวดล้อมพิเศษหลายอย่างจะถูกตั้งค่า คุณสามารถใช้สิ่งเหล่านี้เป็นแบบทดสอบเพื่อตั้งค่า PS1 ของคุณใน. profile

if [ -n "$SSH_CLIENT" ]; then
    PS1="Via ssh: "
else
    PS1="Local: "
fi

7

หากคุณตรวจสอบสภาพแวดล้อมของคุณ ( env | grep SSH) คุณจะพบว่าผู้สมัครหลายอย่างเช่น$SSH_CLIENT, $SSH_CONNECTIONและ$SSH_TTY; รายการที่แน่นอนจะขึ้นอยู่กับsshdรุ่น


2

หาก sshd ของคุณไม่ได้ให้ตัวแปรที่มีประโยชน์คุณสามารถใช้

ps -p $PPID

หรือเคล็ดลับ ps สุ่มอื่น ๆ (ถ้าเชลล์ของคุณไม่ได้ตั้งค่า$PPID) เพื่อดูว่ากระบวนการหลักของเชลล์นั้นเป็นกระบวนการเข้าสู่ระบบระยะไกลของคุณหรือไม่ จากนั้นถ้า parent-is-remote-thingie สลับ $ PS1 จากนั้นดาวน์โหลด OpenSSH และใช้คำแนะนำของ geekosaur / Caleb เนื่องจากเซิร์ฟเวอร์ ssh ของคุณเป็นขยะ ;)

หรือคุณสามารถใช้เอาต์พุตของ "who am i" คว้าฟิลด์สุดท้าย (เช่น$( who am i | awk '$0=$NF')) และตรวจสอบเพื่อดูว่าโฮสต์เป็นรีโมตหนึ่งหรือโลคัลเพื่อตัดสินใจว่าคุณล็อกอินแบบโลคัลหรือแบบรีโมต

หรือคุณสามารถเปิดเอาต์พุต$(hostname)เพื่อให้เชลล์ใช้ $ PS1 ที่เหมาะสมบนโฮสต์ที่เฉพาะเจาะจง

หรือไปบ้ากันเถอะ หากคุณใช้เชลล์ที่ทันสมัย ​​- เช่น bash, ksh93 หรือ zsh คุณสามารถใช้ประโยชน์จากความจริงที่ว่า $ PS1 ได้รับการประเมินใหม่เมื่อดำเนินการ ดังนั้นคุณสามารถรวมบล็อกที่มีเงื่อนไขแบบอินไลน์เพื่อทำสิ่งคอมไพล์บ้าถ้า cwd ของคุณอยู่ในพื้นที่เก็บข้อมูลและอย่างอื่นนอก ตัวอย่างเช่นที่นี่ฉันทำการเปลี่ยนแปลงที่รวดเร็วขึ้นอยู่กับไดเรกทอรีที่ฉันใช้[[ conditional ]] && $( echo "whatever it should be if true) || $( echo "whatever should be the if-not-true prompt" )โดยทั่วไป

default prompt$ PS1='$(id -un) @ $(hostname)$( [[ $(pwd) = /tmp ]] && echo " [I am in /tmp]" || echo " /not/in/tmp")$ '
myname @ host /not/in/tmp$ cd /tmp
myname @ host [I am in /tmp]$ cd /etc
myname @ host /not/in/tmp$

แน่นอนว่าคำนิยาม $ PS1 จะดูบ้าคลั่งในโปรไฟล์ของคุณ แต่จากนั้นคุณจะได้รับสีสันที่ยอดเยี่ยมเมื่อคุณอยู่ในพื้นที่เก็บข้อมูลคอมไพล์จริง ๆ ในขณะที่คุณสีปกติอื่น ๆ :) โปรดทราบว่าคุณต้องใช้เครื่องหมายคำพูดเดี่ยวรอบการกำหนด PS1 คุณไม่ต้องการให้ตัวแปรขยายเมื่อกำหนด PS1; คุณต้องการให้พวกเขาขยายตัวเมื่อมีการประเมิน $ PS1 ในภายหลัง ดังนั้นคำพูดเดียว


1

หากPermitUserEnvironmentเปิดใช้งานใน sshd คุณสามารถใช้~/.ssh/environmentเพื่อสร้าง$PS1และจากนั้นตรวจพบว่ามีค่าในสคริปต์ของคุณที่ตั้งค่าไว้ตามปกติ


0

นอกเหนือจากคำตอบของอิกนาชิโอในการทำให้สิ่งต่าง ๆ ชัดเจนPermitUSerEnvironmentต้องเปิดใช้งานตัวเลือกบนฝั่งเซิร์ฟเวอร์เพื่อให้สิ่งนี้ทำงานได้ หากเซิร์ฟเวอร์ไม่เปิดใช้งานตัวเลือกนี้คุณจะไม่มีเซสชัน ssh ที่มีสีสันกับเซิร์ฟเวอร์นั้น

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