Я автоматизирую многие процессы в Windows с помощью пакетных файлов и Putty.
Например ( 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>
, но вышеприведенный вариант работает хорошо для меня. Вот более подробный пример:Ubuntu 18.04 на WSL cron daemon не запускается после перезагрузки.
решение2
Как ps4080
упоминается в ответе, правильный способ сделать это wsl -e -- <command>
(или, как правило wsl -e <command>
).
Однако на самом деле существует довольно много нюансов, с которыми вы можете столкнуться при использовании этой техники, и полезно понимать, что происходит с каждым конкретным заклинанием, чтобы при необходимости можно было использовать правильное:
wsl <command>
- Запускает оболочку по умолчанию для текущего пользователя.
- ... как неинтерактивная оболочка без входа в систему
- ... в каталоге, переданном владеющим процессом Windows
- Работает
<command>
в этой оболочке
В зависимости от вашей оболочки, вы можете увидеть это с помощью 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
это ваша оболочка по умолчанию, поскольку -c
это приводит к неявному exec
.
Тот факт, что это выполняется в каталоге владеющего процесса Windows, может быть удобным, поскольку вы можете сделать следующее:
wsl ls -lh
... в PowerShell для получения «человечески читаемых» размеров файлов, что-то такоеудивительно трудно сделатьв противном случае.
Самая сложная часть этого — второй квалификатор. WSL запускает вашу оболочку как нелогинную, неинтерактивную оболочку, когда она запущена таким образом. Это означает, что ~/.bashrc
и ~/.bash_profile
являютсянетsourced on startup. Это может вызвать путаницу при попытке запустить команду, которая требует выполнения каких-либо действий в файлах запуска (например, установки переменной среды).
wsl -e <command>
- Пробежки
<command>
какоболочка - ... в каталоге, переданном процессом-владельцем
Полностью обходит -e
оболочку по умолчанию.
> 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
Это может бытьнемногоболее эффективно, поскольку вы избегаете накладных расходов на запуск оболочки, но обычно об этом не стоит беспокоиться.
wsl -e bash -lic <command>
- Запускается
bash
как ваша оболочка (независимо от того, является ли она оболочкой по умолчанию или нет) - Заставляет его быть интерактивной оболочкой входа в систему (
-li
), так что~/.bashrc
и~/.bash_profile
(и/или другие) являются источниками - ... в каталоге, переданном владеющим процессом Windows
- Работает
<command>
в этой оболочке
Эту версию следует использовать, если команде требуется что-либо из вашей конфигурации запуска.