Prüfen Sie, ob Minecraft Server mit Linux Terminal online ist

542
Mark Deven

Ein Programm, das ich für jemanden schreibe, muss in der Lage sein, festzustellen, ob ein Minecraft-Server online ist oder nicht. Es wäre auch toll, wenn man wissen könnte, wie viele Spieler oder welche Spieler online sind. Ich bin nicht sicher, wie die Minecraft-Server in diesem Sinne funktionieren, also bin ich mir nicht sicher, wie ich das machen soll. Wenn Sie die spezifische IP dafür haben möchten, können Sie mir eine Nachricht senden, obwohl ich nicht sicher bin, ob ich sie hier öffentlich veröffentlichen darf.

1
Ich würde die IP nirgendwo posten. miltonb vor 5 Jahren 0
Es ist ein öffentlicher Benutzer, der eine Verbindung herstellen muss. Ich wusste nur nicht, ob mir SuperUsers-Standards erlaubt waren Mark Deven vor 5 Jahren 0

2 Antworten auf die Frage

2
Deltik

Zur Überwachung würde ich prüfen, ob es bereits ein Nagios- Skript gibt, das tun kann, was Sie wollen.

Wie sich herausstellt, existiert bereits ein Minecraft Server Nagios Plugin check_minecraft.py.

Herunterladen

wget 'https://raw.githubusercontent.com/vertecx/nagios-plugins/master/check_minecraft.py' 

Hilfe zur Verwendung

deltik@node51 [~]$ python check_minecraft.py -h usage: check_minecraft.py [-h] -H ADDRESS [-p INTEGER] [-n INTEGER] [-m STRING] [-f] [-w DOUBLE] [-c DOUBLE] [-t DOUBLE] [-v]  This plugin will try to connect to a Minecraft server.  optional arguments: -h, --help show this help message and exit -H ADDRESS, --hostname ADDRESS host name or IP address -p INTEGER, --port INTEGER port number (default: 25565) -n INTEGER, --number-of-checks INTEGER number of checks to get stable average response time (default: 5) -m STRING, --motd STRING expected motd in server response (default: A Minecraft Server) -f, --warn-on-full generate warning if server is full -w DOUBLE, --warning DOUBLE response time to result in warning status (seconds) -c DOUBLE, --critical DOUBLE response time to result in critical status (seconds) -t DOUBLE, --timeout DOUBLE seconds before connection times out (default: 10) -v, --verbose show details for command-line debugging (Nagios may truncate output) MINECRAFT UNKNOWN: Invalid arguments 

Verwendungsbeispiel

Überprüfen Sie, ob mc.deltik.orgdie erwartete MOTD (Nachricht des Tages) zurückgegeben wird von Deltik Minecraft Server:

deltik@node51 [~] python check_minecraft.py -H mc.deltik.org -m "Deltik Minecraft Server" MINECRAFT OK: 0/20 players online - 300 bytes in 0.0345 second response time|time=0.0345476s;0.0;0.0;0.0;10.0 

Ressourcen

check_minecraft.py wird hier vollständig wiedergegeben:

#!/usr/bin/env python # coding=utf8  from datetime import datetime, timedelta import sys, string, socket, time, argparse  # Exit statuses recognized by Nagios. STATE_OK = 0 STATE_WARNING = 1 STATE_CRITICAL = 2 STATE_UNKNOWN = 3  # Output formatting string. OUTPUT_OK = "MINECRAFT OK: - bytes in second response time|time=s;;;0.0;" OUTPUT_WARNING = "MINECRAFT WARNING: - bytes in second response time|time=s;;;0.0;" OUTPUT_CRITICAL = "MINECRAFT CRITICAL: - bytes in second response time|time=s;;;0.0;" OUTPUT_EXCEPTION = "MINECRAFT CRITICAL: " OUTPUT_UNKNOWN = "MINECRAFT UNKNOWN: Invalid arguments"  # Minecraft packet ID:s, delimiters and encoding. MC_SERVER_LIST_PING = "\xfe" MC_DISCONNECT = "\xff" MC_DELIMITER = u"\xa7" MC_ENCODING = "utf-16be"  def log(start, message): print(": ".format(datetime.now() - start, message))  def get_server_info(host, port, num_checks, timeout, verbose): start_time = datetime.now() total_delta = timedelta() byte_count = len(MC_SERVER_LIST_PING) * num_checks  # Contact the server multiple times to get a stable average response time. for i in range(0, num_checks): if (verbose): iteration = "Iteration /: ".format(i + 1, num_checks)  # Save start time and connect to server. if (verbose): log(start_time, "Connecting to on port .".format(iteration, host, port)) net_start_time = datetime.now() s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(timeout) s.connect((host, port))  # Send Minecraft Server List Ping packet. if (verbose): log(start_time, "Sending Server List Ping.".format(iteration)) s.send(MC_SERVER_LIST_PING)  # Receive answer from server. The largest answer returned by the server that also works with the Minecraft client # seems to be around 520 bytes (259 unicode character at 2 bytes each plus one start byte and one length byte). if (verbose): log(start_time, "Receiving data...".format(iteration)) data = s.recv(550) data_len = len(data) byte_count += data_len if (verbose): log(start_time, "Received bytes".format(iteration, data_len))  s.close()  # Check if returned data seems valid. If not, throw AssertionError exception. if (verbose): if (data[0] == MC_DISCONNECT): log(start_time, "Returned data seems valid.") else: log(start_time, "Returned data is invalid. First byte is .".format(ord(data[0])))  assert data[0] == MC_DISCONNECT  # Save response time for later average calculation. delta = datetime.now() - net_start_time total_delta += delta  time.sleep(0.1)  # Calculate the average response time in seconds total_response = total_delta.seconds + total_delta.microseconds / 1000000.0 average_response = total_response / num_checks  # Decode and split returned skipping the first two bytes. info = data[3:].decode(MC_ENCODING).split(MC_DELIMITER) motd = info[:] del motd[-1] # removing max_players del motd[-1] # removing players motd = ''.join(motd).replace("\n","") # removing newlines  return {'motd': motd, 'players': int(info[-2]), 'max_players': int(info[-1]), 'byte_count': byte_count, 'response_time': average_response}  def main(): parser = argparse.ArgumentParser(description="This plugin will try to connect to a Minecraft server.");  parser.add_argument('-H', '--hostname', dest='hostname', metavar='ADDRESS', required=True, help="host name or IP address") parser.add_argument('-p', '--port', dest='port', type=int, default=25565, metavar='INTEGER', help="port number (default: 25565)") parser.add_argument('-n', '--number-of-checks', dest='num_checks', type=int, default=5, metavar='INTEGER', help="number of checks to get stable average response time (default: 5)") parser.add_argument('-m', '--motd', dest='motd', default='A Minecraft Server', metavar='STRING', help="expected motd in server response (default: A Minecraft Server)") parser.add_argument('-f', '--warn-on-full', dest='full', action='store_true', help="generate warning if server is full") parser.add_argument('-w', '--warning', dest='warning', type=float, default=0.0, metavar='DOUBLE', help="response time to result in warning status (seconds)") parser.add_argument('-c', '--critical', dest='critical', type=float, default=0.0, metavar='DOUBLE', help="response time to result in critical status (seconds)") parser.add_argument('-t', '--timeout', dest='timeout', type=float, default=10.0, metavar='DOUBLE', help="seconds before connection times out (default: 10)") parser.add_argument('-v', '--verbose', dest='verbose', action='store_true', help="show details for command-line debugging (Nagios may truncate output)")  # Parse the arguments. If it failes, exit overriding exit code. try: args = parser.parse_args() except SystemExit: print(OUTPUT_UNKNOWN) sys.exit(STATE_UNKNOWN)  try: info = get_server_info(args.hostname, args.port, args.num_checks, args.timeout, args.verbose)  if string.find(info['motd'], args.motd) > -1: # Check if response time is above critical level. if args.critical and info['response_time'] > args.critical: print(OUTPUT_CRITICAL.format(" second response time".format(info['response_time']), info['byte_count'], info['response_time'], args.warning, args.critical, args.timeout)) sys.exit(STATE_CRITICAL)  # Check if response time is above warning level. if args.warning and info['response_time'] > args.warning: print(OUTPUT_WARNING.format(" second response time".format(info['response_time']), info['byte_count'], info['response_time'], args.warning, args.critical, args.timeout)) sys.exit(STATE_WARNING)  # Check if server is full. if args.full and info['players'] == info['max_players']: print(OUTPUT_WARNING.format("Server full! players online".format(info['players']), info['byte_count'], info['response_time'], args.warning, args.critical, args.timeout)) sys.exit(STATE_WARNING)  print(OUTPUT_OK.format("/ players online".format(info['players'], info['max_players']), info['byte_count'], info['response_time'], args.warning, args.critical, args.timeout)) sys.exit(STATE_OK)  else: print(OUTPUT_WARNING.format("Unexpected MOTD, ".format(info['motd']), info['byte_count'], info['response_time'], args.warning, args.critical, args.timeout)) sys.exit(STATE_WARNING)  except socket.error as msg: print(OUTPUT_EXCEPTION.format(msg)) sys.exit(STATE_CRITICAL)  except AssertionError: print(OUTPUT_EXCEPTION.format("Invalid data returned by server")) sys.exit(STATE_CRITICAL)  except UnicodeDecodeError: print(OUTPUT_EXCEPTION.format("Unable to decode server response")) sys.exit(STATE_CRITICAL)  if __name__ == "__main__": main() 

Lizenztext:

The MIT License  Copyright (c) 2012-2016 Petter Jönsson  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
Am Ende habe ich ein ähnliches Tool direkt von dinnerbone verwendet: https://github.com/Dinnerbone/mcstatus Mark Deven vor 5 Jahren 0
0
PaulProgrammer

Sieht so aus, als würden Sie vielleicht einen Terminal-basierten Minecraft-Client wünschen.

Schauen Sie sich das an: https://github.com/ORelio/Minecraft-Console-Client

Das läuft zwar unter Windows und ich müsste als Spieler auf dem Server spielen Mark Deven vor 5 Jahren 0