ซอร์สไฟล์หลังจากล็อกอิน ssh เพื่อแจ้ง

Aug 16 2020

คำถามหนึ่งบรรทัด:ฉันจะจัดหาไฟล์ระยะไกลโดยอัตโนมัติบนโฮสต์ระยะไกลได้อย่างไรหลังจากเข้าสู่ระบบผ่าน 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  

คำตอบ

4 StéphaneChazelas Sep 01 2020 at 23:09

ด้วยbashคุณสามารถทำ:

ssh -t user@host '
  PROMPT_COMMAND="source /tmp/my-rc
                  unset PROMPT_COMMAND
                 " exec bash --norc'

ซึ่งจะทำให้/tmp/my-rcมีที่มาก่อนพรอมต์และจะมีเพียงพรอมต์นั้นเท่านั้นที่เราไม่ได้ตั้งค่าในPROMPT_COMMANDภายหลัง

คุณจะต้องลบunset PROMPT_COMMANDif /tmp/my-rcจริง ๆ แล้วให้นิยามมันออกไป

ด้านบนถือว่าล็อกอินเชลล์ของผู้ใช้ระยะไกลเป็นแบบบอร์น แต่คุณควรปรับให้เข้ากับเชลล์ประเภทอื่น ๆ ได้เกือบทั้งหมด (csh / rc / fish)

2 fra-san Sep 01 2020 at 22:30

กำหนดว่าคุณสามารถเขียนไปยังพื้นที่ห่างไกลของ/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คำสั่งจะดำเนินการหลังจากออกจากเชลล์แบบโต้ตอบเท่านั้น

1 jakethefinn Sep 04 2020 at 19:40

หาก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 ของฉัน

dirkt Aug 16 2020 at 13:40

โดยปกติคุณจะทำสิ่งนี้ใน$HOME/.profileหรือรูปแบบต่างๆ

sshตั้งค่าตัวแปรสภาพแวดล้อมโดยเริ่มจากSSH_คุณสามารถใช้ตัวแปรเหล่านี้เพื่อพิจารณาว่าคุณเข้าสู่ระบบผ่านsshหรือโดยตรง