有没有办法绕过 linux gnu-screen stuff 字符限制?

有没有办法绕过 linux gnu-screen stuff 字符限制?

我有一个 Minecraft 服务器连接到我的 Linux 服务器中的屏幕。我使用 Python 通过 Screen Stuff 将数据推送到 Minecraft 服务器。我注意到,如果我在屏幕内容中放置太多字符,它往往不会将数据推送到屏幕中。

例如,以下内容就可以正常工作。它将文本推送到 Minecraft 屏幕: screen -r Minecraft -p0 -X stuff 'Some random text etc etc, contents are not relevant ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^M'

添加 100 个左右的字符会导致内容无法发送,并且不会产生我可以告诉的错误消息: screen -r Minecraft -p0 -X stuff 'Some random text etc etc, contents are not relevant-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^M'

这似乎表明 screen 的 stuff 命令中有字符限制。假设是这样,是否有替代方案可以允许更多角色?我偶尔会向屏幕推送非常长的命令,这些命令超出了我观察到的 700-800 个字符的限制。也许将文本放入文件中并将其传递给屏幕以某种方式运行?

答案1

嗯,手册页确实说stuff不能用于大输入:

stuff [string]

将字符串string填充到当前窗口的输入缓冲区中。这类似于“粘贴”命令,但开销要少得多。 [...]您不能使用“stuff”命令粘贴大缓冲区。它对于键绑定最有用。

但它确实暗示paste

paste [registers [dest_reg]]

将指定寄存器的(串联)内容写入当前窗口的 stdin 队列。寄存器“.”被视为粘贴缓冲区。

readbuf [-e encoding] [filename]

将指定文件的内容读入粘贴缓冲区。 [...]

screen我通过将手册页(2600 行,166 kB)粘贴到编辑器来尝试:

screen -S test -X readbuf /tmp/screen.txt
screen -S test -X paste .

并在保存后得到相同的文件,所以它似乎paste可能工作得更好。不过,这确实有一个缺点,即需要多个命令,而且我不知道是否可以在不通过文件传递数据的情况下完成此操作。

无论如何,我不确定通过屏幕粘贴数据是否是向正在运行的服务器发送命令的最佳方式,但我不知道 Minecraft 是否提供了 stdin 之外的其他发送命令的方式。

我见过的另一个游戏服务器的解决方案是将输入从管道重定向到服务器,例如

tail -f inputfile | ./whateverserver ...

然后,如果您需要向其发出命令,请运行echo some command >> inputfile.这应该类似于用 填充输入screen

请注意,任何像这样将命令自动填充到单个输入的解决方案都存在问题,除非您小心,否则同时发送的多个命令可能会混淆。确实,这需要锁定。

答案2

我找到了一个解决方法。只需在字符限制以内的部分发送命令似乎就可以了。这是我在 Python 中的设置:

def runServerCode(code):
    while len(code) > 600:
        os.system("screen -r Minecraft -p0 -X stuff '" + code[:600] + "'")
        code = code[600:]
    code += "^M"
    os.system("screen -r Minecraft -p0 -X stuff '" + code + "'")

我遇到的唯一问题是,在该代码完成之前,有时其他信息会被发送到屏幕,导致推送的代码在中间的某个位置被分割,导致它无法正常运行。

相关内容