在 Windows 10 上,我想在我的 PC 上显示一个 xterm 窗口,该窗口在我的服务器上运行,使用 ssh 进入服务器。
为此,我创建了一个 Windows 命令脚本,作为扩展名为 .cmd 的文件,整个脚本如下:
echo Before time: %TIME%
start /B ssh mysrv "xterm -T mysrv -display mypc:0.0"
echo After time: %TIME%
通过文件资源管理器运行 cmd 脚本时,双击它,它会在我的 PC 上创建 xterm 窗口。没有涉及 Windows 快捷方式或类似内容。但是,除了 xterm 窗口之外,Windows 命令 (cmd) 终端窗口也保持打开状态。消息“时间之前:”和“时间之后:”都显示在 Windows 终端窗口中,时间差最多为 0.01 秒,因此它们会立即出现。
如果我将 更改xterm
为立即返回的命令,例如date
,或者我完全删除 行start ...
,则脚本将立即完成,并且不会剩下任何 Windows 命令终端。
我可以通过单击“X”手动关闭 Windows 命令终端窗口,而 xterm 窗口仍保持打开状态并可运行。如果我关闭 xterm 窗口,则 Windows 命令终端窗口将自动关闭。
但是,额外的无用的 Windows 命令终端窗口是相当烦人的。
该脚本在干净的 Windows 10 安装上运行,其中没有手动修改注册表。因此,有问题的建议 我弄乱了我的注册表,现在我需要把它改回来尚未尝试过。
如何创建一个 Windows 命令脚本来运行该命令ssh mysrv …
然后终止该脚本,而无需让 Windows 命令终端窗口保持打开状态?
答案1
Windows 会自动打开控制台窗口任何编译时标记为“控制台可执行文件”的可执行文件。Conhost 窗口不仅托管您的 cmd.exe 脚本,它还还托管 ssh.exe 进程(与 cmd.exe 一样被编译为“控制台”可执行文件),并且只要有任何控制台进程正在使用它,它就会一直存在。
(这与 Unix 模型有很大不同,在 Unix 模型中,操作系统根本不区分控制台和非控制台可执行文件,因此需要手动启动 xterm 等终端主机。)
API 确实允许在隐藏控制台的情况下启动控制台可执行文件,但没有选项可以通过 cmd.exe 执行此操作。一种常见的替代方法是通过 VBScript 或 Python 启动 ssh.exe,因为 Windows 附带非控制台“wscript.exe”VBScript 主机(类似地,Python 附带非控制台“pythonw.exe”)。
silentssh.vbs
VBScript示例:
Set wshell = CreateObject("WScript.Shell")
' Parameters: Run <command>, <show_window>, <wait_until_exit>
wshell.Run "ssh.exe /whatever", 0, 1
Set wshell = Nothing
答案2
解决方案 1
我没有 ssh 来测试,但是我尝试模拟它,然后我想出了这个笨拙的解决方法:
EquipDev1.cmd
:
start /min EquipDev2
EquipDev2.cmd
:
rem Put your long-running command, e.g.,
start /B ssh mysrv "xterm -T mysrv -display mypc:0.0"
rem here.
双击EquipDev1.cmd
。像往常一样,它将在一个新的可见的 CMD 窗口中打开。然后它将EquipDev2.cmd
在一个新的最小化CMD 窗口。然后EquipDev1.cmd
脚本将结束,其窗口将消失。 EquipDev2.cmd
“窗口”将一直存在,直到ssh
命令终止,但它将被最小化,因此您只有在查看任务栏时才能看到它。
解决方案 2
(完全未经测试。)尝试 ,即添加一个与号(start /B ssh mysrv "xterm -T mysrv -display mypc:0.0 &"
&
) 结尾。这应该/可能会导致您的 shell作为异步进程mysrv
运行xterm
,因此 shell 不会等待它完成。因此 shell 将立即退出,因此您的 也将立即退出ssh
,因此(希望)CMD 窗口将消失。
请注意,某些 shell 存在与 Windows/CMD 相同的问题 — 只要子进程处于活动状态,shell 就可能持续存在,即使它是异步运行的。如果你四处寻找,你会发现解决该问题的技巧;例如,nohup
和disown
。