2012-10-08 6 views
9

Ho un quesiton che mi lascia perplesso e mi chiedo se qualcuno ha tentato di raggiungere i seguenti obiettivi:eseguire l'azione quando l'utente accede tramite SSH da un particolare host

Supponiamo che questo è il risultato della mia 'ultima' comando in un ambiente 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) 

Come posso installare una determinata azione (diciamo per esempio un MOTD modificato o inviando una e-mail) se l'utente 'root' ha effettuato l'accesso da 192.168.1.10. C'è un modo per catturare queste informazioni?

La seconda parte di questa domanda è che come posso fare quanto sopra controllare un po 'più robusto - vale a dire se ho il seguente:

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)  

Ora vorrei per eseguire un'azione se il nome utente è uguale a 'mary' e l'host è 192.168.1.10.

Qualsiasi suggerimento è benvenuto.

Grazie in anticipo.

risposta

1

Grazie per tutte le vostre risposte. Alla fine sono riuscito a trovare una soluzione che funziona al momento, ma ha un difetto che farò notare in un minuto.

ho aggiunto il seguente al mio file/etc/bashrc (o /etc/bash.bashrc qualsiasi ambiente che si sta utilizzando):

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 

Il difetto che stavo parlando prima di maggio in realtà non essere un difetto Se sei già SSH-ed nel sistema, e vuoi SSH per un host che vive sullo stesso IP, diciamo che ssh [email protected]who am i stamperebbe "tuo-host" ma penso che sia così che dovrebbe essere.

Inutile dire che la precedente dichiarazione sed può essere modificata in modo da poter acquisire anche il nome utente ed è possibile estendere l'istruzione if/else alle proprie esigenze.

Grazie ancora per tutte le vostre risposte.

+0

Hai testato il mio file 'sshrc'? =) –

+0

Mi piace anche la tua soluzione, sputnick, grazie! :) – Tamas

+0

Ciao sputnick. Stiamo arrivando al livello 2 :) Sai come escludere la registrazione dei comandi ssh che provengono da cronjob/pezzi di codice. Mi interessa solo il login utente da una console. Grazie. – Tamas

0

Un modo potrebbe essere quello di eseguire periodicamente un semplice script:

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

Questo sarebbe il tubo l'ultimo comando in sed per estrarre un elenco di utenti e salvarlo nella variabile $users. Il comando sed usa il flag -n in modo che stampi solo ciò che gli diciamo. Per prima cosa, selezioniamo le linee che contengono l'IP specificato, con l'indirizzo "/192\.168\.1\.10/". Su quelle linee, tentiamo di estrarre i caratteri prima di uno spazio, e se ci riusciamo stampiamo il risultato.

Quindi, è possibile scorrere la variabile e agire di conseguenza.

Un modo per chiamare questo ripetutamente sarebbe tramite cron, e un modo più semplice sarebbe fare while true; do ./my_script.bash; sleep 60; done.

+0

Re cron vs while, utilizzare invece inotifywait per rilevare le modifiche in/var/log/wtmp. –

+0

Grazie Janito. Penso che ci debba essere qualcosa di più "interattivo". Il mio pensiero è che se l'ultimo registro viene aggiornato con un valore una volta qualcuno ssh-s nel server, quella stessa informazione potrebbe essere catturata e quindi inserita nel file /etc/bash.bashrc così da essere chiamata al login. – Tamas

0

È possibile aggiungere qualcosa a /etc/profile o equivalente che fa qualcosa in base al valore di $SSH_CLIENT.

0

Sembra che si stia utilizzando last perché legge /var/log/wtmp per impostazione predefinita che è un record di accessi. Il comando who consente inoltre di leggere lo stesso file ma con un'interfaccia più adatta alle proprie esigenze.

Ad esempio:

$ 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 

in cui nessuna di queste sessioni erano attivi, ma piuttosto storico e registrati.

15

C'è un file speciale /etc/ssh/sshrc in cui è possibile inserire alcuni comandi che verranno eseguiti ogni volta che qualcuno si connette da ssh.Ho scritto che per voi:

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

mettere questo script in un file, poi mettere il percorso completo dello script in /etc/ssh/sshrc

In 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

Metti questo script in un file, quindi inserisci il percorso completo dello script in '/ etc/ssh/sshrc', perché il file sshrc non gestisce i test di bash. POST modificato di conseguenza. –

+1

Ho un "Errore di sintassi: reindirizzamento imprevisto". Riga 12. – Sergey

+0

Ho lo stesso problema di @Sergey. Inoltre, non sembra gradire il '[['. Ho provato 'echo $ SHELL' all'interno dello script per confermare che era bash. FWIW '[' funziona. Oh, e 'dig' non è installato. – Sparhawk

0

in Ubuntu ho messo uno script in

/etc/profile.d 

e quando qualcuno (ssh utente) l'accesso, si invia una e-mail alla mia mail

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

voglio creare un file php con smtp, per inviare e-mail con la mia posta a me ... a volte Hotmail salvati in spam ...

se ho il file php correrò come this ...

se voglio passare var archiviare eseguire PHP come this ...

scusa il mio inglese: 3

nota: penso che questo comando di marcia da utente, essere attentamente se l'utente doen't ha il permesso di usare qualche comando o inviare email.

Problemi correlati