(* В следующем посте все IP, порты и пароли были изменены. Извините за форматирование этого поста, редактору не нравятся новые строки.)
Вопрос: Как сделатьЯ храню целые числа как 32-битные числа с прямым порядком байтов со знаком?
Справочная информация: Я пытаюсь использовать RCon для соединения с сервером Minecraft в bash.Пока сервер показывает, что соединение получено, но я не могу правильно отформатировать пакет.Я могу подключиться к серверу с помощью mcrcon и увидеть пакеты в wireshark, но когда я пытаюсь использовать мой bash-скрипт, значения длины пакета, requesttid и type выглядят неправильно.
Ниже приведены некоторые из моих источников, устранение неполадокданные и мой код, которые могут помочь в ответе на вопрос.
Источник: https://wiki.vg/RCON
Реализация: https://developer.valvesoftware.com/wiki/Source_RCON_Protocol
Консоль сервера:
[22:24:09 ВНИМАНИЕ]: Не успеваю!Сервер перегружен?Выполнение 3190 мс или 63 тика позади
[22:24:23 ИНФОРМАЦИЯ]: Rcon соединение от: /164.256.8.10
[22:24:34 ПРЕДУПРЕЖДЕНИЕ]: Не может идти в ногу!Сервер перегружен?Выполнение 9961 мс или 199 тиков позади
[22:24:55 ВНИМАНИЕ]: Не успеваю!Сервер перегружен?Запуск 2006 мс или 40 тиков позади
[22:25:12 ИНФОРМАЦИЯ]: Rcon соединение от: /164.256.8.10
.
Wireshark: (данные mcrcon)
Код:
#!/bin/bash
# Length int Length of remainder of packet
# Request ID int Client-generated ID
# Type int 3 for login, 2 to run a command, 0 for a multi-packet response
# Payload byte[] ASCII text
# 2-byte pad byte, byte Two null bytes
# Connection details
RCON_HEADER=$(echo -e "\xff\xff\xff\xff")
HOST="192.168.0.173"
PORT=12345
LENGTH=0 # Length of packet
REQUESTID=$RANDOM
PASSWORD="$1"
RES=0
COM=2
AUTH=3
NULL="\0"
COMMAND=${@:2}
echo "command: $COMMAND"
## Packet Format as per docs
#Packet Size in Bytes
#Request ID any int
#Type as above
#Body null terminated ascii string
#Empty string null terminated
build_packet()
{
local TYPE="$1";
$([ "$TYPE" == "$AUTH" ]) && local BODY="$PASSWORD" || local BODY=$COMMAND;
local DATA="$REQUESTID$TYPE$BODY";
local LENGTH=${#DATA};
local PACKET="$LENGTH$DATA";
echo $PACKET;
}
send()
{
#local PACKET="$1"
echo "sending: $PACKET"
printf "$PACKET%s\0%s\0" >&5 &
}
read ()
{
LENGTH="$1"
RETURN=`dd bs=$1 count=1 <&5 2> /dev/null`
}
echo "trying to open socket"
# try to connect
if ! exec 5<> /dev/tcp/$HOST/$PORT; then
echo "`basename $0`: unable to connect to $HOST:$PORT"
exit 1
fi
echo "socket is open"
PACKET=$(build_packet $AUTH $PASSWORD);
echo "Command: $COMMAND"
echo "Packet: $PACKET"
send $PACKET
read 7
echo "RETURN: $RETURN"
PACKET=$(build_packet $COM $COMMAND);
echo "Command: $COMMAND"
echo "Packet: $PACKET"
send $PACKET
read 7
echo "RETURN: $RETURN"
.
Код ссылки: https://blog.chris007.de/using-bash-for-network-socket-operation/