[HOWTO] Automatisch entbannen per Cronjob

11/17/2010 16:22 Hanashi#1
Hallo Leute,

ihr möchtet bestimmt manchmal User bannen, allerdings sollen diese nicht permanent, sondern nur für eine bestimmt Zeit gebannt werden, dies ist eigentlich ganz einfach und ich werde es in diesen Tutorial erklären. Ich hoffe mal so etwas gab es noch nicht.

Als erstes führt ihr folgenden Query in eurer Datenbank 'account' aus:
Code:
ALTER TABLE `account` ADD `baned` VARCHAR(50) NULL DEFAULT NULL AFTER `status`;
ALTER TABLE `account` ADD `bantime` INT(10) NULL DEFAULT NULL AFTER `status`;
ALTER TABLE `account` ADD `banlength` ENUM( 'SECOND', 'MINUTE', 'HOUR', 'DAY', 'WEEK', 'MONTH', 'YEAR', 'PERM' ) NULL DEFAULT NULL AFTER `status`;
Damit werden 3 neue Felder in der Tabelle 'account' erstellt, diese Spalten lauten: baned, bantime und banlength. Diese Spalten zeigen, wie lange der Account gebannt ist, standardmäßig sind alle auf NULL gesetzt.

Nun loggt ihr euch mit einem SSH-Client (z.B. Putty) auf euren Server ein, auf dem auch die Datenbank ist. Ich habe das in meinem Beispiel mit dem Benutzer root gemacht. Ihr geht nun in das Stammverzeichnis eureres accounts mit
Code:
cd
oder
Code:
cd /root
Erstellt hier nun eine neue Datei namens unban.sh, dies macht ihr mit folgenden Befehl:
Code:
touch unban.sh
Diese Datei müsst ihr nun bearbeiten, unter FreeBSD macht ihr das mit:
Code:
ee unban.sh
unter Debian oder Ubuntu mit:
Code:
vi unban.sh
Wenn ihr Ubuntu verwendet könnt ihr folgenden Code direkt reinschreiben, bei Debian oder Ubuntu müsst ihr vorher die Taste "i" drücken.

So wie gesagt diesen Code schreibt ihr in die Datei:
Code:
#!/bin/bash
BENUTZER=dbuser
PASSWORT="dbpw"
/usr/local/bin/mysql -p account -u $BENUTZER --password=$PASSWORT -D account --execute="UPDATE account SET status='OK' WHERE status != 'OK' AND (banlength='SECOND' AND DATE_SUB(NOW(), INTERVAL bantime SECOND) > baned OR banlength='MINUTE' AND DATE_SUB(NOW(), INTERVAL bantime MINUTE) > baned OR banlength='HOUR' AND DATE_SUB(NOW(), INTERVAL bantime HOUR) > baned OR banlength='DAY' AND DATE_SUB(NOW(), INTERVAL bantime DAY) > baned OR banlength='WEEK' AND DATE_SUB(NOW(), INTERVAL bantime WEEK) > baned OR banlength='MONTH' AND DATE_SUB(NOW(), INTERVAL bantime MONTH) > baned OR banlength='YEAR' AND DATE_SUB(NOW(), INTERVAL bantime YEAR) > baned);\g \q"
(Unter Debian bzw. Ubuntu heißt es nicht /usr/local/bin/mysql sondern /usr/bin/mysql)

Ersetzt dbuser mit euren Datenbankbenutzer und dbpw mit euren Datenbankpasswort, lasst aber das Passwort in Anführungszeichen, dies ist vor allem wichtig wenn ihr Leerzeichen im Passwort habt.

Nun müsste ihr die Datei noch speichern, unter FreeBSD macht ihr das mit ESC -> leave editor -> save changes, unter einen System wie Debian oder Ubuntu drückt ihr ESC und gebt dann das ein:
Code:
:wq
und drückt Enter.

So nun müsst ihr euren System nur noch sagen, dass die Datei jede Minute einmal ausgeführt werden soll. Dazu kommen wir jetzt.

Gebt in eurem SSH-Programm folgendes ein:
Code:
crontab -e
So nun bekommt ihr einen Editor, hier drückt ihr "i" für INSERT und gebt folgenden Code ein:
Code:
* * * * *	sh /root/unban.sh
Nun drückt ihr ESC und gebt
Code:
:wq
ein, nun müsstet ihr folgende Meldung sehen:
Code:
crontab: installing new crontab
So jetzt werden die Accounts automatisch entbannt, allerdings wisst ihr noch nicht mit welchem Query ihr einen Account bannen müsst, dies ist auch ganz einfach mit diesem Query:
Code:
UPDATE account SET status='BLOCK', baned=NOW(), bantime='2', banlength='WEEK' WHERE login='hanashi';
Nun wird der account für zwei Wochen gebannt, ihr könnt statt WEEK auch folgendes verwenden:
Code:
SECOND = x Sekunden bannen
MINUTE = x Minuten bannen
HOUR = x Stunden bannen
DAY = x Tage bannen
WEEK = x Wochen bannen
MONTH = x Monate bannen
YEAR = x Jahre
PERM = Permanent bannen
Ich wünsche euch viel Spaß damit und hoffe es gab so etwas noch nicht.

MfG Hanashi

Edit: Der entsprechende PHP-Code:
PHP Code:
<?php

mysql_connect
("host""dbuser""dbpasswort");

if (isset(
$_POST["ban"])) {
    
$error false;
    
$errortext "";
    
    
$login mysql_real_escape_string($_POST["login"]);
    
$dauer mysql_real_escape_string($_POST["dauer"]);
    
$length mysql_real_escape_string($_POST["length"]);
    
    
$query mysql_query("SELECT DISTINCT a.id, a.login, a.status, p.name FROM account.account a LEFT JOIN player.player p ON p.account_id=a.id WHERE a.login='".$login."' OR p.name='".$login."' ORDER BY a.id DESC LIMIT 1") or die(mysql_error());
    
$row mysql_fetch_assoc($query);
    
    if (
mysql_num_rows($query) == 0) {
        
$errortext .= "Der Benutzer existiert nicht!<br>";
        
$error true;
    }
    
    if (
$row["status"] != "OK") {
        
$errortext .= "Der Benutzer wurde bereits gebannt!<br>";
        
$error true;
    }
    
    if (
$error == false) {
        
$query "UPDATE account.account SET status='BLOCK', baned=NOW(), bantime='".$dauer."', banlength='".$length."' WHERE id='".$row["id"]."'";
        if (
mysql_query($query)) {
            
$errortext "Der Benutzer wurde nun gebannt!<br>";
        } else {
            
$errortext "Der Benutzer wurde konnte nicht gebannt werden!<br>";
        }
    }
}

?>
<center>
    <?php
    
if (isset($errortext)) {
        echo 
$errortext."<br>";
    }
    
?>
    <form action="ban.php" method="post">
        Login- oder Charaktername:<br />
        <input type="text" name="login" value="<?php echo $_POST["ban"] ? $_POST["login"] : "" ?>" />
        
        <br /><br />
        
        Dauer:<br />
        <input type="text" name="dauer" size="5" value="<?php echo $_POST["ban"] ? $_POST["dauer"] : "" ?>" />
        
        <select name="length">
            <option value="SECOND">Sekunde/n</option>
            <option value="MINUTE">Minute/n</option>
            <option value="HOUR">Stunde/n</option>
            <option value="DAY">Tag/e</option>
            <option value="WEEK">Woche/n</option>
            <option value="MONTH">Monat/e</option>
            <option value="YEAR">Jahr/e</option>
            <option value="PERM">Permanent</option>
        </select>
        
        <br /><br />
        
        <input type="submit" name="ban" value="Bannen!" />
    </form>
</center>
11/17/2010 16:22 .Zander#2
Nice!
11/17/2010 16:24 Avulsed#3
Danke,

Sowas ist sehr hilfreich ;)
11/17/2010 16:24 christhebig#4
richtig nice Thx
11/17/2010 16:25 .Namenslos#5
Oh my! Hanashi @ MT2 Section! Its awesome :'D.

Is sehr nice geworden (;

LG .Namenslos
11/17/2010 16:25 .BraiiiN™#6
THX!
11/17/2010 16:25 Swyr#7
nice (=°.^=)
11/17/2010 16:28 Hanashi#8
Ganz vergessen unter Ubuntu bzw. Debian heißt es nicht /usr/local/bin/mysql sondern /usr/bin/mysql
11/17/2010 16:35 Swyr#9
/local/ hast du vergessen
11/17/2010 16:36 Kallisson#10
Sehr gut. Vielen Dank :)
11/17/2010 16:36 Hanashi#11
Quote:
Originally Posted by Swyr View Post
/local/ hast du vergessen
Nein bei Ubuntu bzw. Debian ist es ohne /local/!
11/17/2010 16:44 Mαhdin#12
Hanashi ftw *-*
11/17/2010 17:04 .Tiburion'#13
echt nice. thx.
11/17/2010 17:08 °RapLexx°#14
Danke dir wird vielen helfen.

GreeeZ
Sazh
11/17/2010 17:15 .Zander#15
Wennste jetzt noch ein autobackup pub machst, welches die backups auf einen anderen Server zieht, isses perfekt!