2016-10-13 2 views
0

Ich möchte dies:Wie finden Sie Benutzer, die in den letzten 24 Stunden mit dem Server verbunden sind?

sojjan pts/9  localhost  Thu Oct 13 08:04:14 2016 - Thu Oct 13 08:04:15 2016 (00:00)  
gurra pts/9  localhost  Wed Oct 12 15:36:00 2016 - Wed Oct 12 15:36:02 2016 (00:00)  
sojjan pts/8  :0    Wed Oct 12 10:13:34 2016 still logged in      
sojjan pts/7  :0    Mon Oct 10 13:34:56 2016 still logged in 

Um so geworden:

Last 24h SSH logins: 

sojjan pts/9  localhost  Thu Oct 13 08:04:14 2016 - Thu Oct 13 08:04:15 2016 (00:00)  
gurra pts/9  localhost  Wed Oct 12 15:36:00 2016 - Wed Oct 12 15:36:02 2016 (00:00)  

Still logged in: 

sojjan pts/8  :0    Wed Oct 12 10:13:34 2016 still logged in      
sojjan pts/7  :0    Mon Oct 10 13:34:56 2016 still logged in 

Ich versuchte so

#!/bin/bash 

test0=$(last -F | grep still) 
test1=$(date | awk {'print $2, $3'}); 
test2=$(date --date='-1 days' | awk {'print $2, $3'}); 

last -F | grep -v 'reboot' | grep -i "$test0\|$test1\|$test2" 

Antwort

0

versuchen dies;

#!/bin/bash 
lastday=$(date --date='-1 days' | awk {'print $2, $3'}); 

echo -e "Last 24h SSH logins:\n" 
last -F | grep -v 'reboot' | grep -i "$lastday" 

echo -e "\nStill logged in:\n" 
last -F | grep -v 'reboot' | grep -i "still" 
3

Es ist ein handlicher Parameter im last Befehl:

-t YYYYMMDDHHMMSS

Anzeige des Status der Anmeldungen als die angegebenen Zeit. Dies ist zum Beispiel nützlich, um einfach zu bestimmen, wer zu einer bestimmten Zeit angemeldet war - spezifizieren Sie diese Zeit mit -t und suchen Sie nach "immer noch eingeloggt".

Damit wir last Befehl ab 24 Stunden vor und vergleichen sie mit jetzt mit process substitution bekommen:

diff <(last) <(last -t "$(date -d"1 day ago" "+%Y%m%d%H%M%S")") 

Dann ist es eine Frage diese Ausgabe zu parsen, die Sie mit awk tun können :

awk '/still logged in\s*$/ {logged[NR]=$0; next} # store logged 
    {finished[NR]=$0}       # store finished 
    END {print "Last 24h SSH logins:";   # print header finished 
    for (i in finished)       # print finished 
     print finished[i]; 
    printf "\nStill logged in:\n";    # print header logged 
    for (i in logged)       # print logged 
     print logged[i]}' 

Alle zusammen, und als Einzeiler, haben Sie so etwas wie:

diff <(last) <(last -t "$(date -d"1 day ago" "+%Y%m%d%H%M%S")") | awk '/still logged in\s*$/ {logged[NR]=$0; next} {finished[NR]=$0} END {print "Last 24h SSH logins:"; for (i in finished) print finished[i]; printf "\nStill logged in:\n"; for (i in logged) print logged[i]}' 
+0

Dank Mustafa und Fedorqui. Ich bin neu so. –

+0

Aber ich weiß nicht, wie ich diese Informationen zu einem funktionierenden Skript bekomme. heee –

+0

@Larsvontrierpung dann musst du selbst forschen. Wir sind nicht hier, um Sie zu füttern, sondern um Ihnen zu helfen. Probieren Sie es aus und kommen Sie mit spezifischen Fragen zurück. – fedorqui

0

Das funktioniert jetzt gut!

Danke!

#!/bin/bash 
lastday=$(date --date='-1 days' | awk '{ print $2, $3 }'|sed 's/ \([1-9]\)$/ \1/') 

echo "lastday $lastday" 
echo 




echo -e "\nLast 24h SSH logins:" 
last -F | grep -v 'reboot' | grep "$lastday" | grep -v "still logged in" 

echo -e "\nStill logged in:" 
last -F | grep -v 'reboot' | grep "still logged in" 
+0

Wissen Sie, dass Sie "date" + ... ... "' verwenden können, um das gewünschte Format des Datums zu haben, anstatt seine Standardausgabe zu analysieren? Siehe meine Antwort. – fedorqui

Verwandte Themen