Canalizando um script com "read" para bash

10

Eu preciso executar um script, canalizando-o através bashde wget(em vez de executá-lo diretamente com bash).

$ wget -O - http://example.com/my-script.sh | bash

Não está funcionando porque meu script possui readinstruções. Por alguma razão, eles não funcionam ao canalizar para o bash:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

Em vez de solicitar input:e pedir um valor como deveria, o comando read é ignorado bash.

Alguém sabe como eu posso canalizar um script readpara bash?

Robin Winslow
fonte

Respostas:

16

readlê da entrada padrão. Mas a entrada padrão do processo bash já é aceita pelo script. Dependendo do shell, readele não lê nada, porque o shell já leu e analisou o script inteiro ou readconsumirá linhas imprevisíveis no script.

Solução simples:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Solução mais complexa, mais para fins educacionais do que para ilustrar uma boa solução para esse cenário específico:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
Gilles 'SO- parar de ser mau'
fonte
Agradecimentos impressionantes. Isso é quase tão elegante.
Robin Winslow
2

A substituição do processo fará o que você deseja:

bash <(wget ...)

Dito isto, tenho que questionar sua motivação aqui. Se você controla o servidor da web (e usa https), talvez isso faça sentido. Mas apenas executar um script a partir da Internet é muito arriscado.

Lexelby
fonte
just running a script from the internet blind is very risky- sim, sabemos que é arriscado, mas as pessoas podem optar por confiar em scripts de certas organizações. Veja a discussão nos comentários da resposta do @ Xen2050.
Robin Winslow
1

Existe algo errado com:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?

Xen2050
fonte
Porque então eu tenho que criar um arquivo. Quero dizer que funcionaria, é um pouco bagunçado.
Robin Winslow
1
Verdadeiro. Embora seja uma boa razão para usar /tmp, muitos programas usam arquivos temporários. Eu seria Leary de executar quaisquer scripts baixado imediatamente sem dar uma olhada primeiro ...
Xen2050
Bem, essa é a sua decisão. Muitos projetos oferecem esses recursos, como Docker , ohmyzsh e outros dos quais não me lembro agora. Nesse caso, é um script de instalação que desejo executar em novos sistemas a partir do meu próprio repositório. Não estou muito preocupado com o conteúdo, como escrevi.
Robin Winslow
3
Estou pensando em alguém que encontrar essa pergunta (talvez um usuário totalmente novo) talvez não conheça melhor.
Xen2050