สคริปต์ Run (ระบบ) ในการเข้าสู่ระบบ SSH และ / หรือออกจากระบบ


12

ฉันต้องการเซิร์ฟเวอร์ OpenSSH ของฉันเพื่อเริ่มต้นสคริปต์เมื่อใดก็ตามที่ผู้ใช้ลงชื่อเข้าใช้ด้วย SSH โดยผ่านชื่อโฮสต์หรือ IP รวมถึงชื่อผู้ใช้ นอกจากนี้ฉันต้องการให้เรียกใช้สคริปต์เมื่อใดก็ตามที่เซสชันสิ้นสุดลง (ส่งชื่อผู้ใช้) สคริปต์เหล่านี้ไม่ควรรันในเซสชันของผู้ใช้ แต่เป็นระบบทั้งระบบ

แนวคิดคือการให้คำเตือนเสียงในการเข้าสู่ระบบและออกจากระบบเช่นการใช้espeakและเพื่อแสดงข้อมูลบนจอแสดงผลภายนอก

ฉันเคยเห็นว่ามีpam-scriptsแพ็คเกจ แต่ฉันไม่แน่ใจว่าสิ่งนี้เป็นสิ่งที่ฉันต้องการหรือไม่และจะใช้อย่างไร

คำตอบ:


10

คุณสามารถบังคับให้คำสั่งไปยังผู้ใช้ SSH ของคุณแทนคำสั่งที่พวกเขาร้องขอ (หรือเชลล์หากพวกเขาไม่ได้ให้คำสั่งเฉพาะ) ซึ่งสามารถทำได้โดยการระบุคำสั่งที่กับสิ่งที่ต้องการForceCommand /root/ssh-wrapperใน/etc/ssh/sshd_config(มันไม่สำคัญที่สคริปต์ที่ตั้งอยู่หรือวิธีการที่จะตั้งชื่อเพียงให้แน่ใจว่ามันเป็นปฏิบัติการโดยผู้ใช้ทั้งหมดและจุดแฟ้มการกำหนดค่า sshd ไปได้) sshdนอกจากนี้คุณยังจำเป็นที่จะต้องเริ่มต้นใหม่ / โหลด คำสั่งเดิมคือสามารถเข้าถึงคำสั่งบังคับให้$SSH_ORIGINAL_COMMANDเป็น

ฉันเพิ่งแฮกสคริปต์นี้ด้วยกัน:

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

ตอนนี้ทุกครั้งที่ฉันเข้าสู่ระบบหรือออกจากระบบเสียงจะบอกฉันเกี่ยวกับมันและรายการบันทึกจะถูกเขียนไปยัง syslog นอกจากนี้ยังบันทึกคำสั่ง คุณสามารถใช้สิ่งต่อไปนี้เพื่อ "ติดตาม" การใช้งาน sshd ของคุณ:

tailf /var/log/syslog | grep ssh-wrapper

โปรดทราบว่าสคริปต์นี้ส่วนใหญ่ยังไม่ได้ทดสอบดังนั้นคุณต้องยอมรับความเสี่ยงเอง! ;-)

PS: โปรดจำไว้ว่าสคริปต์นี้ทำงานในฐานะผู้ใช้ที่ลงชื่อเข้าใช้ดังนั้นคุณไม่สามารถทำทุกสิ่งที่คุณต้องการหากคุณเปลี่ยนเพื่อเพิ่มคุณสมบัติเพิ่มเติม ...


สวัสดีมีวิธีการตรวจสอบสถานการณ์ใด ๆ เมื่อผู้ใช้เพิ่งปิดหน้าต่างด้วยไคลเอ็นต์ ssh สคริปต์ของคุณไม่ขอสถานการณ์นี้ .. ขอบคุณ
Dmitry Eskin

ควรเปลี่ยนเป็นshell$ {SSH_ORIGINAL_COMMENT: -shell} ด้วยพา ธ ที่แท้จริงไปยังเชลล์เช่น / bin / ทุบตี? เมื่อฉันพยายามเรียกใช้มันก็บ่นว่าไม่มีคำสั่งเช่นเชลล์ ที่จริงแล้วฉันเดาว่าสิ่งที่คุณหมายถึงคือ $ SHELL ที่ควรรันเชลล์ที่ระบุของผู้ใช้
อิบราฮิม

1

ฉันเคยเห็นเหตุการณ์ที่ตรงกันนี้ในล็อกไฟล์มาก่อน (ซึ่งจะช่วยให้คุณมีความยืดหยุ่นในการจับคู่อะไรก็ได้) หน้านี้มีรูปแบบไม่ดี แต่อาจช่วยให้คุณเริ่มต้นได้: https://help.ubuntu.com/community/AudibleLogs#Playด้วย esound


ฉันคิดว่าคุณ / พวกเขาหมายถึงespeakแทนที่จะesound?
JanC

0

(คำตอบข้ามโพสต์จากคำถามเดียวกันในServerFault )

เพียงเขียนสคริปต์เพื่อทำสิ่งที่คุณต้องการแล้วติดมัน/etc/profileหรืออาจ/etc/bash.bashrcขึ้นอยู่กับความต้องการของคุณ การเปลี่ยนแปลงไฟล์เหล่านั้นจะมีผลกับผู้ใช้ทุกคน ฉันไม่แน่ใจว่าคุณจะแจ้งให้ออกจากระบบด้วยวิธีนี้อย่างไร

อีกวิธีหนึ่งในการทำเช่นนี้คือให้มีการตรวจสอบ daemon อย่างง่าย/var/log/authสำหรับเซสชัน ssh ใหม่ (และปิด) ด้วยวิธีนี้มันจะสามารถส่งการแจ้งเตือนทั้งในการเข้าสู่ระบบและออกจากระบบ


0

คุณสามารถใช้ sshrc (man sshd, ค้นหา sshrc)

ssh จะดำเนินการ / etc / ssh / sshrc หากมีอยู่และคุณสามารถเรียกใช้หนึ่งสคริปต์ (หรือเรียกหลายสคริปต์) จากที่นั่น

คุณสามารถเรียกตัวแปร bash ใด ๆ เช่น$USERหรือรับ IP ผ่าน

read -d " " ip <<< $SSH_CONNECTION

คุณสามารถเขียนสคริปต์เพื่อทดสอบหรือบันทึกสิ่งที่คุณต้องการ

สคริปต์ออกจากระบบ ... นั่นคือสิ่งที่ฉันกำลังค้นหา! : D


0

ฉันคิดว่าPAMเป็นตัวเลือกที่ดีที่สุด มันกว้างทั้งระบบและไม่สามารถแทนที่ได้ด้วยไฟล์ปรับแต่งของผู้ใช้

คุณสามารถทำตามขั้นตอนเหล่านี้ พวกเขาทำงานให้ฉันบน Ubuntu 14.04.4 LTS

วิ่ง:

$ sudo pico /opt/custom/bin/info-session.sh

แก้ไขไฟล์ว่างเปล่านั้นและเพิ่มบรรทัดเหล่านี้:

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

หลังจากนั้นให้ดำเนินการอนุญาตให้สคริปต์:

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

ตอนนี้เรียกใช้:

$ sudo pico /etc/pam.d/common-session

เพิ่มบรรทัดเหล่านี้ที่ท้ายไฟล์:

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

ไม่จำเป็นต้องรีสตาร์ทบริการใด ๆ โปรดทราบว่าสคริปต์นี้จะทำงานเมื่อผู้ใช้ลงชื่อเข้าใช้จากเทอร์มินัลแทน SSH

หมายเหตุ 1:คุณสามารถไพพ์ไปยังespeakหรือกระบวนการอื่น ๆ ที่เหมาะกับความต้องการของคุณ (อีเมล, การแจ้งเตือนและอื่น ๆ ... ) หากคุณใช้writeและผู้ใช้เข้าสู่ระบบเขาหรือเธอจะเห็นข้อความที่ส่งออกโดยตรงใน terminal ของพวกเขา

ข้อมูลอ้างอิง:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on ที่ผู้ใช้เข้าสู่ระบบ /

ที่เกี่ยวข้อง:
ฉันจะตั้งค่าการแจ้งเตือนทางอีเมลได้อย่างไรเมื่อการเข้าสู่ระบบ ssh สำเร็จ
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / อีเมลแจ้งเตือนเกี่ยวกับแต่ละ SSH การเชื่อมต่อไปยังเซิร์ฟเวอร์ลินุกซ์

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