2012-10-08 23 views
9

Tôi có một câu hỏi mà tôi tự hỏi liệu có ai đã cố gắng đạt được những điều sau đây không:Thực hiện hành động khi người dùng đăng nhập qua SSH từ một máy chủ cụ thể

Giả sử đây là kết quả của 'cuối cùng' của tôi lệnh trong một môi trường Linux:

root pts/1  192.168.1.10  Wed Feb 10 07:04 - 07:57 (00:52) 
root pts/2       Tue Feb 9 22:00 - 00:13 (02:13) 

Làm thế nào tôi có thể thiết lập một hành động cụ thể (nói ví dụ như một motd sửa đổi hoặc gửi email) nếu người dùng 'root' đã đăng nhập từ 192.168.1.10. Có cách nào để thu thập thông tin này không?

Phần thứ hai của câu hỏi này là làm thế nào tôi có thể làm cho trên kiểm tra mạnh mẽ hơn một chút - tức là nếu tôi có như sau:

mary pts/1  192.168.1.10  Wed Feb 10 07:04 - 07:57 (00:52) 
bob pts/2       Tue Feb 9 22:00 - 00:13 (02:13)  

Bây giờ tôi muốn thực hiện một hành động nếu tên người dùng bằng 'mary' và host là 192.168.1.10.

Bất kỳ đề xuất nào đều được hoan nghênh.

Cảm ơn bạn trước.

Trả lời

1

Cảm ơn tất cả trả lời của bạn. Cuối cùng, tôi đã tìm ra một giải pháp nào đó có hiệu quả trong thời gian này nhưng nó có một lỗ hổng mà tôi sẽ chỉ ra trong một phút.

tôi đã thêm dòng sau vào file/etc của tôi/.bashrc (hoặc bất cứ điều gì /etc/bash.bashrc môi trường bạn đang sử dụng):

HOST="192.168.0.1" 
RHOST=`who am i | sed -n 's/.*(\([^) ]*\).*/\1/p; 1q'` 
if [ "$RHOST" == "$HOST" ]; then 
     echo "SAY WHAT!" 
     #add further actions here if needed 
fi 

Các lỗ hổng mà tôi đang nói về trước khi có thể thực sự không là một lỗ hổng. Nếu bạn đã SSH-ed vào hệ thống, và bạn muốn SSH đến một máy chủ lưu trữ trên cùng một IP, giả sử ssh [email protected]who am i sau đó sẽ in 'máy chủ của bạn' nhưng tôi nghĩ đó là cách cần thiết.

Không cần phải nói rằng câu lệnh trên sed có thể được sửa đổi để bạn có thể nắm bắt tên người dùng, và bạn có thể mở rộng câu lệnh if/else để đáp ứng nhu cầu của mình.

Cảm ơn bạn một lần nữa cho tất cả các thư trả lời của bạn.

+0

Bạn đã thử nghiệm tệp 'sshrc' của mình chưa? =) –

+0

Tôi thích giải pháp của bạn cũng như sputnick, cảm ơn! :) – Tamas

+0

Xin chào sputnick. Chúng tôi đang đến cấp 2 :) Bạn có biết cách loại trừ việc đăng nhập các lệnh ssh đến từ cronjobs/mẩu mã không. Tôi chỉ quan tâm đến đăng nhập người dùng từ một bảng điều khiển. Cảm ơn. – Tamas

0

Một cách sẽ được chạy một kịch bản đơn giản theo định kỳ:

#!/bin/bash 
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*/\1/p') 
for user in $users; do 
    sendmail "$user" < email.txt 
done 

này sẽ ống lệnh cuối cùng vào sed để trích xuất một danh sách người dùng và lưu nó vào biến $users. Lệnh sed sử dụng cờ -n để nó chỉ in những gì chúng ta nói. Đầu tiên, chúng tôi chọn các dòng có chứa IP được chỉ định, với địa chỉ "/192\.168\.1\.10/". Trên những dòng này, chúng tôi cố gắng trích xuất các ký tự trước một khoảng trắng và nếu chúng ta thành công, chúng tôi sẽ in kết quả.

Sau đó, chúng tôi có thể lặp qua biến số $users và hành động tương ứng.

Một cách để gọi liên tục này sẽ là thông qua cron và cách đơn giản hơn là làm while true; do ./my_script.bash; sleep 60; done.

+0

Re cron so với while, thay vì sử dụng inotifywait để phát hiện các thay đổi trong/var/log/wtmp. –

+0

Cảm ơn Janito. Tôi nghĩ rằng phải có một cái gì đó nhiều hơn "tương tác". Suy nghĩ của tôi là nếu lastlog được cập nhật với giá trị khi ai đó ssh-s vào máy chủ, thông tin rất giống nhau đó có thể được chụp và sau đó đưa vào tệp /etc/bash.bashrc để nó được gọi khi đăng nhập. – Tamas

0

Bạn có thể thêm thứ gì đó vào /etc/profile hoặc tương đương làm điều gì đó tùy thuộc vào giá trị $SSH_CLIENT.

0

Dường như bạn đang sử dụng last vì nó đọc /var/log/wtmp theo mặc định là bản ghi thông tin đăng nhập. Lệnh who cũng cho phép bạn đọc cùng một tệp nhưng với giao diện phù hợp hơn với nhu cầu của bạn.

Ví dụ:

$ who --ips /var/log/wtmp | grep '^msw.*127.0.0.1' 
msw  pts/2  2012-10-07 15:52 127.0.0.1 
msw  pts/3  2012-10-07 15:55 127.0.0.1 

nơi không ai trong số những phiên đã hoạt động, mà là lịch sử và đăng nhập.

15

Có một tệp đặc biệt /etc/ssh/sshrc nơi bạn có thể đặt một số lệnh sẽ chạy mỗi lần ai đó kết nối bằng ssh.Tôi đã viết điều đó cho bạn:

#!/bin/bash 

[email protected] 
monitored_user=root 
monitored_ip=x.x.x.x 

hostname=$(hostname) 

# add a welcome message: 
printf >&2 "\nWelcome on $hostname $USER\n" 

read -d " " ip <<< $SSH_CONNECTION 

[[ $ip == $monitored_ip && $USER == $monitored_user ]] || exit 0 

date=$(date "+%d.%m.%Y %Hh%M") 
reverse=$(dig -x $ip +short) 

mail -s "Connexion of $USER on $hostname" $mail <<EOF 

IP: $ip 
Reverse: $reverse 
Date: $date 
EOF 

Đặt kịch bản này trong một tập tin, sau đó đưa đường dẫn đầy đủ của kịch bản trong /etc/ssh/sshrc

Trong man ssh:

/etc/ssh/sshrc : Commands in this file are executed by ssh when the user logs in, just before the user's shell (or command) is started. See the sshd(8) manual page for more information.

+0

Đặt tập lệnh này vào một tệp, sau đó đặt đường dẫn đầy đủ của tập lệnh trong '/ etc/ssh/sshrc', vì tệp sshrc không xử lý các thử nghiệm bash. POST đã chỉnh sửa tương ứng. –

+1

Tôi có lỗi "Lỗi cú pháp: chuyển hướng không mong muốn". Dòng 12. – Sergey

+0

Tôi gặp vấn đề tương tự như @Sergey. Ngoài ra, nó không có vẻ giống như '[['. Tôi đã thử 'echo $ SHELL' trong kịch bản để xác nhận nó là bash. FWIW '[' hoạt động. Oh, và 'dig' chưa được cài đặt. – Sparhawk

0

Trong ubuntu tôi đặt một kịch bản trong

/etc/profile.d 

và khi ai đó (người dùng ssh) đăng nhập, nó gửi một email đến mail của tôi

#/etc/profile.d/run_on_loggin.sh 
echo $(who i am) | mail -s 'SSH Login Notification' [email protected] 

Tôi muốn tạo một file php với smtp, để gửi email bằng thư của tôi cho tôi ... một số lần hotmail được lưu trong thư rác ...

nếu tôi có tệp php tôi sẽ chạy như this ...

nếu tôi muốn vượt qua var nộp php chạy như this ...

cớ tiếng anh của tôi: 3

lưu ý: tôi nghĩ rằng lệnh này chạy từ người dùng, hãy cẩn thận nếu người dùng doen't có quyền sử dụng một số lệnh hoặc gửi email.

Các vấn đề liên quan