Serveur minecraft

[ADMIN][RCON] mcrcon, client de connexion à distance pour les serveurs minecraft – Resoudre les problemes d’un serveur MineCraft

Par Titanfall , le 3 mai 2019 - 12 minutes de lecture

Code:

/ *
* Copyright (c) 2012, Tiiffi 
*
* Ce logiciel est fourni «en l’état», sans mention expresse ou implicite.
* garantie. En aucun cas, les auteurs ne pourront être tenus responsables de dommages et intérêts
* découlant de l'utilisation de ce logiciel.
*
* La permission est accordée à quiconque d’utiliser ce logiciel à quelque fin que ce soit,
* y compris les applications commerciales, et de le modifier et de le redistribuer
* librement, sous réserve des restrictions suivantes:
*
* 1. L'origine de ce logiciel ne doit pas être déformée; il ne faut pas
* prétendre que vous avez écrit le logiciel original. Si vous utilisez ce logiciel
* dans un produit, un accusé de réception dans la documentation du produit serait
* apprécié mais n'est pas obligatoire.
*
* 2. Les versions sources modifiées doivent être clairement indiquées comme telles et ne doivent pas être modifiées.
* dénaturé comme étant le logiciel d'origine.
*
* 3. Cet avis ne peut être enlevé ou modifié d'aucune source
*  Distribution.
* /
 
/ *
* Nom: mcrcon (minecraft rcon)
*
* Licence: Licence zlib / libpng
*
*
* Contact:
* WWW: http://sourceforge.net/projects/mcrcon/
* MAIL: tiiffi_at_gmail_dot_com
* IRC: tiiffi @ quakenet
*
*
* La description:
* Mcrcon est un client / terminal minecraft rcon puissant avec prise en charge de la coloration bukkit.
* Il est bien adapté à l'administration à distance et à être utilisé dans le cadre de scripts de maintenance de serveur automatisée.
* Ne provoque pas de spam "IO: canal cassé" ou "IO: Connection reset" dans la console du serveur.
*
*
* Caractéristiques:
* - Mode terminal interactif. Maintient la connexion en vie.
* - Envoyer plusieurs commandes dans une ligne de commande.
*  - Mode silencieux. N'imprime pas la sortie rcon.
* - Prise en charge de la coloration bukkit sous Windows et Linux (shells compatibles sh).
* - Code multiplateforme. Compile sur de nombreuses plates-formes avec des modifications mineures.
*
*
* Historique de la version:
*
* 0.0.5
* - Le programme utilise la fonctionnalité C99 (tableaux de longueur variable), donc l'indicateur "-std = gnu99" est activé
* GCC-compiler doit être utilisé pour éviter les avertissements inutiles.
*
* - Le tampon de réception Rcon est maintenant plus grand (2024 octets -> 10240 octets).
* * Merci aux forums 'gman_ftw' @ Bukkit.
*
* - Correction du message d'erreur invalide lors de la réception d'un paquet rcon vide (10 octets).
* * Merci aux forums 'pkmnfrk' @ bukkit.
*
* - Le mode terminal se ferme maintenant automatiquement lorsque rcon socket est fermé par le serveur
* ou si la taille du paquet ne peut pas être récupérée correctement.
*
* - Le client essaie maintenant de nettoyer les données du socket entrant si le dernier paquet était hors spécifications.
*
*
* 0.0.4
* - Revient au gestionnaire d'erreur des options getopts par défaut (opterr = 1).
* Le gestionnaire d'erreurs personnalisé nécessite une réécriture.
* - Quelques corrections utiles dans les chaînes de sortie du programme.
* - Utilisation du programme (); La fonction attend maintenant d’entrer avant de quitter Windows.
*
*
* 0.0.3
* - Les couleurs sont maintenant supportées sur Windows aussi!
* - Le mode terminal est maintenant déclenché avec l'indicateur "-t". Le drapeau "-i" fonctionne toujours pour
*    rétrocompatibilité.
* - Corrections de bugs (vérification de la taille des paquets évaluant toujours la validité des faux et des couleurs)
* cocher toujours évaluer vrai).
*
*
* 0.0.2
* - La licence est passée de 'Licence ISC' à 'Licence zlib / libpng'.
* - Corrections de bugs et nettoyage de code
* - Mode interactif (drapeau -i). Le client agit comme un terminal interactif.
* - La valeur de retour du programme est maintenant le nombre de commandes rcon envoyées avec succès.
* Si la connexion ou l'authentification échoue, la valeur de retour est -1.
* - Les couleurs sont maintenant activées par défaut. Désormais, l'indicateur -c désactive le support des couleurs.
*
*
* 0.0.1
* - Ajout du support expérimental pour les couleurs de bukkit.
* Devrait fonctionner avec n'importe quel shell compatible sh.
* - Les données de chaîne de paquets sont limitées à 2048 octets maximum (DATA_BUFFSIZE).
* Aucune idée de la façon dont Minecraft gère plusieurs paquets rcon.
* Si quelqu'un le sait, envoyez-moi un mail afin que je puisse le mettre en œuvre.
*
*
* FAIRE:
* - Rendre le tampon de réception dynamique
* - Changer certains problèmes de taille de paquet en erreurs fatales
* - Nettoyage du code
* - Vérifier les variables globales (à supprimer si possible)
* - Ajoute quelques vérifications de protocole
* - Nettoyage du préprocesseur (#ifdef / #ifndef)
* - Suivre le protocole standard de valve rcon?
* - Support de paquets multiples si Minecraft le supporte?!
* - Recherchez si les messages de discussion du joueur sont envoyés via rcon.
* S'ils le sont, le système de messagerie nécessite une réécriture.
*
*
* Rapports de bugs et demandes de fonctionnalités à tiiffi_at_gmail_dot_com.
*
* /
 
 
#comprendre 
#comprendre 
#comprendre 
#comprendre 
#comprendre 
 
#ifdef _WIN32
    / * pour la résolution de noms sous windows * /
    #define _WIN32_WINNT 0x0501
 
    #comprendre 
    #comprendre 
    #comprendre 
#autre
    #comprendre 
    #comprendre 
    #comprendre 
    #comprendre 
    #comprendre 
#fin si
 
/ * macro valeur absolue
#define absolute (x) (x <0)? (0 - x): x
* /
 
#define RCON_EXEC_COMMAND 2
#define RCON_AUTHENTICATE 3
#define RCON_RESPONSEVALUE 0
#define RCON_AUTH_RESPONSE 2
#define RCON_PID 42
 
/ * Valeur sûre je pense. Cela devrait me rendre dynamique pour des performances plus stables! * /
#define DATA_BUFFSIZE 10240
 
#define VERSION "0.0.5"
#define IN_NAME "mcrcon"
#define VER_STR IN_NAME "" VERSION
 
/ * structure de paquets rcon * /
typedef struct _rc_packet 
    taille int;
    int id;
    int cmd;
    données de char[DATA_BUFFSIZE];
    / * ignorant string2 atm .. * /
 rc_packet;
 
/* les fonctions */
 
erreur vide (char * errstring);
#ifndef _WIN32
void print_color (int color);
#fin si
 
struct in_addr net_resolve (char * host);
void net_close_socket (int sd);
int net_open_socket (char * host, int port);
int net_send_packet (int sd, rc_packet * packet);
rc_packet * net_recv_packet (int sd);
#ifdef _WIN32
void net_init_WSA (void);
#fin si
int net_clean_incoming (int sd, taille int);
 
rc_packet * packet_build (int id, int cmd, char * s1);
void packet_print (rc_packet * packet);
 
int rcon_auth (int rsock, char * passwd);
int rcon_command (int rsock, char * command);
 
int get_line (char * buffer, int len);
int run_terminal_mode (int rsock);
int run_commands (int argc, char * argv[])
 
 
/ * des globals * /
int silent_mode = 0;
int print_colors = 1;
int connection_alive = 1;
chaussette; / * prise rcon * /
 
#ifdef _WIN32
  / * console à colorier sous windows * /
  HANDLE console_handle;
#fin si
 
/ * trucs de sécurité (les fenêtres fonctionnent toujours mal) * /
void exit_proc (void) 
    if (rsock! = -1) net_close_socket (rsock);

 
/ * Vérifiez le comportement de windows et linux !!! * /
void sighandler (int sig) 
    connexion_alive = 0;
    #ifndef _WIN32
      sortie (-1);
    #fin si

 
int principal (int argc, char * argv[])

    int opt, ret = 0;
    int terminal_mode = 1;
 
    char * host = "192.168.1.3";
    char * pass = "123456";
    int port = 25575;
 
 
 
    opterr = 1; / * gestionnaire d'erreurs par défaut activé * /
    while ((opt = getopt (argc, argv, "tcshH: p: p: i"))!! = -1)
    
        commutateur (opt)
        
            cas 'H': hôte = optarg; Pause;
            cas 'P': port = atoi (optarg); Pause;
            cas 'p': pass = optarg; Pause;
            cas 'C':
            case 'c': print_colors = 0; Pause;
            cas 's':
            case 's': silent_mode = 1; Pause;
            cas 'T':
            cas 't':
            cas 'je':
            case 'i': terminal_mode = 1; Pause;
            cas 'h':
            Cas '?':
                / *
                if (optopt == 'P' 
    
 
    if (hôte == NULL) 
        fputs ("Hôte non défini. Indicateur de vérification -H.  n  n", stdout);
 
    
 
    si (port <= 0) 
        fputs("Invalid port. Check -P flag.nn", stdout);
 
    
 
    if(optind == argc && terminal_mode == 0) 
        fputs("No commands specified.nn", stdout);
   
    
 
    /* safety features to prevent "IO: Connection reset" bug on the server side */
    atexit(&exit_proc);
    signal(SIGABRT, &sighandler);
    signal(SIGTERM, &sighandler);
    signal(SIGINT, &sighandler);
 
    #ifdef _WIN32
      net_init_WSA();
      console_handle = GetStdHandle(STD_OUTPUT_HANDLE);
      if(console_handle == INVALID_HANDLE_VALUE) console_handle = NULL;
    #endif
 
    /* open socket */
    rsock = net_open_socket(host, port);
 
    /* auth & commands */
    if(rcon_auth(rsock, pass))
    
        if(terminal_mode)
            ret = run_terminal_mode(rsock);
        else
            ret = run_commands(argc, argv);
    
    else /* auth failed */
    
        ret = -1;
        fprintf(stdout, "Authentication failed!n");
    
 
    /* cleanup */
    net_close_socket(rsock);
    rsock = -1;
 
    return ret;

 
void usage(void)

    fputs(
        "Usage: "IN_NAME" [OPTIONS]... [COMMANDS]...n"
        "Sends rcon commands to minecraft server.nn"
        "Option:n"
        "  -httPrints usage.n"
        "  -sttSilent mode. Do not print data received from rcon.n"
        "  -tttTerminal mode. Acts as interactive terminal.n"
        "  -pttRcon password. Default: "".n"
        "  -HttHost address or ip.n"
        "  -PttPort. Default: 25575.n"
        "  -cttDo not print colors. Disables bukkit color printing.n"
    ,stdout);
 
    puts("nInvidual commands must be separated with spaces.n");
    puts("Example:n  "IN_NAME" -c -H 192.168.1.42 -P 9999 -p password cmd1 "cmd2 with spaces"n");
    puts("minecraft rcon ("IN_NAME") "VERSION".nReport bugs to tiiffi_at_gmail_dot_com.n");
 
    #ifdef _WIN32
      puts("Press enter to exit.");
      getchar();
    #endif
    exit(0);

 
void error(char *errstring)

    fputs(errstring, stderr);
    exit(-1);

 
#ifdef _WIN32
void net_init_WSA(void)

    WSADATA wsadata;
    int err;
 
    err = WSAStartup(MAKEWORD(1, 1), &wsadata);
    if(err != 0)
    
        fprintf(stderr, "WSAStartup failed. Errno: %d.n", err);
        exit(-1);
    

#endif
 
struct in_addr net_resolve(char *host)

    struct in_addr address;
 
    struct sockaddr_in *sockaddr_ipv4;
    struct addrinfo hints, *result;
    int ret;
 
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
 
    ret = getaddrinfo(host, NULL, &hints, &result);
    if(ret != 0)
    
        fprintf(stderr, "Error: Unable to resolve hostname (%s).n", host);
        exit(-1);
    
 
    sockaddr_ipv4 = (struct sockaddr_in *) result->ai_addr;
 
    adresse = sockaddr_ipv4-> sin_addr;
 
    freeaddrinfo (résultat);
 
    adresse de retour;

 
/ * socket close and cleanup * /
void net_close_socket (int sd)

    #ifdef _WIN32
        closesocket (sd);
        WSACleanup ();
    #autre
        fermer (sd);
    #fin si

 
/ * Ouvre et connecte prise * /
int net_open_socket (char * host, int port)

    int sd;
    struct sockaddr_in sa;
 
    memset (& sa, 0, sizeof (sa)); / * Définit la structure pleine de zéros. * /
    sa.sin_family = AF_INET; / * Adresse Famille Inet = Protocole Famille Inet. * /
    sa.sin_port = htons (port); /* Numéro de port. * /
    sa.sin_addr = net_resolve (hôte); / * résolvez l'hôte. * /
 
    if ((sd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP))) < 0)
    
        #ifdef _WIN32
            WSACleanup();
        #endif
        error("Error: cannot create socket.n");
    
 
    if(connect(sd, (struct sockaddr *)&sa, sizeof(sa)) != 0)
    
        net_close_socket(sd);
        fprintf(stderr, "Error: connection failed (%s).n", host);
        exit(-1);
    
 
    return sd;

 
int net_send_packet(int sd, rc_packet *packet)

    int len;
    int total = 0;        /* how many bytes we've sent */
    int bytesleft;        /* how many we have left to send */
    int ret = -1;
 
    bytesleft = len = packet->taille + taillede (int);
 
    tandis que (total <len)
    
        ret = send (sd, (char *) packet + total, bytesleft, 0);
        if (ret == -1) break; 
        total + = ret;
        bytesleft - = ret;
    
 
    / * retourne -1 en cas d'échec, 0 en cas de succès * /
    Retourner Ret == -1? -1: 1;

 
rc_packet * net_recv_packet (int sd)

 
int net_clean_incoming (int sd, int size)

    char tmp[size];
 
    int ret = recv (sd, tmp, taille, 0);
 
    si (ret == 0) 
        fprintf (stderr, "Connexion perdue.  n");
        connexion_alive = 0;
    
 
    retour ret;

 
void print_color (int color)

    / * palette de couleurs compatible sh * /
    #ifndef _WIN32
    char * couleurs[] = 
        " 033[0; 30m ", / * 00 BLACK 0x30 * /
        " 033[0; 34m ", / * 01 BLEU 0x31 * /
        " 033[0; 32m ", / * 02 GREEN 0x32 * /
        " 033[0; 36m ", / * 03 CYAN 0x33 * /
        " 033[0; 31m ", / * 04 RED 0x34 * /
        " 033[0; 35m ", / * 05 PURPLE 0x35 * /
        " 033[0; 33m ", / * 06 GOLD 0x36 * /
        " 033[0; 37m ", / * 07 GREY 0x37 * /
        " 033[1; 30m ", / * 08 DGREY 0x38 * /
        " 033[1; 34m ", / * 09 LBLUE 0x39 * /
        " 033[1; 32m ", / * 10 LGREEN 0x61 * /
        " 033[1; 36m ", / * 11 LCYAN 0x62 * /
        " 033[1; 31m ", / * 12 LRED 0x63 * /
        " 033[1; 35m ", / * 13 LPURPLE 0x64 * /
        " 033[1; 33m ", / * 14 JAUNE 0x65 * /
        " 033[1; 37m ", / * 15 BLANC 0x66 * /
    ;
 
    si (couleur == 0) 
        fputs (" 033[0m ", stdout); / * ANNULER COULEUR * /
    
    autre
    #fin si
    
        si (couleur> = 0x61 && couleur <= 0x66) color -= 0x57;
        else if(color >= 0x30 && couleur <= 0x39) color -= 0x30;
        else return;
 
        #ifndef _WIN32
          fputs(colors[color], stdout);
        #else
          SetConsoleTextAttribute(console_handle, color);
        #endif
    

 
/* this hacky mess might use some optmizing */
void packet_print(rc_packet *packet)

    int i;
    int def_color = 0;
 
    #ifdef _WIN32
      CONSOLE_SCREEN_BUFFER_INFO console_info;
      if(GetConsoleScreenBufferInfo(console_handle, &console_info) != 0)
          def_color = console_info.wAttributes + 0x30;
      else def_color = 0x37;
    #endif
 
    /* colors enabled so try to handle the bukkit colors for terminal */
    if(print_colors == 1) 
 
        for(i = 0; (unsigned char) packet->Les données[i] ! = 0; ++ i) 
            if ((unsigned char) packet -> data[i] == 0xa7) 
                ++ i;
                print_color (paquet-> données[i])
                continuer;
            
            si (paquet-> données[i] == 0x0A) print_color (def_color);
 
            putchar (paquet-> données[i])
        
        print_color (def_color); / * annuler la coloration * /
 
    
    / * couleurs de bande * /
    autre
    
        pour (i = 0; (unsigned char)) paquet-> données[i] ! = 0; ++ i) 
            if ((unsigned char) packet -> data[i] == 0xa7) 
                ++ i;
                continuer;
            
            putchar (paquet-> données[i])
        
    
 
    / * Affiche une nouvelle ligne si la chaîne n'a pas de nouvelle ligne * /
    si (paquet-> données[i-1] ! = 10 && packet-> data[i-1] ! = 13)
        putchar (' n');

 
rc_packet * packet_build (int id, int cmd, char * s1)
/ * fonction hacky * /
    paquet statique de paquetage = 0, 0, 0, 0x00;
 
    / * taille + id + cmd + s1 + s2 terminaison NULL * /
    int s1_len = strlen (s1);
    if (s1_len> DATA_BUFFSIZE) 
        fprintf (stderr, "Avertissement: La chaîne de commande est trop longue (% d). Maximum autorisé:% d.  n", s1_len, DATA_BUFFSIZE);
        return NULL;
    
 
    packet.size = sizeof (int) * 2 + s1_len + 2;
    packet.id = id;
    packet.cmd = cmd;
    strncpy (packet.data, s1, DATA_BUFFSIZE);
 
    retour et paquet;

 
int rcon_auth (int rsock, char * passwd)

    int ret;
 
    rc_packet * packet = packet_build (RCON_PID, RCON_AUTHENTICATE, passwd);
    if (paquet == NULL) renvoie 0;
 
    ret = net_send_packet (rsock, packet);
    si (! ret) retourne 0; /* Echec de l'envoi */
 
    packet = net_recv_packet (rsock);
    if (paquet == NULL) renvoie 0;
 
    / * retourne 1 si authentification OK * /
    return packet-> id == -1? 0: 1;

 
int rcon_command (int rsock, char * commande)

    int ret;
 
    rc_packet * packet = packet_build (RCON_PID, RCON_EXEC_COMMAND, commande);
    si (paquet == NULL) 
        connexion_alive = 0;
        retourne 0;
    
 
    ret = net_send_packet (rsock, packet);
    si (! ret) retourne 0; /* Echec de l'envoi */
 
    packet = net_recv_packet (rsock);
    if (paquet == NULL) renvoie 0;
 
    if (packet-> id! = RCON_PID) renvoie 0; / * mauvais identifiant de paquet * /
 
    si (! silent_mode) 
        / *
        si (paquet-> taille == 10) 
            printf ("Commande inconnue "% s  ". Tapez " help  "ou "?  "pour obtenir de l'aide.  n", commande);
        
        autre
        * /
        si (paquet-> taille> 10)
            packet_print (packet);
    
 
    / * retourne 1 si le monde a été sauvé * /
    retourne 1;

 
int run_commands (int argc, char * argv[])

    int i, ok = 1, ret = 0;
 
    pour (i = optind; i < argc && ok; i++) 
        ok = rcon_command(rsock, argv[i]);
        ret += ok;
    
 
    return ret;

 
/* interactive terminal mode */
int run_terminal_mode(int rsock)

    int ret = 0;
    char command[DATA_BUFFSIZE] = 0x00;
 
    puts("Logged in. Type "Q" to quit!");
 
    while(connection_alive) 
 
        int len = get_line(command, DATA_BUFFSIZE);
        if(command[0] == 'Q' && command[1] == 0) break;
 
        if(len > 0 && connection_alive) ret + = rcon_command (rsock, commande);
 
        commander[0] = len = 0;
    
 
    retour ret;

 
/ * obtient une ligne de stdin et traite les déchets laissés dans le tampon d'entrée * /
int get_line (char * buffer, int bsize)

    int ch, len;
 
    fputs (">", stdout);
    fgets (buffer, bsize, stdin);
 
    si (tampon[0] == 0) connection_alive = 0;
 
    / * supprime les caractères indésirables de la mémoire tampon * /
    tampon[strcspn(buffer, "rn")] = ' 0';
 
    len = strlen (tampon);
 
    / * nettoie le tampon d'entrée si nécessaire * /
    if (len == bsize - 1)
        while ((ch = getchar ())! = ' n' && ch! = EOF);
 
    renvoyer len;

4. C4Droid + GCC plugin (dans les paramètres de c4droid, vous devez sélectionner le compilateur: "GCC + Bionic").

Donc, vous venez de compiler ce code, allez dans le dossier: /data/data/com.n0n3m4.droidc/files/temp et copiez le fichier "temp" sur votre sdcard ou dans un autre dossier. Après cela, vous allez à l’entrée du terminal: "/ mnt / sdcard / temp" ou le chemin complet de ce fichier.

Vous pouvez également essayer de créer moi-même un fichier binaire (copiez-le simplement sur la carte SD et entrez "/ mnt / sdcard / temp" dans le terminal (si votre carte SD est montée dans le dossier "sdcard").

Click to rate this post!
[Total: 0 Average: 0]

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.