Automatizo muchos procesos en Windows usando archivos por lotes y PuTTY.
Por ejemplo (login_server7.bat):
start C:\Users\Jack\Documents\putty.exe -ssh 1.1.1.1 -l user123 -pw "bleh"
¿Cómo puedo iniciar una terminal de Ubuntu y ejecutar un comando automáticamente después de abrir un archivo?
¿En lugar de abrir manualmente la terminal de Ubuntu y escribir mis comandos?
No puedo ver nada en otra parte sobre este tema. Saludos
Respuesta1
El ejecutable de WSL es C:\Windows\System32\wsl.exe
. Puede simplemente escribir wsl
el símbolo del sistema de Windows e iniciará sesión en la instancia WSL predeterminada. O escriba wsl -h
para obtener la lista de todas las opciones disponibles. En archivos por lotes puede utilizar:
C:\Windows\System32\wsl.exe <your script or command>
O si necesita ejecutar el comando como root:
C:\Windows\System32\wsl.exe sudo <your script or command>
Probablemente la forma más correcta sea usar wsl -e -- <command>
, pero lo anterior funciona bien para mí. Aquí hay un ejemplo más detallado:Ubuntu 18.04 en el demonio cron WSL no se ejecuta después del reinicio.
Respuesta2
Como ps4080
menciona la respuesta, la forma correcta de hacer esto es wsl -e -- <command>
(o, normalmente wsl -e <command>
).
Sin embargo, en realidad hay bastantes matices con los que te puedes topar con esta técnica, y es bueno entender qué sucede con cada encantamiento exacto para que puedas usar el correcto cuando sea necesario:
wsl <command>
- Ejecuta el shell predeterminado para el usuario actual.
- ... como un shell no interactivo y sin inicio de sesión
- ... en el directorio pasado por el proceso propietario de Windows
- Corre
<command>
en ese caparazón
Dependiendo de tu shell, puedes ver esto con 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
Tenga en cuenta que es difícil ver esto cuando bash
es su shell predeterminado, ya que -c
da como resultado un archivo exec
.
El hecho de que esto se ejecute en el directorio del proceso propietario de Windows puede ser útil, ya que puedes hacer:
wsl ls -lh
... en PowerShell para obtener tamaños de archivos "legibles por humanos", algo que essorprendentemente difícil de hacerde lo contrario.
La parte más complicada de esto es el segundo clasificatorio. WSL ejecuta su shell como un shell no interactivo y sin inicio de sesión cuando se inicia de esta manera. Esto significa que ~/.bashrc
y ~/.bash_profile
sonnoobtenido al inicio. Esto puede causar confusión al intentar ejecutar un comando que requiere que se haga algo en los archivos de inicio (por ejemplo, configurar una variable de entorno).
wsl -e <command>
- Carreras
<command>
comola cáscara - ... en el directorio pasado por el proceso propietario
Esto -e
omite por completo su shell predeterminado.
> 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
Esto puede serlevementemás eficiente ya que evita la sobrecarga de inicio del shell, pero normalmente no vale la pena preocuparse por ello.
wsl -e bash -lic <command>
- Se ejecuta
bash
como su shell (independientemente de si es el shell predeterminado o no) - Lo obliga a ser un shell interactivo (
-li
) de inicio de sesión para que~/.bashrc
y~/.bash_profile
(y/u otros) se obtengan - ... en el directorio pasado por el proceso propietario de Windows
- Corre
<command>
en ese caparazón
Esta es la versión que se debe usar si el comando necesita algo de su configuración de inicio.