- En GitHub Actions, se puede especificar con la palabra clave
shell el shell que se usa al ejecutar un bloque run:
- En los workflows es opcional, pero en la definición de acciones individuales es obligatorio
- El valor predeterminado se asigna automáticamente según el sistema operativo: en Linux/macOS es
bash, y en Windows pwsh
- Si se configura explícitamente
shell: bash, también se incluyen estos flags predeterminados: --noprofile --norc -eo pipefail
Se puede asignar cualquier ejecutable como shell
- Es fácil pensar que los valores que se pueden usar en
shell están limitados
- En realidad, cualquier ejecutable que esté en
$PATH puede usarse como shell
- Si el comando ejecutado no acepta entrada por archivo, hay que pasar el argumento especial
{0}
- GitHub reemplaza automáticamente
{0} por la ruta de un archivo temporal
Ejemplos experimentales
- Incluso es posible usar un compilador de C (
tcc) como si fuera un shell para ejecutar directamente
- También es posible manipular
$PATH para crear y usar un shell bash falso
- A GitHub no le importa qué ejecutable real corresponda al valor indicado en el campo
shell
Implicaciones de seguridad
- En GitHub Actions, el límite entre escribir archivos y ejecutar se vuelve difuso (también existe la posibilidad de ejecución mediante
GITHUB_ENV, $GITHUB_PATH, etc.)
- Incluso valores conocidos como
shell: bash se resuelven a través de $PATH, y no usan una ruta fija de ejecución (/bin/bash)
- Contra lo que podría esperarse, valores como
python tampoco son solo referencias al toolcache, sino ejecuciones basadas en rutas reales
2 comentarios
Con solo ver el repositorio github/runner-image, ya se nota que vienen instalados bastantes paquetes que se pueden usar tal cual....
Si armas la imagen, fácilmente se va a 1 GB....
Comentarios de Hacker News
-xde bash para forzar que se imprimieran todos los comandos ejecutados en un flujo de trabajo de Actions. Eso es muy útil para depurarrepository_dispatchusando comodinesScriptHandler.cscontiene todo el código que prepara el entorno del proceso, los argumentos, etc.bashpara ejecutar prácticamente cualquier programagoevaltodavía no admite directamente entrada desde archivosgoeval