[ADMIN][RCON] mcrcon, client de connexion à distance pour les serveurs minecraft – Resoudre les problemes d’un serveur MineCraft
Author: Titanfall —
Short summary: 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 […]
Quick overview
- Site
- Tutos GameServer
- Canonical URL
- https://tutos-gameserver.fr/2019/05/03/adminrcon-mcrcon-client-de-connexion-a-distance-pour-les-serveurs-minecraft-resoudre-les-problemes-dun-serveur-minecraft/
- LLM HTML version
- https://tutos-gameserver.fr/2019/05/03/adminrcon-mcrcon-client-de-connexion-a-distance-pour-les-serveurs-minecraft-resoudre-les-problemes-dun-serveur-minecraft/llm
- LLM JSON version
- https://tutos-gameserver.fr/2019/05/03/adminrcon-mcrcon-client-de-connexion-a-distance-pour-les-serveurs-minecraft-resoudre-les-problemes-dun-serveur-minecraft/llm.json
- Manifest
- https://tutos-gameserver.fr/llm-endpoints-manifest.json
- Estimated reading time
- 12 minutes (666 seconds)
- Word count
- 2219
Key points
- 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.
Structured content
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 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 = 0x30 && couleur 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]
Topics and keywords
Themes: Serveur minecraft
License & attribution
License: CC BY-ND 4.0.
Attribution required: yes.
Manifest: https://tutos-gameserver.fr/llm-endpoints-manifest.json
LLM Endpoints plugin version 1.1.2.