【发布时间】:2020-08-03 14:02:10
【问题描述】:
在过去的一周里,我在 Ubuntu v18.04 操作系统中安装了 Terraria 1.3.5.3 服务器,用于和朋友在线玩。此服务器应 24/7 开机,没有任何 GUI,只能通过内部 LAN 上的 SSH 访问。
我的朋友问我是否有办法让他们控制服务器,例如通过内部游戏内聊天发送消息,所以我想在所需命令(例如'$say something'或'$save')和读取终端通过管道输出,解释命令并用 bash 命令发回。
我按照以下说明安装服务器:
https://www.linode.com/docs/game-servers/host-a-terraria-server-on-your-linode
并配置我的路由器以将专用端口转发到泰拉瑞亚服务器。
一切正常,但我真的很难让 python 通过上面链接中描述的“terrariad”bash 脚本发送命令。
这是一个用于发送命令的代码,在 python 中:
import subprocess
subprocess.Popen("terrariad save", shell=True)
这很好用,但如果我尝试输入带空格的字符串:
import subprocess
subprocess.Popen("terrariad \"say something\"", shell=True)
它在空格字符中停止命令,在终端上输出:
: say
而不是想要的:
: say something
<Server>something
我能做些什么来解决这个问题? 我尝试了很多东西,但我得到了相同的结果。
附:如果我在 ssh putty 终端中手动发送命令,它可以工作!
编辑 1:
我放弃了 python 解决方案,现在我将尝试使用 bash 代替,这样做似乎更符合逻辑。
编辑 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"
或者在空格字符前使用\引号,如果到达空格字符,它总是拆分变量。
编辑 3:
查看 bash 脚本,我可以理解发送命令时发生了什么...基本上它使用屏幕程序中的命令“stuff”将字符发送到 terraria 屏幕会话:
screen -S terraria -X stuff $send
$send 是一个 printf 命令:
send="`printf \"$*\r\"`"
在我看来,如果我从 Python 运行 bash 文件,它的结果与从命令行运行的结果不同。这怎么可能?这是函数的错误还是错误的实现?
谢谢!
【问题讨论】: