กดพรอมต์ PS1 ของฉันไปที่ ssh


19

ฉันใช้พรอมต์ "PS1" เฉพาะที่ฉันชอบ ฉันแบ่งปันการเข้าสู่ระบบสองสามครั้งกับผู้อื่นในเซิร์ฟเวอร์อื่น ๆ ฉันสงสัยว่ามีวิธีระบุในโพรไฟล์ bash ภายในเครื่องของฉันพร้อมท์รีโมตหรือวิธีอื่นแล้วคัดลอกและวางทุกครั้งที่รีโมต

คำตอบ:


17

อัปโหลดไฟล์ในแต่ละเครื่องระยะไกลพูด~/.my_custom_bashrcด้วยการกำหนดbashค่าของคุณ(ในกรณีนี้PS1=...) แล้วเปิดsshด้วย:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

คุณสามารถใช้bashฟังก์ชั่นเป็นตัวหุ้มเพื่อให้อ่านง่าย


10

หากคุณเพียงแค่ต้องการส่งPS1ตัวแปรและมันไม่มี'(อัญประกาศเดี่ยว) ให้ลอง:

ssh targethost -t "PS1='$PS1'; exec bash"

คนในพื้นที่.bashrcอาจเขียนทับได้ดีPS1(ขอบคุณเดนนิสวิลเลียมสันที่ชี้เรื่องนี้)

มีวิธีการส่งตัวแปรสภาพแวดล้อมบน sshแต่โดยทั่วไปแล้วพวกเขาจะปิดการใช้งานในการกำหนดค่าเซิร์ฟเวอร์ หากPermitUserEnvironmentคำสั่งถูกเปิดใช้งานในการกำหนดค่าเซิร์ฟเวอร์และผู้ใช้แต่ละคนมีคู่คีย์ของตัวเอง (ใช่คุณอาจไม่โชคดีมาก) คุณสามารถเพิ่มลงenvironment="PS1=…"ในบรรทัดที่~/.ssh/authorized_keysสอดคล้องกับคีย์ของคุณ

หากคุณต้องการเก็บการกำหนดค่าของคุณเองในบัญชีผู้ใช้ที่ใช้ร่วมกันคุณสามารถสร้างไดเรกทอรีไฟล์การกำหนดค่าของคุณเองและตั้งค่าHOMEตัวแปรสภาพแวดล้อมให้ชี้ไปที่ไดเรกทอรีนั้น

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

สร้างลิงก์สัญลักษณ์ในmrstatic.homeไดเรกทอรีที่ชี้กลับไปยังรายการที่เกี่ยวข้องในไดเรกทอรีหลักเมื่อคุณต้องการแชร์ไฟล์กับผู้ใช้รายอื่น

จากนั้นเข้าสู่ระบบด้วย

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

หากคุณยินดีที่จะแก้ไขระยะไกล.profile(หรือไฟล์เริ่มต้นอื่น ๆ ) คุณสามารถทำการตั้งค่าของคุณได้โดยอัตโนมัติ ไซต์จำนวนมากอนุญาตให้มีLC_*ตัวแปรสภาพแวดล้อมผ่าน (โดยปกติจะใช้สำหรับการตั้งค่าภาษา) หากทั้งสองเงื่อนไขเหล่านี้คุณสามารถตั้งค่าตัวแปรที่ไม่ได้นำมาใช้จริงสำหรับสถานที่พูดในด้านลูกค้าและการทดสอบในเซิร์ฟเวอร์LC_USER.profile

(แน่นอนว่าบัญชีที่ใช้ร่วมกันเป็นความคิดที่ไม่ดี แต่ฉันรู้ว่าคุณอาจไม่สามารถเปลี่ยนสถานการณ์นั้นได้)


3
ssh -t user@host "remote='$PS1' bash -i"

จากนั้นที่พร้อมต์:

PS1=$remote

1
ทุบตีทุบตีที่ซับซ้อนมีแนวโน้มที่จะทำลายถ้ามันไม่ได้ยกมา (มาจากคุณฉันประหลาดใจ) และทำไมคำสั่งพิเศษและไม่ใช่แค่"PS1='$PS1' bash -i"(และทำไมไม่execเช่นกัน)?
Gilles 'หยุดชั่วร้าย'

1
@Gilles: ข้อความที่หายไป: ความสะเพร่า คำสั่งพิเศษ: มันจะไม่ผิดปกติสำหรับPS1การเขียนทับในระหว่างการเริ่มต้นเชลล์ ไม่มีผู้บริหาร: ระหว่างการทดสอบระบบของฉันดูเหมือนจะไม่ได้สร้างความแตกต่าง - ไม่มีกระบวนการพิเศษ
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

1
โอ้ใช่ว่าเป็นจุดที่ดีในท้องถิ่นมีแนวโน้มที่จะเขียนทับ.bashrc PS1
Gilles 'หยุดความชั่วร้าย'

2

ใส่พรอมต์ PS1 ของคุณใน ~ / .ssh / environment และ ssh session จะส่งไปยังทุก ๆ โฮสต์ที่คุณล็อกอิน มันทำงานได้สำหรับฉันด้วย openssh 4.3p2


1
ใช้งานได้เฉพาะเมื่อการกำหนดค่าเซิร์ฟเวอร์เปิดใช้งานPermitUserEnvironmentซึ่งจะปิดตามค่าเริ่มต้น
Flimm

1

คุณสามารถระบุตัวแปรสภาพแวดล้อมในฝั่งไคลเอ็นต์และหาก ssh-server อนุญาต (ตรวจสอบคน sshd-config) ตัวแปรเหล่านี้จะถูกคัดลอกไปยังเซสชันเมื่อคุณเข้าสู่เครื่อง

ดังนั้นคุณจะต้องกำหนดค่า. bashrc บนเซิร์ฟเวอร์เพื่อตรวจสอบ PS1 ที่มีอยู่ (หรือตัวแปรอะไรก็ตาม) และตั้งค่า PS1 เฉพาะเมื่อไม่ได้ตั้งค่าไว้แล้ว

หรือซึ่งทำให้สิ่งต่าง ๆ ง่ายขึ้นคุณรวมการตั้งค่าของคุณไว้ในฟังก์ชั่น .. และปรับใช้ฟังก์ชั่นนั้นเป็นไฟล์พิเศษที่คุณต้องการ ( source joes_bashrc) หรือโดยตรงไปยัง. bashrc การมีไฟล์ของคุณเองดูจะแข็งแกร่งกว่านี้เล็กน้อย คนอื่นอาจใช้การตั้งค่าของคุณ แต่ไม่ได้บังคับให้ทำเช่นนั้น


1

อย่าแชร์การเข้าสู่ระบบ SSH เป็นตัวของคุณเองจากนั้นทำsudo -su shareduser( -sหมายถึง "เปลือก")

ทำให้sudoไดเรกทอรีบ้านของคุณ:

Defaults env_keep += "HOME"

เมื่อฉันได้รับการเลื่อนตำแหน่งฉันจะพยายามทำตามนโยบายนั้น แต่ตอนนี้ฉันติดอยู่กับเรื่องนี้
Unfundednut

1

หากคุณต้องการทำมันโดยไม่จำเป็นต้องมี scp เพิ่มเติมคุณสามารถทำสิ่งนี้:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

นั่นจะสร้าง. bashrc.n ซึ่งขึ้นอยู่กับเซิร์ฟเวอร์ bashrc แต่มีการแทนที่ของคุณ


นี่คือเหตุผลที่บางคนกลัวอาคาร

0

หากคุณยินดีที่จะก้าวก่ายแทบเพื่อนร่วมงานของคุณและคุณสามารถไว้วางใจพวกเขาไม่ได้เข้าไปยุ่งเกี่ยวกับการตั้งค่าของคุณแล้วผมขอแนะนำการรวมกันของคำตอบของไซรัส , คำตอบของอากิระและคำตอบที่เดนนิสวิลเลียมสัน

  1. ในแต่ละเซิร์ฟเวอร์ให้แก้ไข~/.bashrcและเพิ่ม
    if ["$ Unf" = 1] # รหัสพิเศษสำหรับ Unfundednut
    แล้วก็
        PS1 = " (พรอมต์ที่คุณต้องการ) "
         (การปรับแต่งอื่น ๆ ที่คุณต้องการ) 
    fi
    ในตอนท้าย ในขณะที่เพื่อนร่วมงานของคุณ“ จะไม่ขอบคุณ [คุณ] ที่เขียนทับโปรไฟล์ฐาน” พวกเขาจะไม่ตระหนักถึงสิ่งนี้จนกว่าพวกเขาจะไปหามัน
  2. เมื่อคุณเข้าสู่เซิร์ฟเวอร์ระยะไกลให้ทำ
    ssh -t user @ host "Unf = 1 bash -i"
    ในขณะที่คุณอาจต้องการใส่สิ่งนั้นลงในฟังก์ชันนามแฝงหรือเชลล์ในบัญชีท้องถิ่นของคุณมันสั้นพอ - สั้นกว่าคำตอบอื่น ๆ ที่คุณสามารถพิมพ์ได้ด้วยตนเองอย่างง่ายดาย

ฉันเชื่อว่านี่ค่อนข้างชัดเจน แต่: sshคำสั่งทำให้Unfตัวแปรถูกตั้งค่าบนเซิร์ฟเวอร์ระยะไกลเมื่อคุณเข้าสู่ระบบ ที่จะเรียกใช้รหัสของคุณในระยะไกล.bashrcซึ่งจะทำให้การปรับแต่งของคุณมีผล เนื่องจากคุณใส่รหัสของคุณในตอนท้าย.bashrcมันจะแทนที่การตั้งค่าทั่วไปก่อนหน้าในไฟล์

การเปิดเผย: ฉันไม่ได้ทดสอบสิ่งนี้


-1

วิธีที่ง่ายที่สุดคือ IMHO:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'

ฉันไม่แน่ใจว่าใช้งานได้; ดูเหมือนว่าจะไม่มีเลเยอร์ของคำพูด แม้ว่าจะทำเช่นนั้นการตั้งค่าPROMPT_COMMAND(ซึ่งดำเนินการทุกครั้งที่เชลล์ออกพรอมต์) ดูเหมือนจะเป็นวิธีที่หนักมากในการแก้ไขปัญหานี้ และเนื่องจากมันค่อนข้างลึกลับคำตอบใด ๆ ที่แนะนำว่าควรมีคำอธิบายว่ามันทำงานอย่างไร
สกอตต์

-2

คุณสามารถทำสิ่งต่าง ๆ เช่นการติดตั้งที่บ้านของคุณผ่าน sshfs / nfs แต่ทางออกที่ง่ายที่สุดคือการ scp bashrc ของคุณไปยังเครื่องใหม่ สิ่งนี้ยังนำนามแฝงและสิ่งของมาด้วย


ตามที่ระบุไว้ในคำถามของฉันฉันแบ่งปันการเข้าสู่ระบบเหล่านี้กับผู้อื่น ฉันค่อนข้างแน่ใจว่าพวกเขาจะไม่ขอบคุณที่ฉันเขียนทับโปรไฟล์ฐาน
Unfundednut

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