ซอร์สไฟล์หลังจากล็อกอิน ssh เพื่อแจ้ง
คำถามหนึ่งบรรทัด:ฉันจะจัดหาไฟล์ระยะไกลโดยอัตโนมัติบนโฮสต์ระยะไกลได้อย่างไรหลังจากเข้าสู่ระบบผ่าน SSH ผ่านโฮสต์ป้อมปราการ
ฉันต้องการซอร์สไฟล์ที่มีรายการนามแฝง + ฟังก์ชันที่ผู้ใช้กำหนดเชลล์บนโฮสต์ระยะไกลหลังจาก ssh-ing เข้าไป
ไฟล์นี้มีอยู่บนการกลึงระยะไกลในโฟลเดอร์ / tmp เช่น / tmp / my-rc
ค้นหาโพสต์อื่น ๆ และอินเทอร์เน็ตที่ฉันพบ
ssh -t [email protected] 'source /tmp/my-rc; bash -l'
ปัญหาคือฉันได้รับเทอร์มินัล แต่ไม่มีการตั้งนามแฝงใด ๆ เนื่องจากเป็น bash shell ใหม่ '
คิดว่าแหล่งที่มาควรจะทำหลังจากที่แนบเชลล์ลองด้านล่าง แต่ก็ไม่ได้ผล ไม่มีข้อผิดพลาดฉันได้รับเทอร์มินัล แต่ไม่คิดว่าไฟล์มีที่มา (ตรวจสอบโดยสะท้อนข้อความจำลองจากไฟล์ / tmp / my-rc)
ssh -t [email protected] 'bash -l; source /tmp/my-rc'
แม้จะพยายามด้วย "." แทนที่จะเป็นแหล่งที่มาไม่มีโชค
ความช่วยเหลือใด ๆ
หมายเหตุ 1: Bash หรือ ZSH โซลูชันเชลล์ใด ๆ ที่จะทำ
Note2: actuall ssh ใช้คำสั่งพร็อกซีเช่นกระโดดข้ามป้อมปราการ (เพียงแค่บอกว่าเกี่ยวข้องหรือไม่)
หมายเหตุ 3: ฉันไม่มีความเป็นส่วนตัวของโปรไฟล์ rc หรือ bashrc หรือแม้แต่โฮมไดเร็กทอรีบนรีโมตโฮสต์
Note4: คำสั่งที่แน่นอนที่ฉันใช้เพื่อล็อกอินเข้าสู่โฮสต์ที่ปลอดภัยคือผ่านโฮสต์ป้อมปราการดังต่อไปนี้
ssh -o ProxyCommand='ssh -W %h:%p ec2-3-218-12-120.compute-1.amazonaws.com' 10.0.31.122
คำตอบ
ด้วยbash
คุณสามารถทำ:
ssh -t user@host '
PROMPT_COMMAND="source /tmp/my-rc
unset PROMPT_COMMAND
" exec bash --norc'
ซึ่งจะทำให้/tmp/my-rc
มีที่มาก่อนพรอมต์และจะมีเพียงพรอมต์นั้นเท่านั้นที่เราไม่ได้ตั้งค่าในPROMPT_COMMAND
ภายหลัง
คุณจะต้องลบunset PROMPT_COMMAND
if /tmp/my-rc
จริง ๆ แล้วให้นิยามมันออกไป
ด้านบนถือว่าล็อกอินเชลล์ของผู้ใช้ระยะไกลเป็นแบบบอร์น แต่คุณควรปรับให้เข้ากับเชลล์ประเภทอื่น ๆ ได้เกือบทั้งหมด (csh / rc / fish)
กำหนดว่าคุณสามารถเขียนไปยังพื้นที่ห่างไกลของ/tmp
คุณสามารถสร้าง/tmp/myhome
ไดเรกทอรีบนมันใส่เปลือกหอยของรายละเอียดและการเริ่มต้นไฟล์มีแล้วเริ่ม zsh กับZDOTIDR
ชุด/tmp/myhome
และทุบตีด้วยชุดHOME
/tmp/myhome
โดยค่าเริ่มต้นค้นหา zsh สำหรับไฟล์เริ่มต้นในการ$ZDOTDIR
ผิดนัดไป$HOME
ถ้าZDOTDIR
ไม่ได้ตั้งค่า
ดังนั้นคุณสามารถเริ่ม Zsh บนโฮสต์ระยะไกลได้ดังนี้:
ssh -t user@host ZDOTDIR=/tmp/myhome zsh
และทุบตีเป็น:
ssh -t user@host HOME=/tmp/myhome bash
แน่นอนว่าคุณสามารถสร้างสรรค์กับไฟล์โปรไฟล์ / การเริ่มต้นของคุณได้เช่นใช้เพื่อตั้งค่าHOME
เส้นทางที่เหมาะสมกว่าแหล่งไฟล์อื่น ๆ (หากคุณมี dot-files อยู่ที่ใดที่หนึ่งบนโฮสต์ระยะไกลแล้ว) ฯลฯ
การประยุกต์ใช้แนวทางนี้เพียงเล็กน้อยซึ่งย่อมาจากคำสั่งเดียวอาจเป็น:
ssh -t user@host 'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
(ใช้mkdir -p ...
เพื่อป้องกันไม่ให้แสดงข้อผิดพลาดเมื่อ/tmp/myhome
มีอยู่แล้วเช่นหากคุณกำลังเชื่อมต่อกับโฮสต์ระยะไกลอีกครั้งและคุณทราบว่ามีไดเร็กทอรีอยู่แล้ว)
เมื่อProxyCommand
พิจารณาถึงสิ่งนี้อาจเป็น:
ssh -t -o ProxyCommand='ssh -W \
%h:%p ec2-3-218-12-120.compute-1.amazonaws.com' \
10.0.31.122 \
'mkdir /tmp/myhome
echo ". /tmp/my-rc" >/tmp/myhome/.bashrc
HOME=/tmp/myhome bash'
สุดท้ายเกี่ยวกับความพยายามของคุณ: ssh -t [email protected] 'bash -l; source /tmp/my-rc'
ไม่ทำงานเนื่องจากsource
คำสั่งจะดำเนินการหลังจากออกจากเชลล์แบบโต้ตอบเท่านั้น
หากUsePAMถูกตั้งไว้ที่ใช่ในไฟล์ sshd_config โฮสต์ระยะไกลแล้วปรับแต่งไฟล์/etc/pam.d/sshdช่วยให้คุณสามารถ Automize เรียกคำสั่งเมื่อเข้าสู่ระบบที่ประสบความสำเร็จในหมู่กิจกรรมอื่น ๆ ในขั้นตอนการตรวจสอบ เพิ่มบรรทัดของรหัสนี้
session required pam_exec.so /etc/myscripts/./sourcing-script
เหนือเส้นเหล่านี้โดยตรง
# SELinux needs to intervene at login time to ensure that the process starts
# in the proper default security context. Only sessions which are intended
# to run in the user's context should be run after this.
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
โดยที่ / etc / myscripts / sourcing-script เป็นไฟล์บนโฮสต์ระยะไกลที่มีคำสั่งให้ดำเนินการเมื่อเข้าสู่ระบบสำเร็จ
#!/bin/bash
source /tmp/my-rc
#echo $(date) >> /etc/myscripts/sourcing-script.log
#cat /tmp/my-rc >> /etc/myscripts/sourcing-script.log
ฉันใช้วิธีนี้เพื่อหยุดบริการและรายงานไปยังไฟล์บันทึกก่อนที่เซสชัน ssh ของฉันจะเปิดขึ้น ก่อนที่ฉันจะออกจากระบบฉันตั้งค่า crontab เพื่อเริ่มบริการดังนั้นจึงไม่ทำงานคู่ขนานกับเซสชัน ssh ของฉัน
โดยปกติคุณจะทำสิ่งนี้ใน$HOME/.profile
หรือรูปแบบต่างๆ
ssh
ตั้งค่าตัวแปรสภาพแวดล้อมโดยเริ่มจากSSH_
คุณสามารถใช้ตัวแปรเหล่านี้เพื่อพิจารณาว่าคุณเข้าสู่ระบบผ่านssh
หรือโดยตรง