如何以编程方式在 Windows 终端中启动 WSL 并运行命令

sua*_*kim 9 ubuntu windows-subsystem-for-linux windows-terminal

我想bash从批处理文件在 Windows 终端内启动 Ubuntu WSL [shell:] 并传递一个命令,该命令应在启动后立即运行。

  • 当直接启动 WSL 时,我可以使用-c参数来做到这一点;例如,以下命令打开 WSL 并与一些本地端口转发建立 SSH 连接:
    bash -c "ssh -L 3306:localhost:3306 -L 5900:localhost:5900 -L 8001:localhost:8001 user@target.com"
    
    Run Code Online (Sandbox Code Playgroud)

我如何使用 Windows 终端实现此目的?

sua*_*kim 8

我找到了两种方法,到目前为止都有效:

  1. 创建专用配置文件:
    commandline选项还接受参数,这些参数在启动时直接传递给 shell,允许直接使用wsl.exe附加的“启动命令”:
    {
      "guid": "{...}",
      "hidden": false,
      "name": "Ubuntu SSH",
      "commandline": "wsl.exe ssh -L 3306:localhost:3306 -L 5900:localhost:5900 -L 8001:localhost:8001 user@target.com",
    }
    
    Run Code Online (Sandbox Code Playgroud) 我现在可以通过批处理文件启动 shell,该文件使用以下命令运行;然而,缺点是新的配置文件显示在 Windows 终端的配置文件选择菜单中:
    wt -p "Ubuntu SSH"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 传递commandlinewt
    如选项 1 所示,该commandline选项可以包含目标 shell 的更多参数,从批处理文件调用时可以执行以下操作:
    wt wsl.exe ssh -L 3306:localhost:3306 -L 5900:localhost:5900 -L 8001:localhost:8001 user@target.com
    
    Run Code Online (Sandbox Code Playgroud) 我没有找到任何官方在线资源来解释为什么这样做有效,调整了这个答案中的建议,所以我不确定这是否应该以这种方式工作,或者它是否是一个隐藏/无意的功能,可能会在未来的版本中中断。

  • 不带“-p”标志的“wt”运行默认配置文件(最初是“Windows Powershell”)...另请注意,一旦 Microsoft 引入了多个 WSL 发行版,就停用了“Windows 上 Ubuntu 上的 Bash”。运行 `wsl.exe [command]` 而不是 `bash.exe [-c "command"]` 。 (2认同)
  • 检查 [使用 Windows 终端的命令行参数](https://docs.microsoft.com/en-gb/windows/terminal/command-line-arguments?tabs=windows) 和 [此线程](https:// stackoverflow.com/a/62832189/3439404)也是如此。 (2认同)