⚙️ GMϵͳ¹¦ÄÜÈ«¾°Í¼
graph TD
A[GMºËÐÄϵͳ] --> B[ȨÏÞ¹ÜÀí]
--> C[Íæ¼Ò¹ÜÀí]
--> D[ÔËά¼à¿Ø]
--> E[Êý¾Ýͳ¼Æ]
--> B1[½ÇÉ«·Ö¼¶£º³¬¼¶GM/¿Í·þ/ѲÂß]
--> C1[ʵʱ²éÖ¤+Ô¶³Ì½ûÑÔ]
--> D1[×Ô¶¯×ÊÔ´ÇåÀí]
--> E1[ÔÚÏßÍæ¼ÒÈÈÁ¦Í¼]
🔑 Ò»¡¢È¨ÏÞ·Ö¼¶ÓëΣÏÕ²Ù×÷¹Ü¿Ø£¨·ÀÖ¹“Äڹ픻ٷþ£©
GMÕ˺ŷּ¶ÅäÖñí
½ÇÉ« ȨÏÞ·¶Î§ ΣÏÕÃüÁîÏÞÖÆ ²Ù×÷ÈÕÖ¾ÁôºÛ
³¬¼¶¹ÜÀíÔ± È«¹¦ÄÜ+ȨÏÞ·ÖÅä ÎÞÏÞÖÆ ✔Ç¿ÖÆË«È˸´ºË
¿Í·þ¾Àí ÎïÆ··¢·Å/½ûÑÔ/½â·â ÆÁ±Îkick allµÈ·¶Î§ÃüÁî ✔²Ù×÷¼Ïñ
ѲÂßGM ¾Ù±¨´¦Àí/Î¥¹æ¼ì²â ½ö²éѯÀàÃüÁî ✔¶¨Î»Ë®Ó¡
Ãô¸Ð²Ù×÷¶þ´ÎÑéÖ¤ÅäÖÃ
ÔÚgm_command.pyÖÐÌí¼Ó¸ßΣÃüÁîÀ¹½Ø
def dangerous_cmd(cmd):
risk_commands = ["shutdown", "cleardb", "grant all"]
if any(risk in cmd for risk in risk_commands):
require_otp() # ´¥·¢¶ÌÐÅÑéÖ¤Âë
log_to_audit(cmd, get_player_ip()) # ¼Ç¼²Ù×÷Ô´IP
📊 ¶þ¡¢Íæ¼Ò¹ÜÀíЧÂÊÌáÉý10±¶µÄºËÐļ¼ÇÉ
ÅúÁ¿´¦ÀíÍæ¼Ò²Ù×÷£¨¸æ±ðµ¥¸ö´¦Àí£©
-- °¸Àý1£ºÈ«·þ²¹³¥·¢·Å£¨²»°üº¬ÒÑ·âºÅÍæ¼Ò£©
INSERT INTO mail (receiver, itemid, count)
SELECT char_id, 12345, 1 FROM characters
WHERE status = 0 AND last_login > '2023-08-01';
-- °¸Àý2£ºÇåÀí¹Ò»úСºÅ£¨30ÌìδµÇ¼+µÈ¼¶<30£©
DELETE FROM characters WHERE level < 30
AND last_login < NOW() - INTERVAL 30 DAY;
Íæ¼ÒÊý¾Ýʵʱ׷×ÙÃæ°å
²éѯÀàÐÍ ºǫ́ÃüÁî ·µ»Ø½á¹ûʾÀý
Íæ¼ÒʵʱλÖà locate_player ·çÑ© ·çÑ©[ID:1001] µ±Ç°ÔÚºÓÑô³Ç (125,88)
±³°üÎïÆ·ËÝÔ´ trace_item ÍÀÁúµ¶ ÍÀÁúµ¶[ID:888] ÓÉGM[Admin]ÓÚ2023-08-10·¢·Å
Òì³£Êý¾Ý¼ì²â scan_abnormal_gold ¼ì²âµ½[ÎÞµÐÕ½Éñ]½ð±Ò1СʱÄÚ+5000Íò (Òì³£)
🤖 Èý¡¢×Ô¶¯»¯ÔËάϵͳ£¨½â·ÅË«ÊÖºËÐÄ·½°¸£©
ÖÇÄÜѲ¼ì»úÆ÷ÈËÅäÖÃ
auto_check.yaml
tasks:
name: Êý¾Ý¿â״̬¼à¿Ø
cron: "/5 *"
command: check_db_connection
alert_threshold: 2 # Á¬Ðø2´Îʧ°Ü¸æ¾¯
name: ·Ç·¨Íâ¹Ò½ø³Ì¼ì²â
cron: "0 "
command: scan_process --game zx
kill: true # ×Ô¶¯½áÊø×÷±×½ø³Ì
name: ¶¨Ê±È«·þ¹«¸æ
cron: "0 12,19 *"
command: broadcast --msg "¡¾ÏµÍ³¡¿Ã¿ÈÕ´ðÌâ»î¶¯ÒÑ¿ªÆô£¡"
×Ô¶¯·â½ûÂß¼£¨»ùÓÚÐÐΪ·ÖÎö£©
Íâ¹ÒÌØÕ÷¹æÔòÒýÇæ
def cheat_detect(player):
if player.speed > 8.0: # ÒÆËÙ³¬±ê
auto_ban(player, '¼ÓËÙ¹Ò', 72)
elif player.click_per_sec > 20: # Òì³£µã»÷ƵÂÊ
send_captcha(player) # µ¯³öÑéÖ¤Âë
🛠️ ËÄ¡¢¿ªÔ´×Ô½¨GM¹¤¾ß·½°¸£¨³É±¾Îª0£¡£©
»ù´¡»·¾³´î½¨
°²×°±ØÒª×é¼þ£¨Python·½°¸Ê¾Àý£©
pip install flask pymysql watchdog
ÏîÄ¿½á¹¹
/gm_tools
©À©¤©¤ api_server.py # HTTP½Ó¿Ú·þÎñ
©À©¤©¤ command_exec.py # ÃüÁîÖ´ÐÐÒýÇæ
©À©¤©¤ templates/ # ÍøÒ³¹ÜÀí½çÃæ
©¸©¤©¤ logs/ # ²Ù×÷ÈÕÖ¾´æ´¢
ºËÐŦÄÜʵÏÖ´úÂë
ʵÏÖÍøÒ³°æGMÃüÁîÏ·¢
@app.route('/api/command', methods=['POST'])
def exec_command():
user = auth_check(request.headers['Token'])
cmd = request.json.get('command')
if user.has_permission(cmd):
result = execute_gm_cmd(cmd) # Á¬½ÓÓÎÏ··þÎñ¶Ë
return jsonify({'status': result})
else:
return jsonify({'error': 'ÎÞȨ²Ù×÷'}), 403
⚠️ ¸ß·çÏÕ²Ù×÷±Ü¿ÓÖ¸ÄÏ
¾ø¶Ô½ûÖ¹ÔÚÉú²ú»·¾³Ö±½ÓÖ´ÐеÄÃüÁ
DELETE FROM items WHERE 1;
UPDATE characters SET level=150;
GRANT gm_level TO public;
°²È«Ìæ´ú·½°¸£º
ÓÃLIMITÏÞÖÆ·¶Î§£ºDELETE ... LIMIT 100
²Ù×÷ǰ±¸·Ý£ºCREATE TABLE backup_20231001 SELECT * FROM...
ȨÏÞ×îС»¯£º½öÊÚÈ¨ÌØ¶¨IPµÄ²éѯȨÏÞ
📱 Îå¡¢ÒÆ¶¯¶Ë¼à¿Ø·½°¸£¨ÊÖ»ú¹Ü·þ£©
Æóҵ΢ÐÅ»úÆ÷ÈËÍÆËÍ
±¨¾¯£ºÄÚ´æ>90% ÔÚÏßÈËÊý±©µø50%
ÈÕ±¨£ºÃ¿ÈÕÐÂÔöÍæ¼Ò ÓªÊÕͳ¼Æ
TermuxÊÖ»úÖÕ¶Ë
bash
# ÊÖ»úSSHÁ¬½Ó·þÎñÆ÷
ssh gm@192.168.1.100 -p 2222
# Ö´ÐÐÇáÁ¿ÃüÁî
zxcli --online
>> µ±Ç°ÔÚÏß: 83ÈË ºÓÑô³Ç: 45ÈË
graph TD
A[GMºËÐÄϵͳ] --> B[ȨÏÞ¹ÜÀí]
--> C[Íæ¼Ò¹ÜÀí]
--> D[ÔËά¼à¿Ø]
--> E[Êý¾Ýͳ¼Æ]
--> B1[½ÇÉ«·Ö¼¶£º³¬¼¶GM/¿Í·þ/ѲÂß]
--> C1[ʵʱ²éÖ¤+Ô¶³Ì½ûÑÔ]
--> D1[×Ô¶¯×ÊÔ´ÇåÀí]
--> E1[ÔÚÏßÍæ¼ÒÈÈÁ¦Í¼]
🔑 Ò»¡¢È¨ÏÞ·Ö¼¶ÓëΣÏÕ²Ù×÷¹Ü¿Ø£¨·ÀÖ¹“Äڹ픻ٷþ£©
GMÕ˺ŷּ¶ÅäÖñí
½ÇÉ« ȨÏÞ·¶Î§ ΣÏÕÃüÁîÏÞÖÆ ²Ù×÷ÈÕÖ¾ÁôºÛ
³¬¼¶¹ÜÀíÔ± È«¹¦ÄÜ+ȨÏÞ·ÖÅä ÎÞÏÞÖÆ ✔Ç¿ÖÆË«È˸´ºË
¿Í·þ¾Àí ÎïÆ··¢·Å/½ûÑÔ/½â·â ÆÁ±Îkick allµÈ·¶Î§ÃüÁî ✔²Ù×÷¼Ïñ
ѲÂßGM ¾Ù±¨´¦Àí/Î¥¹æ¼ì²â ½ö²éѯÀàÃüÁî ✔¶¨Î»Ë®Ó¡
Ãô¸Ð²Ù×÷¶þ´ÎÑéÖ¤ÅäÖÃ
ÔÚgm_command.pyÖÐÌí¼Ó¸ßΣÃüÁîÀ¹½Ø
def dangerous_cmd(cmd):
risk_commands = ["shutdown", "cleardb", "grant all"]
if any(risk in cmd for risk in risk_commands):
require_otp() # ´¥·¢¶ÌÐÅÑéÖ¤Âë
log_to_audit(cmd, get_player_ip()) # ¼Ç¼²Ù×÷Ô´IP
📊 ¶þ¡¢Íæ¼Ò¹ÜÀíЧÂÊÌáÉý10±¶µÄºËÐļ¼ÇÉ
ÅúÁ¿´¦ÀíÍæ¼Ò²Ù×÷£¨¸æ±ðµ¥¸ö´¦Àí£©
-- °¸Àý1£ºÈ«·þ²¹³¥·¢·Å£¨²»°üº¬ÒÑ·âºÅÍæ¼Ò£©
INSERT INTO mail (receiver, itemid, count)
SELECT char_id, 12345, 1 FROM characters
WHERE status = 0 AND last_login > '2023-08-01';
-- °¸Àý2£ºÇåÀí¹Ò»úСºÅ£¨30ÌìδµÇ¼+µÈ¼¶<30£©
DELETE FROM characters WHERE level < 30
AND last_login < NOW() - INTERVAL 30 DAY;
Íæ¼ÒÊý¾Ýʵʱ׷×ÙÃæ°å
²éѯÀàÐÍ ºǫ́ÃüÁî ·µ»Ø½á¹ûʾÀý
Íæ¼ÒʵʱλÖà locate_player ·çÑ© ·çÑ©[ID:1001] µ±Ç°ÔÚºÓÑô³Ç (125,88)
±³°üÎïÆ·ËÝÔ´ trace_item ÍÀÁúµ¶ ÍÀÁúµ¶[ID:888] ÓÉGM[Admin]ÓÚ2023-08-10·¢·Å
Òì³£Êý¾Ý¼ì²â scan_abnormal_gold ¼ì²âµ½[ÎÞµÐÕ½Éñ]½ð±Ò1СʱÄÚ+5000Íò (Òì³£)
🤖 Èý¡¢×Ô¶¯»¯ÔËάϵͳ£¨½â·ÅË«ÊÖºËÐÄ·½°¸£©
ÖÇÄÜѲ¼ì»úÆ÷ÈËÅäÖÃ
auto_check.yaml
tasks:
name: Êý¾Ý¿â״̬¼à¿Ø
cron: "/5 *"
command: check_db_connection
alert_threshold: 2 # Á¬Ðø2´Îʧ°Ü¸æ¾¯
name: ·Ç·¨Íâ¹Ò½ø³Ì¼ì²â
cron: "0 "
command: scan_process --game zx
kill: true # ×Ô¶¯½áÊø×÷±×½ø³Ì
name: ¶¨Ê±È«·þ¹«¸æ
cron: "0 12,19 *"
command: broadcast --msg "¡¾ÏµÍ³¡¿Ã¿ÈÕ´ðÌâ»î¶¯ÒÑ¿ªÆô£¡"
×Ô¶¯·â½ûÂß¼£¨»ùÓÚÐÐΪ·ÖÎö£©
Íâ¹ÒÌØÕ÷¹æÔòÒýÇæ
def cheat_detect(player):
if player.speed > 8.0: # ÒÆËÙ³¬±ê
auto_ban(player, '¼ÓËÙ¹Ò', 72)
elif player.click_per_sec > 20: # Òì³£µã»÷ƵÂÊ
send_captcha(player) # µ¯³öÑéÖ¤Âë
🛠️ ËÄ¡¢¿ªÔ´×Ô½¨GM¹¤¾ß·½°¸£¨³É±¾Îª0£¡£©
»ù´¡»·¾³´î½¨
°²×°±ØÒª×é¼þ£¨Python·½°¸Ê¾Àý£©
pip install flask pymysql watchdog
ÏîÄ¿½á¹¹
/gm_tools
©À©¤©¤ api_server.py # HTTP½Ó¿Ú·þÎñ
©À©¤©¤ command_exec.py # ÃüÁîÖ´ÐÐÒýÇæ
©À©¤©¤ templates/ # ÍøÒ³¹ÜÀí½çÃæ
©¸©¤©¤ logs/ # ²Ù×÷ÈÕÖ¾´æ´¢
ºËÐŦÄÜʵÏÖ´úÂë
ʵÏÖÍøÒ³°æGMÃüÁîÏ·¢
@app.route('/api/command', methods=['POST'])
def exec_command():
user = auth_check(request.headers['Token'])
cmd = request.json.get('command')
if user.has_permission(cmd):
result = execute_gm_cmd(cmd) # Á¬½ÓÓÎÏ··þÎñ¶Ë
return jsonify({'status': result})
else:
return jsonify({'error': 'ÎÞȨ²Ù×÷'}), 403
⚠️ ¸ß·çÏÕ²Ù×÷±Ü¿ÓÖ¸ÄÏ
¾ø¶Ô½ûÖ¹ÔÚÉú²ú»·¾³Ö±½ÓÖ´ÐеÄÃüÁ
DELETE FROM items WHERE 1;
UPDATE characters SET level=150;
GRANT gm_level TO public;
°²È«Ìæ´ú·½°¸£º
ÓÃLIMITÏÞÖÆ·¶Î§£ºDELETE ... LIMIT 100
²Ù×÷ǰ±¸·Ý£ºCREATE TABLE backup_20231001 SELECT * FROM...
ȨÏÞ×îС»¯£º½öÊÚÈ¨ÌØ¶¨IPµÄ²éѯȨÏÞ
📱 Îå¡¢ÒÆ¶¯¶Ë¼à¿Ø·½°¸£¨ÊÖ»ú¹Ü·þ£©
Æóҵ΢ÐÅ»úÆ÷ÈËÍÆËÍ
±¨¾¯£ºÄÚ´æ>90% ÔÚÏßÈËÊý±©µø50%
ÈÕ±¨£ºÃ¿ÈÕÐÂÔöÍæ¼Ò ÓªÊÕͳ¼Æ
TermuxÊÖ»úÖÕ¶Ë
bash
# ÊÖ»úSSHÁ¬½Ó·þÎñÆ÷
ssh gm@192.168.1.100 -p 2222
# Ö´ÐÐÇáÁ¿ÃüÁî
zxcli --online
>> µ±Ç°ÔÚÏß: 83ÈË ºÓÑô³Ç: 45ÈË

