Chạy tập lệnh (hệ thống) khi đăng nhập SSH và / hoặc đăng xuất


12

Tôi muốn máy chủ OpenSSH của tôi khởi động tập lệnh bất cứ khi nào người dùng đăng nhập bằng SSH, lý tưởng là chuyển tên máy chủ hoặc IP, cũng như tên người dùng. Ngoài ra, tôi muốn nó chạy tập lệnh, bất cứ khi nào một phiên kết thúc (chuyển tên người dùng). Các tập lệnh này không nên chạy trong phiên của người dùng, nhưng toàn hệ thống.

Ý tưởng là đưa ra cảnh báo âm thanh khi đăng nhập và đăng xuất, ví dụ như sử dụng espeakvà hiển thị thông tin trên màn hình ngoài.

Tôi đã thấy rằng có một pam-scriptsgói nhưng tôi không chắc liệu đây có phải là thứ tôi muốn hay không, làm thế nào để sử dụng nó.

Câu trả lời:


10

Bạn có thể buộc một lệnh đối với người dùng SSH của bạn thay vì lệnh họ yêu cầu (hoặc trình bao của họ nếu họ không đưa ra một lệnh cụ thể). Điều này có thể được thực hiện bằng cách chỉ định lệnh đó với một cái gì đó giống như ForceCommand /root/ssh-wrappertrong /etc/ssh/sshd_config(không quan trọng là tập lệnh được đặt ở đâu hoặc được đặt tên như thế nào, chỉ cần đảm bảo rằng nó có thể được thực thi bởi tất cả người dùng và tệp cấu hình sshd trỏ đến nó). Bạn cũng cần phải khởi động lại / tải lại sshd. Lệnh ban đầu có thể truy cập vào lệnh bắt buộc như $SSH_ORIGINAL_COMMAND.

Tôi vừa hack đoạn script này cùng nhau:

#! /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

Bây giờ mỗi khi tôi đăng nhập hoặc đăng xuất, một giọng nói sẽ cho tôi biết về nó và một mục nhật ký được ghi vào syslog. Nó cũng ghi lại lệnh. Bạn có thể sử dụng một cái gì đó như sau để "theo dõi" việc sử dụng sshd của bạn:

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

Xin lưu ý rằng kịch bản này hầu hết chưa được kiểm tra, vì vậy hãy tự chịu rủi ro khi sử dụng! ;-)

PS: hãy nhớ rằng tập lệnh này được chạy với tư cách là người dùng đã đăng nhập, vì vậy bạn không thể làm mọi thứ bạn muốn nếu bạn thay đổi nó để thêm nhiều tính năng hơn ...


Xin chào, Có cách nào để phát hiện tình huống khi người dùng chỉ cần đóng cửa sổ với ssh client. Kịch bản của bạn không gặp phải tình huống này .. Cảm ơn.
Dmitry E Da

Nên shellthay thế bằng $ {SSH_ORIGINAL_COMMENT: -shell} bằng đường dẫn thực tế tới trình bao, ví dụ: / thùng / bash? Khi tôi chỉ cố chạy nó, nó phàn nàn rằng không có lệnh nào như shell. Trên thực tế, tôi đoán có lẽ những gì bạn có nghĩa là $ SHELL? Điều đó sẽ chạy shell được chỉ định của người dùng.
Ibrahim

1

Tôi đã thấy sự kiện phù hợp này trong tệp nhật ký trước đây (điều này sẽ cho phép bạn linh hoạt trong việc khớp mọi thứ). Trang này được định dạng kém nhưng nó có thể giúp bạn bắt đầu: https://help.ubfox.com/community/AudibleLogs#Play với esound


Tôi nghĩ bạn / họ có nghĩa là espeakthay vì esound?
JanC

0

(Trả lời được đăng chéo từ cùng một câu hỏi trên ServerFault )

Chỉ cần viết một kịch bản để làm bất cứ điều gì bạn muốn và sau đó gắn nó vào /etc/profilehoặc có thể /etc/bash.bashrctùy thuộc vào nhu cầu của bạn. Thay đổi đối với các tệp đó sẽ áp dụng cho tất cả người dùng. Mặc dù vậy, tôi không chắc chắn về cách bạn thông báo về việc đăng xuất với phương pháp này.

Ngoài ra, một cách khác để làm điều này là có một trình giám sát daemon đơn giản /var/log/authcho các phiên ssh mới (và kết thúc). Bằng cách đó, nó sẽ có thể gửi thông báo trên cả đăng nhập và đăng xuất.


0

Bạn có thể sử dụng sshrc (man sshd, tìm kiếm sshrc)

ssh sẽ thực thi / etc / ssh / sshrc nếu nó tồn tại và bạn có thể chạy một tập lệnh (hoặc gọi nhiều tập lệnh) từ đó

bạn có thể gọi bất kỳ biến bash nào, thích $USERhoặc lấy IP qua

read -d " " ip <<< $SSH_CONNECTION

bạn có thể viết một kịch bản để kiểm tra hoặc ghi nhật ký những gì bạn muốn.

Kịch bản đăng xuất ... tốt, đó là những gì tôi đang tìm kiếm! : D


0

Tôi nghĩ PAM là lựa chọn tốt nhất. Nó toàn hệ thống và không thể bị ghi đè bởi các tệp cấu hình của người dùng.

Bạn có thể làm theo các bước sau. Họ đã làm việc cho tôi trên Ubuntu 14.04.4 LTS.

Chạy:

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

Chỉnh sửa tập tin trống đó và thêm các dòng sau:

#!/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

Sau đó, cấp quyền thực thi cho tập lệnh:

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

Bây giờ, chạy:

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

Thêm các dòng này vào cuối tập tin:

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

Không cần phải khởi động lại bất kỳ dịch vụ nào. Lưu ý rằng tập lệnh này cũng sẽ được chạy khi người dùng đăng nhập từ thiết bị đầu cuối thay vì SSH.

Lưu ý 1: Bạn có thể chuyển sang espeakhoặc bất kỳ quy trình nào khác phù hợp với nhu cầu của bạn (email, thông báo đẩy, v.v.). Nếu bạn sử dụng writengười dùng đã đăng nhập, họ sẽ thấy các thông báo đầu ra trực tiếp trên thiết bị đầu cuối của họ.

Tài liệu tham khảo:
https://blog.stalkr.net/2010/11/login-notifying-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -đăng nhập người dùng/

Liên quan:
Làm cách nào để thiết lập cảnh báo email khi đăng nhập ssh thành công?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-rem
Remote-accessed-via /server//questions / 395393 / email-notify-about-every-ssh-Connection-to-linux-server

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.