runner shell-hook

v2.135.0+ (#176). Um valor sensível digitado na linha de comando (runner env set app KEY valor, runner add --token ghp_…, --ckey, --value) fica no history do shell. Um processo filho não alcança o history em memória do shell que o chamou — quem mascara é o próprio shell. Este comando instala esse gancho.

Uso

runner shell-hook                 # imprime o script (bash + zsh)
runner shell-hook --install       # grava /etc/profile.d/runner-history-mask.sh (root)
runner shell-hook --scrub         # mascara agora o que já está em ~/.bash_history / ~/.zsh_history

Depois do --install: bash de login novo já carrega; na sessão atual, source /etc/profile.d/runner-history-mask.sh. zsh: acrescente essa linha ao ~/.zshrc.

O que o gancho faz

  • bash: PROMPT_COMMAND troca a última entrada do history pela versão mascarada (runner env set app KEY ******** --secret).
  • zsh: zshaddhistory grava a versão mascarada em vez da original.
  • A máscara é a mesma do audit log (--token, -t, --ckey, --value, 3º posicional de env set/secrets set); aspas e comandos encadeados (&&, ;, |) são respeitados.
  • Exporta RUNNER_HISTORY_MASK=1; com ela o runner não repete o aviso.

Sem o gancho

Quando o argv traz um segredo, o runner mascara as linhas antigas nos arquivos de history e avisa que a sessão atual ainda guarda o valor. O ps mostra o argv enquanto o comando roda: só o prompt oculto ou --stdin evitam isso.

Prompt oculto

Omitir o valor pede num prompt com eco de *:

runner env set meu-app API_KEY --secret
runner add --repo org/app --token          # --token sem valor
runner edit meu-app --token

Sem terminal (cron, pipe), o comando erra apontando --token-stdin / --stdin em vez de travar. --ckey sem valor continua significando "gerar aleatória".

By Borlot.com.br on 30/09/2026