ฉันสามารถรันคำสั่งบางอย่างเมื่อเริ่มเซสชัน ssh ก่อนเข้าสู่โหมดโต้ตอบได้หรือไม่


13

เมื่อเริ่มต้นเซสชัน ssh ด้วยคำสั่ง ssh ดูเหมือนว่าฉันจะมีสองตัวเลือก - เซสชันโต้ตอบเริ่มต้นพร้อม env เริ่มต้นและเริ่มต้นจากไดเรกทอรีบ้าน - หรือดำเนินการคำสั่งโดยพลการ แต่ไม่โต้ตอบ (แม้เทคนิคเช่นssh "command; command; bash -i -l"ดูเหมือนจะไม่ทำดีมาก) บ่อยครั้งที่ฉันต้องการเซสชันแบบโต้ตอบ แต่มีบางอย่างเกิดขึ้นก่อนหน้านั้น - โดยปกติแล้วการเปลี่ยนแปลงไดเรกทอรีหรือบางครั้งการปรับสภาพแวดล้อมของระบบ สิ่งเหล่านี้จะแตกต่างกันไปในแต่ละเซสชั่นดังนั้นฉันจึงไม่สามารถติดมัน.bashrcได้

มีวิธีใดบ้างที่จะทำให้เกิดขึ้นได้

คำตอบ:


13

ฉันตอบตัวเองในที่สุดฉันก็ค้นพบความลับ -tตัวเลือกทั้งสำหรับsshและ-lตัวเลือกสำหรับbashจะนำไปสู่การเข้าสู่ระบบเปลือกด้วยตัวเอง - แต่พวกเขาทำงานร่วมกัน

ssh user@host.com -t 'cd /some/where; FOO=BAR NUMBER=42 bash -l'ไดเรกทอรีการเปลี่ยนแปลงตั้งค่าตัวแปรสภาพแวดล้อมแล้วเริ่มการเข้าสู่ระบบเชลล์ที่เหมาะสม (ความแตกต่างเดียวที่ฉันพบจนถึงตอนนี้/etc/motdก็คือว่าไม่ได้แสดงด้วยวิธีนี้ - มันเป็นความรับผิดชอบของคนปกติ sshหรืออื่น ๆ ไม่ใช่ทุกอย่างที่ดูเหมือน ทำงานได้อย่างสมบูรณ์และตัวแปรสภาพแวดล้อมทั้งหมดเหมือนกัน)loginbash

การเปลี่ยนแปลงสภาพแวดล้อม / ไดเรกทอรีเหล่านี้เกิดขึ้นหลังจาก ssh ดังนั้นจึงไม่ถูก จำกัด โดยPermitUserEnvironmentและการตั้งค่าที่เกี่ยวข้อง (ตรงตามที่วางแผนไว้) แต่ก่อน.bashrc/ .profileดำเนินการ สิ่งนี้มีอัพไซด์และดาวน์ด์ - ยากที่จะแทนที่สิ่งที่ได้รับจากสคริปต์ bash init เช่นPS1แต่ง่ายกว่าที่จะแพ็คค่าที่ถูกต้องลงในsshบรรทัดคำสั่งและ.profileทำให้การยกของหนักขึ้น

และถ้าจำเป็นจริง ๆ แล้วมันค่อนข้างง่ายที่จะได้รับการทุบตีในการดำเนินการบางอย่างหลังจากที่.profileมีบรรทัดคำสั่งเช่นssh user@foo.com -t 'cd /mnt; echo ". ~/.bash_profile; PS1=\"\\h-\w \"" >~/xxx; bash --init-file ~/xxx'- น่าเกลียดมากเมื่อวางแบบนั้น แต่.profileไฟล์ทางเลือกเหล่านี้สามารถเตรียมมาก่อน (เท่าที่ฉันสามารถบอกbashได้ว่ามีตำแหน่งผู้สมัครไม่กี่คนสำหรับ.profileสคริปต์และจะดำเนินการสถานที่แรกที่พบ - . fileไม่มีข้อผิดพลาดอัตโนมัติดังกล่าวดังนั้นคุณจะต้องตรวจสอบว่าปกติของคุณอยู่ที่ไหนprofileถ้าคุณต้องการทำ)


เยี่ยมมากขอบคุณสำหรับสิ่งนี้! ฉันกำลังมองหาวิธีที่จะเข้าไปในบัญชีของผู้ใช้ทันทีหลังจากที่ ssh'ing และตัวเลือก "-t" ทำให้มันทำงานได้ หากไม่มีตัวเลือกนั้นเชลล์ของคุณจะไม่มีพรอมต์ไม่มีประวัติคำสั่งตายจาก SIGINT และอื่น ๆ
Ashoat

คำตอบนี้มีประโยชน์จริง ๆ แต่คุณขาดหายไป;จากสตริงการเข้าสู่ระบบ ssh แรก มันจะไม่ให้ฉันแก้ไขคำตอบของคุณเพราะฉันเปลี่ยนไปไม่พอ ssh user@host.com -t 'cd /some/where; FOO=BAR; NUMBER=42; bash -l'ผมได้รับนี้ในการทำงาน ฉันคิดว่านั่นคือสิ่งที่คุณตั้งใจไว้
Rob Kwasowski

2

แก้ไข. bashrc และล้อมรอบการตั้งค่าสภาพแวดล้อมเฉพาะของ SSH ใน:

if [ $SSH_TTY ]; then
    ...
fi

สิ่งนี้จะช่วยให้คุณเพิ่มการตั้งค่าสำหรับเซสชัน SSH โดยเฉพาะ 'แน่นอนถ้าสิ่งที่คุณต้องการคือการตั้งค่าตัวแปรสภาพแวดล้อมตามความต้องการที่จุดเริ่มต้นที่แตกต่างกันไปตามเซสชั่นฉันไม่ทราบว่าคุณจะทำให้เครื่องเดาพวกเขาได้อย่างไรนอกเหนือจากการพิมพ์พวกเขา ... ไม่ว่าอะไรก็ตาม จะต้องมีเงื่อนไขทดสอบเพื่อยึดการตั้งค่าต่างๆ


2

จากsshหน้าคน:

นอกจากนี้ ssh อ่าน ~ / .ssh / environment และเพิ่มบรรทัดของรูปแบบ“ VARNAME = value” ให้กับสภาพแวดล้อมหากมีไฟล์อยู่และผู้ใช้ได้รับอนุญาตให้เปลี่ยนสภาพแวดล้อมได้ สำหรับข้อมูลเพิ่มเติมดูตัวเลือก PermitUserEnvironment ใน sshd_config (5)

ซึ่งพูดว่า:

PermitUserEnvironment
ระบุว่าตัวเลือก ~ / .ssh / environment และ environment = ใน ~ / .ssh / authorized_keys ถูกประมวลผลโดย sshd (8) ค่าเริ่มต้นคือ“ ไม่” การเปิดใช้งานการประมวลผลสภาพแวดล้อมอาจทำให้ผู้ใช้สามารถข้ามข้อ จำกัด การเข้าถึงในการกำหนดค่าบางอย่างโดยใช้กลไกเช่น LD_PRELOAD

สิ่งอำนวยความสะดวกนี้สามารถใช้เพื่อดำเนินการคำสั่งแบบมีเงื่อนไขในรีโมทของคุณ~/.bashrcโดยใช้ifโครงสร้างที่Mickeyแนะนำ


1

วิ่งด้วยวิธีนี้: ssh -t yourdomain 'cd /yourpath; bash'

  • -t : ดังนั้นข้อความแจ้งจะปรากฏขึ้น
  • ; bash: เพื่อให้มันจะกลับมาควบคุมแม้จะมีคำสั่งดำเนินการ (ที่นี่cd) และออกจากเซสชั่น ssh

ยินดีต้อนรับสู่ ServerFault! โปรดให้และอธิบายและ / หรือเอกสารสำหรับคำสั่งหรือสคริปต์เพื่ออธิบายสิ่งที่พวกเขามีไว้สำหรับ
Cory Knutson

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