运行 通过 ssh 时,Steam 浏览器协议无提示地失败

Steam browser protocol failing silently when run over ssh

我正在尝试通过 ssh 连接(进入 Win10 计算机)在我的计算机上启动 Steam 游戏。当 运行 在本地时,以下 python 调用有效。

subprocess.run("start steam://rungameid/[gameid]", shell=True)

但是,每当我 运行 通过 ssh 连接(在交互式解释器中或通过调用目标机器上的脚本)时,我的 Steam 客户端突然退出。

我没有注意到 Steam 日志中的任何内容 除了 Steam\logs\connection_log.txt 每次都包含注销和新会话启动。这是 而不是 当我 运行 在我的机器上本地命令时的情况。为什么 Steam 知道此命令的不同来源,为什么这会导致 Steam 连接断开?谁能提出解决方法?

谢谢。

Steam 可能无法启动应用程序,因为 Windows 服务(包括 OpenSSH 服务器)无法访问桌面,因此无法启动 GUI 应用程序。据推测,Steam 不希望在无法与桌面交互的环境中 运行 应用程序,这就是最终导致 Steam 崩溃的原因。 (不可否认,这只是一个猜测——当崩溃似乎没有出现在日志或故障转储中时,很难确定究竟发生了什么。)

您可以在关于 运行 的 this answer by domih to this question 中看到更详细的解释,说明为什么当服务器 运行 作为 Windows 服务时通过 SSH 启动 GUI 应用程序失败在 Windows.

上通过 SSH 连接 GUI 应用程序

domih 还提出了一些解决方法。如果它适合您,最简单的方法可能是手动下载和 运行 OpenSSH 服务器,而不是 运行 将服务器作为服务。您可以找到适用于 OpenSSH here.

的 Win32-OpenSSH/Windows 的最新版本

另一个似乎仍然有效的解决方法是使用 schtasks。这个想法是创建一个计划任务,运行 是您的命令——任务计划程序 可以 访问桌面。不幸的是,如果您不介意至少等到下一分钟,这只是一个可以接受的解决方案; schtasks 只能安排任务恰好在一分钟内发生。此外,为了随时 运行 安全,代码可能应该将任务安排在 至少 一分钟后,这意味着等待时间可能在 1- 2 分钟。

这种方法还有其他缺点。例如,以这种方式监控 运行ning 进程可能更难。但是,在某些情况下,这可能是一个可接受的解决方案,因此我编写了一些 Python 代码,可用于 运行 带有 schtasks 的程序,以及一个示例。代码依赖于shortuuid包;在尝试示例之前,您需要安装它。

import subprocess
import tempfile
import shortuuid
import datetime

def run_with_schtasks_soon(s, delay=2):
    """
    Run a program with schtasks with a delay of no more than
    delay minutes and no less than delay - 1 minutes.
    """
    # delay needs to be no less than 2 since, at best, we
    # could be calling subprocess at the end of the minute.
    assert delay >= 2
    task_name = shortuuid.uuid()
    temp_file = tempfile.NamedTemporaryFile(mode="w", suffix=".bat", delete=False)
    temp_file.write('{}\nschtasks /delete /tn {} /f\ndel "{}"'.format(s, task_name, temp_file.name))
    temp_file.close()
    run_time = datetime.datetime.now() + datetime.timedelta(minutes=delay)
    time_string = run_time.strftime("%H:%M")
    # This is locale-specific. You will need to change this to
    # match your locale. (locale.setlocale and the "%x" format
    # does not seem to work here)
    date_string = run_time.strftime("%m/%d/%Y")
    return subprocess.run("schtasks /create /tn {} /tr {} /sc once /st {} /sd {}".format(task_name,
                                                                                         temp_file.name,
                                                                                         time_string,
                                                                                         date_string),
                          shell=True)
                          
if __name__ == "__main__":
    # Runs The Witness (if you have it)
    run_with_schtasks_soon("start steam://rungameid/210970")