在 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 脚本时,通过双击它,它会在我的电脑上创建 xterm 窗口。不涉及 Windows 快捷方式或类似方式。但是,除了 xterm 窗口之外,Windows 命令 (cmd) 终端窗口也保持打开状态。“Before time:”和“After time:”消息都显示在 Windows 终端窗口中,时间差最多为 0.01 秒,因此它们会立即出现。
如果我将 更改为xterm
立即返回的命令,例如date
,或者如果我完全删除带有 的行start ...
,则脚本会立即完成,并且不会留下任何 Windows 命令终端。
我可以通过单击“X”手动关闭 Windows 命令终端窗口,并且 xterm 窗口保持打开状态并可运行。如果我关闭 xterm 窗口,Windows 命令终端窗口会自动关闭。
但是,获得那个多余的无用 Windows 命令终端窗口是相当烦人的。
该脚本在干净的 Windows 10 安装上运行,其中没有对注册表进行手动修改。出于这个原因,有问题的建议 我搞砸了我的注册表,现在我需要把它改回来还没有尝试过。
如何创建运行命令ssh mysrv …
然后终止脚本的 Windows 命令脚本,而不让 Windows 命令终端窗口保持打开状态?
Windows 会自动为编译时标记为“控制台可执行文件”的任何可执行文件打开一个控制台窗口。Conhost 窗口不仅托管您的 cmd.exe 脚本——它还托管ssh.exe 进程(它被编译为“控制台”可执行文件,就像 cmd.exe 一样),并且只要任何控制台进程处于运行状态,它就会一直存在使用它。
(这与操作系统根本不区分控制台和非控制台可执行文件的 Unix 模型有很大不同,因此需要手动启动终端主机,例如 xterm。)
API 确实允许在隐藏控制台的情况下启动控制台可执行文件,但没有通过 cmd.exe 执行此操作的选项。一种常见的替代方法是通过 VBScript 或 Python 启动 ssh.exe,因为 Windows 带有非控制台“wscript.exe”VBScript 主机(同样,Python 带有非控制台“pythonw.exe”)。
silentssh.vbs
VBScript 中的示例:解决方案 1
我没有 ssh 来测试,但我试图模拟它,然后我想出了这个笨拙的解决方法:
EquipDev1.cmd
:EquipDev2.cmd
:双击
EquipDev1.cmd
。像往常一样,它将在一个新的、可见的 CMD 窗口中打开。然后它将EquipDev2.cmd
在一个新的、最小化的CMD 窗口中启动。然后EquipDev1.cmd
脚本将结束并且它的窗口将消失。“EquipDev2.cmd
窗口”将持续存在,直到ssh
命令终止,但它会被最小化,因此只有在查看任务栏时才会看到它。方案二
(完全未经测试。)尝试 ,即在末尾添加一个符号 ()。这应该/可能会导致您的 shell作为异步进程 运行,因此 shell 不会等待它完成。因此 shell 将立即退出,因此您的 也会立即退出,因此(希望)CMD 窗口将消失。
start /B ssh mysrv "xterm -T mysrv -display mypc:0.0 &"
&
mysrv
xterm
ssh
请注意,某些 shell 与您在 Windows / CMD 中看到的问题存在相同的问题 - 只要子进程处于活动状态,shell 可能会持续存在,即使它是异步运行的。如果你环顾四周,你会找到打败它的技巧;例如,
nohup
和disown
。