На прошлой неделе я установил сервер Terraria 1.3.5.3 в ОС Ubuntu v18.04 для игры в сети с друзьями. Этот сервер должен быть включен 24/7 без каких-либо GUI, доступ к нему осуществлялся только S SH во внутренней локальной сети.
Мои друзья спрашивают меня, есть ли у них способ управления сервером, Например, отправьте сообщение через внутренний игровой чат, поэтому я подумал, что нужно использовать специальный символ ($) перед желаемой командой (например, «$ say what» или «$ save») и программу python, которые читают вывод терминала через канал, интерпретируют команду и отправляют ее обратно с помощью команды bash.
Я следую этим инструкциям для установки сервера:
https://www.linode.com/docs/game-servers/host-a-terraria-server-on-your-linode
И настройте мой маршрутизатор так, чтобы он перенаправлял выделенный порт на сервер terraria.
Все работает нормально, но я действительно изо всех сил пытаюсь python отправить команду через "terrariad" bash скрипт, описанный в ссылке выше.
Вот код, используемый для отправки команды, в python:
import subprocess
subprocess.Popen("terrariad save", shell=True)
Это работает нормально, но если я пытаюсь ввести строка с пробелом:
import subprocess
subprocess.Popen("terrariad \"say something\"", shell=True)
останавливает команду в символе пробела, ou tput это на терминале:
: say
Вместо желаемого:
: say something
<Server>something
Что я могу сделать, чтобы решить эту проблему? Я столько всего перепробовал, но получаю тот же результат.
PS Если я посылаю команду вручную в терминале замазки s sh, она работает!
Редактировать 1:
Я отказался от решения python, сейчас я попробую его с bash вместо этого, похоже, больше логики c для этого.
Редактировать 2:
Я обнаружил, что скрипт «terrariad» ожидает только один аргумент, но Popen разбивает мой аргумент на два, независимо от метода, который я использую, так как моя строка ввода имеет один пробел в середине. Как это:
Ожидается:
terrariad "say\ something"
$1 = "say something"
Но я получаю это python Popen:
subprocess.Popen("terrariad \"say something\"", shell=True)
$1 = "say
$2 = something"
Неважно, я пытаюсь перечислить это:
subprocess.Popen(["terrariad", "say something"])
$1 = "say
$2 = something"
Или используйте \ quote перед символом пробела. Он всегда разделяет переменные, если достигает символа пробела.
Редактировать 3:
Глядя в скрипт bash, я мог бы понять, что происходит, когда я посылаю команду ... Обычно она использует команду "stuff" из экранной программы для отправки символов на сеанс экрана terraria:
screen -S terraria -X stuff $send
$ send is printf команда:
send="`printf \"$*\r\"`"
И мне кажется, что если я запускаю файл bash из Python, он будет иметь другой результат, чем запуск из командной строки. Как это возможно? Это ошибка или плохая реализация функции?
Спасибо!