0

我正在运行一些 Team Fortress 2 服务器,我想编写一个小管理脚本。

基本上,TF2 服务器是一个提供服务器控制台的 fg 进程,因此我可以启动服务器,输入状态并从中获得答案:

***@purple:~/tf2$ ./start_server_testing 
Auto detecting CPU
Using AMD Optimised binary.
Server will auto-restart if there is a crash.

Console initialized.
[bla bla bla]
Connection to Steam servers successful.
   VAC secure mode is activated.

status

hostname: Team Fortress
version : 1.0.6.1/15 3883 secure
udp/ip  :  ***.***.133.31:27600
map     : ctf_2fort at: 0 x, 0 y, 0 z
players : 0 (2 max)

# userid name uniqueid connected ping loss state adr

太好了,现在我想创建一个脚本,将命令 sm_reloadadmins 发送到我的所有服务器。我发现做到这一点的最好方法是使用 fifo 命名管道。现在我想要做的是让这个管道只读且非阻塞到服务器进程,所以我可以写入管道并且服务器执行它,但我仍然想通过控制台写入服务器,所以如果我切换回服务器的 fg 进程,我输入 status 我想打印一个答案。

我试过这个(假设serverfifo是mkfifo serverfifo):

./start_server_testing < serverfifo

不工作,服务器不会启动,直到有东西被写入管道。

./start_server_testing <> serverfifo

这实际上工作得很好,我可以看到服务器的控制台输出,我可以写入 fifo 并且服务器执行命令,但我不能再通过控制台写入服务器了。此外,如果我将“退出”写入管道(应该结束服务器)并且我在屏幕上运行它,屏幕窗口会因某种原因被杀死(为什么?)。

我只需要服务器在不阻塞的情况下读取fifo,并且服务器本身上的所有键盘输入都应该发送到服务器,并且所有服务器输出都应该写入控制台。

那可能吗?如果是,如何?

4

1 回答 1

1

我意识到这与您所追求的答案不同,但是您可以使用 Gnu Screen来做到这一点。

Screen 是一个制作伪 TTY 的程序。您可以使用它的功能让您共享屏幕会话。这样,您可以登录到屏幕内的服务器,您的脚本可以共享该会话,发送您可以看到的命令,然后停止共享。此处描述了设置屏幕以允许共享会话的过程。它需要 root 访问权限,但如果您运行的是 TF2 服务器,我假设您有这个权限。

一旦设置好 setuid 进程并在屏幕内显示服务器提示符,您可以让脚本登录到相关框,连接到屏幕,将所需的命令发送到服务器,发送 Ctrl-A,d 以断开连接屏幕,然后注销。

于 2009-06-29T12:08:24.457 回答