Digamos que eu tenho um arquivo no URL "http://mywebsite.com/myscript.txt" que contém um script:
#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"
E eu gostaria de executar esse script sem primeiro salvá-lo em um arquivo. Como eu faço isso?
Agora, eu vi a sintaxe:
bash < <(curl -s http://mywebsite.com/myscript.txt)
Mas isso não parece funcionar como se eu salvasse em um arquivo e depois o executasse. Por exemplo, o readline não funciona e a saída é apenas:
$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!
Da mesma forma, eu tentei:
curl -s http://mywebsite.com/myscript.txt | bash -s --
Com os mesmos resultados.
Originalmente, eu tinha uma solução como:
timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp
Mas isso parece desleixado e eu gostaria de uma solução mais elegante.
Estou ciente dos problemas de segurança relacionados à execução de um shell script a partir de uma URL, mas vamos ignorar tudo isso por enquanto.
mktemp
em vez de rolar sua própria soluçãocmd <<foo
é a sintaxe heredoc na maioria das conchas e provavelmente não é o que você deseja.Respostas:
deveria fazer isso. Como alternativa, deixe o redirecionamento inicial no seu, que está redirecionando a entrada padrão;
bash
usa um nome de arquivo para executar corretamente sem redirecionar e a<(command)
sintaxe fornece um caminho.Pode ser mais claro se você observar a saída de
echo <(cat /dev/null)
fonte
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
Porque não basta:bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
wget -q http://mywebsite.com/myscript.txt -O -
acurl -s http://mywebsite.com/myscript.txt
).bash will_not_work foobar <(curl -s http://example.com/myscript.sh)
Se você possui o script que você pode usar variáveis de ambiente em vez assim:MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)
e também funciona com tubos assim:curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash
Isto naturalmente exige que você use MYFLAG1 e MYFLAG2 vez de US $ 1 e US $ 2Esta é a maneira de executar um script remoto passando alguns argumentos (arg1 arg2):
fonte
bash <(curl ... )
se você usar stdinPara bash, concha e peixe Bourne:
O sinalizador "-s" faz com que o shell seja lido do stdin.
fonte
Using
wget
, que geralmente faz parte da instalação padrão do sistema:fonte
Usar:
Por exemplo:
fonte
Tente apenas:
fonte
Você também pode fazer isso:
fonte
A melhor maneira de fazer isso é
que é uma ligeira mudança de resposta por @ user77115
fonte
Costumo usar o seguinte é suficiente
Mas em um sistema antigo (kernel2.4), ele encontra problemas, e o seguinte pode resolvê-lo, tentei muitos outros, apenas os seguintes trabalhos
Exemplos
O problema pode causar a lentidão da rede ou a versão do bash muito antiga que não consegue lidar com a lentidão da rede normalmente
No entanto, o seguinte resolve o problema
fonte
Além disso:
fonte
Apenas combinando as respostas de amra e user77115:
Ele executa o script distante bbstart.sh passando as opções -v -v.
fonte
Há alguns scripts autônomos que eu uso o seguinte comando:
sh -c "$(curl -fsSL <URL>)"
Eu recomendo evitar a execução de scripts diretamente de URLs. Você deve ter certeza de que o URL está seguro e verificar o conteúdo do script antes de executar; você pode usar uma soma de verificação SHA256 para validar o arquivo antes de executar.
fonte
Desta forma, é bom e convencional:
fonte
exemplo real:
fonte