- No GitHub Actions, é possível definir com a palavra-chave
shell qual shell será usado para executar um bloco run:
- Em workflows isso é opcional, mas em definições de ações individuais é obrigatório
- O padrão é definido automaticamente conforme o sistema operacional: Linux/macOS usam
bash, Windows usa pwsh
- Ao definir explicitamente
shell: bash, os seguintes flags padrão também são incluídos: --noprofile --norc -eo pipefail
É possível definir qualquer executável como shell
- Em geral, é fácil supor que os valores permitidos em
shell sejam limitados
- Na prática, qualquer executável presente no
$PATH pode ser usado como shell
- Se o comando executado não aceitar entrada por arquivo, é preciso passar o argumento especial
{0}
- O
{0} é automaticamente substituído pelo GitHub pelo caminho de um arquivo temporário
Exemplos experimentais
- Também é possível usar um compilador de C (
tcc) como se fosse um shell e executá-lo diretamente
- Também é possível manipular o
$PATH para criar e usar um shell bash falso
- O GitHub não se importa se o valor especificado em
shell aponta, na prática, para qualquer tipo de executável
Implicações de segurança
- No GitHub Actions, a fronteira entre gravar arquivos e executar algo é difusa (há possibilidade de execução também via
GITHUB_ENV, $GITHUB_PATH etc.)
- Mesmo valores bem conhecidos como
shell: bash são resolvidos via $PATH, sem usar um caminho fixo de execução como /bin/bash
- Ao contrário do que se poderia imaginar, valores como
python também são executados com base em um caminho real, e não apenas como uma referência simples ao toolcache
2 comentários
Só de ver o repositório github/runner-image, já dá para notar que há bastante pacote instalado que pode ser usado direto....
Se criar a imagem, 1 GB entra fácil....
Comentários do Hacker News
-xdo bash para forçar a exibição de todos os comandos executados em um workflow do Actions. Isso é muito útil para depuraçãorepository_dispatchScriptHandler.cscontém todo o código que prepara o ambiente do processo, os argumentos etc.bashpara executar qualquer programagoevalainda não oferece suporte direto a entrada por arquivogoeval