Erro de E / S ao passar o argumento da linha de comandos para um script de shell

0

Eu escrevi um script bash de uma linha ( bright.sh ) para ajustar manualmente o brilho da tela.

sudo sh -c 'echo "$1" > /sys/class/backlight/intel_backlight/brightness'

Aqui eu pego o valor de brilho do terminal e o transmito como um argumento para o comando echo. Mas ao executar o script, recebo um erro de E / S da seguinte forma:

sh: echo: I/O error

O que eu faço para passar o argumento com sucesso do terminal e controlar o brilho manualmente? Um exemplo de uso pode ser parecido com:

./bright.sh 230

    
por invinciblycool 13.11.2018 / 11:28

3 respostas

2

O $1 no script sh -c expandirá para o primeiro argumento de linha de comando do script esse , não para o primeiro argumento de linha de comando do script de chamada (desde o script sh -c é único citado).

A solução correta não é injetar o valor de $1 do script de chamada no script sudo (isso permitiria várias vulnerabilidades interessantes de injeção de código), mas passar $1 do script externo para o interior:

sudo sh -c 'printf "%s\n" "$1" > /sys/class/backlight/intel_backlight/brightness' sh "$1"

Como alternativa, use sudo tee para gravar no arquivo como root:

printf '%s\n' "$1" | sudo tee /sys/class/backlight/intel_backlight/brightness >/dev/null

Se os dados impressos no arquivo forem sempre um inteiro, use %d como o espaço reservado printf format em vez de %s .

    
por 13.11.2018 / 11:46
0

Consegui corrigir isso colocando $1 fora da única vírgula invertida. Não tenho certeza se essa é a melhor abordagem.

O script de trabalho agora parece -

sudo sh -c 'echo '$1' > /sys/class/backlight/intel_backlight/brightness'

    
por 13.11.2018 / 11:32
-1

Sim, você vê o problema (sua resposta link ), mas você ainda deve citar o $1 ( apenas no caso de). E não esqueça de especificar o interpretador ( #!… )

«solução removida, como não cita corretamente, e tem um bug de segurança. veja a resposta @Kusalananda. »

Podemos concatenar cordas tocando-as juntas. Aspas duplas irão expandir as expressões $, mas o single não. Nesse caso, você poderia ter colocado tudo em uma aspa dupla, pois o resto do texto não tem $ s, então não faz diferença.

    
por 13.11.2018 / 11:45