我使用批次檔和膩子在 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
.您只需輸入wsl
Windows 命令提示字元即可登入預設的 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 中運行
如果命令需要啟動配置中的任何內容,則可以使用此版本。