在 Windows 上使用批次檔使用命令開啟 Ubuntu 終端機?

在 Windows 上使用批次檔使用命令開啟 Ubuntu 終端機?

我使用批次檔和膩子在 Windows 上自動化許多流程。

例如(login_server7.bat):

start C:\Users\Jack\Documents\putty.exe -ssh 1.1.1.1 -l user123 -pw "bleh"

如何啟動 Ubuntu 終端機並在開啟檔案後自動執行命令?

而不是手動打開 ubuntu 終端機並輸入我的命令?

在該主題的其他地方看不到任何內容。問候

答案1

WSL 的可執行檔是C:\Windows\System32\wsl.exe.您只需輸入wslWindows 命令提示字元即可登入預設的 WSL 實例。或鍵入wsl -h以獲得所有可用選項的清單。在批次檔中,您可以使用:

C:\Windows\System32\wsl.exe <your script or command>

或者,如果您需要以 root 身分執行命令:

C:\Windows\System32\wsl.exe sudo <your script or command>

可能更正確的方法是使用wsl -e -- <command>,但上面的方法對我來說效果很好。這是更詳細的範例:WSL cron 守護程式上的 Ubuntu 18.04 重新啟動後未執行

答案2

正如ps4080的回答所提到的,執行此操作的正確方法是wsl -e -- <command>(或通常是wsl -e <command>)。

然而,實際上,您可能會在使用此技術時遇到很多細微差別,並且最好了解每個確切咒語的情況,以便您可以在需要時使用正確的咒語:

wsl <command>

  • 為目前使用者運行預設 shell
  • ...作為非登入、非互動式 shell
  • ....在所屬 Windows 進程傳入的目錄中
  • <command>在該 shell 中運行

根據您的 shell,您可以使用以下命令查看wsl ps -eH

  PID TTY          TIME CMD
    1 ?        00:00:00 init
   18 ?        00:00:00   init
   19 ?        00:00:00     init
   20 pts/0    00:00:00       fish
   28 pts/0    00:00:00         ps

bash請注意,當您的預設 shell 是時很難看到這一點,因為-c會導致隱式exec.

事實上,它在所屬 Windows 進程的目錄中運行很方便,因為您可以執行以下操作:

wsl ls -lh

....在 PowerShell 中取得「人類可讀」的檔案大小,即出奇地難做到否則。

其中最棘手的部分是第二場預選賽。以這種方式啟動時,WSL 將您的 shell 作為非登入、非互動式 shell 運行。這意味著~/.bashrc~/.bash_profile不是在啟動時獲取。當嘗試執行需要在啟動檔案中執行某些操作(例如設定環境變數)的命令時,這可能會導致混亂。

wsl -e <command>

  • 跑步<command> 作為貝殼
  • ……在擁有進程傳入的目錄中

完全-e繞過您的預設 shell。

> wsl ps -eH
  PID TTY          TIME CMD
    1 ?        00:00:00 init
    7 ?        00:00:00   init
    8 ?        00:00:00     init
    9 pts/0    00:00:00       ps

這可以是輕微地由於避免了 shell 的啟動開銷,因此效率更高,但通常不值得擔心。

wsl -e bash -lic <command>

  • 作為您的 shell運行bash(無論它是否是預設 shell)
  • 強制其成為登入互動式 shell ( -li),以便~/.bashrc~/.bash_profile(和/或其他)獲得來源
  • ....在所屬 Windows 進程傳入的目錄中
  • <command>在該 shell 中運行

如果命令需要啟動配置中的任何內容,則可以使用此版本。

相關內容