Skip to content

Scripts de execução única ​

Um script de execução única (one-shot) é um ZIP que o gerenciador do KernelSU executa uma vez em vez de instalar. Ele é empacotado como um módulo, mas nada permanece no dispositivo: o gerenciador extrai o ZIP para um diretório privado, solicita os parâmetros que ele declara, mostra o código-fonte do action.sh e o executa em um shell root. Use-o para tarefas como desbloquear uma configuração oculta ou exportar um log; qualquer coisa que precise ser executada na inicialização ou modificar as partições do sistema deve ser um módulo.

Estrutura do pacote ​

txt
<id>-<version>.zip
├── module.prop      # the usual module.prop fields + oneshot=true
├── action.sh        # required: the script the manager runs
├── params.json      # optional: parameters asked before running
├── customize.sh     # optional: only used if the ZIP is installed as a module
└── other files      # data the script reads via $MODPATH

O module.prop usa os mesmos campos de um módulo e adiciona oneshot:

txt
id=example_script
name=Example Script
version=v1
versionCode=1
author=Alice
description=Does a thing once
oneshot=true

O oneshot é lido da mesma forma que o metamodule: o valor, ignorando espaços em branco ao redor, é 1 ou true (sem diferenciar maiúsculas de minúsculas). Qualquer outro valor, ou a ausência da linha oneshot, indica um módulo comum.

Não inclua arquivos exclusivos de módulos, como post-fs-data.sh, service.sh, system.prop, sepolicy.rule ou um diretório system/: eles nunca são usados em uma execução única. Um script de execução única não pode ser um metamodule.

Executando um script ​

Há duas formas de executar um script de execução única:

  • Pela loja de módulos: entradas do registro KernelSU Modules com kind: script exibem um selo "Script" e um botão Run em vez de Instalar. O download é verificado em relação ao tamanho e ao SHA-256 do registro, e o module.prop deve conter o id registrado.
  • Por um ZIP local: se você selecionar um único ZIP do armazenamento (ou abrir um a partir de outro app) e o module.prop dele tiver oneshot=true, a página de execução será aberta em vez do instalador. A página também oferece Install as module anyway.

Antes de executar, o gerenciador verifica se o module.prop declara oneshot com um id válido e se o action.sh existe na raiz do ZIP, e então extrai o ZIP. Caminhos absolutos, .., links simbólicos e arquivos especiais são rejeitados, e o conteúdo extraído é limitado a 64 MiB e 4096 entradas.

A página de execução mostra o formulário de parâmetros, o código-fonte do action.sh e a última execução neste dispositivo. Após uma confirmação, o gerenciador executa o script em um novo shell root no namespace de montagem global, como o botão Ação de um módulo:

sh
cd <dir> && <env> /data/adb/ksu/bin/busybox sh ./action.sh </dev/null

A saída é exibida como a saída da Ação e pode ser salva. O diretório extraído é removido em seguida. O gerenciador lembra apenas a última execução (versão e código de saída); não há estado de instalação nem verificação de atualizações.

Variáveis de ambiente ​

VariávelValor
ASH_STANDALONE1
KSUtrue
KSU_VER, KSU_VER_CODE, KSU_KERNEL_VER_CODEVersões do KernelSU, como para módulos
KSU_LATE_LOAD1 apenas no modo late-load
KSU_MODULEo ID do script
KSU_ONESHOT1, para distinguir uma execução única do botão Ação de um módulo instalado
MODPATHo diretório de extração; leia seus arquivos de dados a partir daqui
PATH$PATH:/data/adb/ksu/bin
KSU_PARAM_<KEY>uma por parâmetro, consulte params.json

O stdin é /dev/null, então o script não pode ler entradas de forma interativa; declare parâmetros em vez disso.

Códigos de saída ​

Código de saídaSignificado
0Sucesso.
2Não aplicável a este dispositivo; exibido como um aviso, não como uma falha.
qualquer outroFalha.

params.json ​

O params.json é opcional. Ele fica na raiz do ZIP, é um JSON em UTF-8 e tem no máximo 64 KiB. O gerenciador cria um formulário a partir dele e passa cada valor ao action.sh como KSU_PARAM_<KEY>.

json
{
  "schemaVersion": 1,
  "params": [
    {
      "key": "ENABLE_FASTBOOT",
      "type": "bool",
      "label": "Also enable fastboot",
      "description": "Optional longer help text",
      "default": true
    },
    { "key": "MODE", "type": "enum", "label": "Mode", "default": "a",
      "options": [ { "value": "a", "label": "A" }, { "value": "b" } ] },
    { "key": "NAME", "type": "string", "label": "Name", "default": "", "maxLength": 64,
      "required": false },
    { "key": "COUNT", "type": "int", "label": "Count", "default": 1, "min": 0, "max": 10 }
  ]
}
CampoRegra
schemaVersionDeve ser 1.
paramsAté 16 parâmetros.
key^[A-Z][A-Z0-9_]{0,31}$, único. O valor chega ao script como KSU_PARAM_<key>.
typebool, enum, string ou int.
labelObrigatório, de 1 a 200 caracteres. Os rótulos são exibidos como foram escritos (em um único idioma).
descriptionOpcional, mesmas regras de label.

Por tipo:

TipoCamposPassado como
booldefault: true / false (padrão false).true / false
enumoptions: de 1 a 32 entradas {value, label?}; value corresponde a ^[A-Za-z0-9._-]{1,64}$ e é único. default deve ser um dos valores (padrão: a primeira opção).o valor da opção
stringdefault (padrão ""), maxLength de 1 a 1024 (padrão 256), required (padrão false; um valor vazio é permitido, a menos que seja obrigatório). Os valores não podem conter NUL nem quebras de linha.como digitado
intmin / max e default opcionais (padrão min, ou 0 sem min); inteiros com sinal de 32 bits.decimal

O default de cada parâmetro deve satisfazer suas próprias restrições. Se o params.json for inválido, o gerenciador se recusa a executar o script.

WARNING

Não há verificação de formato para valores string. Cada valor é passado entre aspas simples, então nunca é expandido pelo shell que inicia o action.sh, mas o action.sh ainda deve validá-lo e colocá-lo entre aspas ao usá-lo.

Exemplo ​

sh
#!/system/bin/sh
# action.sh
MODPATH=${MODPATH:-${0%/*}}

if [ "$(getprop ro.miui.ui.version.name)" = "" ]; then
  echo "Not a MIUI device"
  exit 2
fi

echo "Mode: ${KSU_PARAM_MODE:-a}"
if [ "$KSU_PARAM_ENABLE_FASTBOOT" = "true" ]; then
  sh "$MODPATH/fastboot.sh" || exit 1
fi
echo "Done"

Compatibilidade com gerenciadores antigos ​

Gerenciadores sem suporte a execução única instalam o ZIP como um módulo comum cujo botão Ação executa o action.sh. Mantenha o action.sh funcionando também nesse caso: nele, KSU_ONESHOT, MODPATH e KSU_PARAM_* não são definidos e o diretório de trabalho é o diretório do módulo. Use valores padrão como alternativa, como no exemplo acima:

sh
MODPATH=${MODPATH:-${0%/*}}
MODE=${KSU_PARAM_MODE:-a}

Publicação ​

Para publicar um script de execução única no KernelSU Modules, defina kind: script no module.yaml. Consulte Script entries para as regras do registro.

Lançado sob a Licença GPL3