Executar script bash a partir do URL

184

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.

Tristan
fonte
3
Se você acabar criando um arquivo temporário, você provavelmente deve estar usando mktempem vez de rolar sua própria solução
Hasturkun
cmd <<foo é a sintaxe heredoc na maioria das conchas e provavelmente não é o que você deseja.
precisa saber é o seguinte

Respostas:

218
source <(curl -s http://mywebsite.com/myscript.txt)

deveria fazer isso. Como alternativa, deixe o redirecionamento inicial no seu, que está redirecionando a entrada padrão; bashusa um nome de arquivo para executar corretamente sem redirecionar e a <(command)sintaxe fornece um caminho.

bash <(curl -s http://mywebsite.com/myscript.txt)

Pode ser mais claro se você observar a saída de echo <(cat /dev/null)

geekosaur
fonte
Obrigado, isso deixou claro o que estava acontecendo. Apenas curioso, qual é a vantagem de usar esse redirecionamento inicial? Eu pergunto porque para instalação RVM, eles usam o comando: bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) Porque não basta: bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan
4
Pequena nota: se wget está disponível, mas não é onda (por exemplo, em um sistema desktop Ubuntu estoque), você pode substituir wget -q http://mywebsite.com/myscript.txt -O -a curl -s http://mywebsite.com/myscript.txt).
D Coetzee
5
Esteja ciente de que você não pode passar argumentos de linha de comando para o seu script. 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 bashIsto naturalmente exige que você use MYFLAG1 e MYFLAG2 vez de US $ 1 e US $ 2
de Bruno Bronosky
3
$ sudo bash <(curl -s xxx ) obteve erro: bash: / dev / fd / 63: Descritor de arquivo incorreto
Jake
2
A primeira solução (a que usa fonte) não funcionou. O segundo funcionou um pouco, mas tem suas limitações. Ele está executando o script a partir da URL em um subshell. Eu tenho algumas funções definidas no script que eu gostaria de usar no pai. Existe alguma maneira de conseguir isso? Ou estou sem sorte e a única solução é copiar esse script em um arquivo temporário e depois obtê-lo na fonte?
Harsh Pandey
86

Esta é a maneira de executar um script remoto passando alguns argumentos (arg1 arg2):

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2
Anandi Das
fonte
2
Isso quebra stty: \ uso bash <(curl ... ) se você usar stdin
Flores Robles
47

Para bash, concha e peixe Bourne:

curl -s http://server/path/script.sh | bash -s arg1 arg2

O sinalizador "-s" faz com que o shell seja lido do stdin.

user77115
fonte
1
isso deve funcionar na maioria das conchas, enquanto a resposta aceita não funciona com peixes , por exemplo.
hoijui
16

Using wget, que geralmente faz parte da instalação padrão do sistema:

bash <(wget -qO- http://mywebsite.com/myscript.txt)
amra
fonte
RTFM: gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Desligue a saída do Wget." ||| -O- == --output-document = - == Se '-' for usado como arquivo, os documentos serão impressos na saída padrão.
amra
13

Usar:

curl -s -L URL_TO_SCRIPT_HERE | bash

Por exemplo:

curl -s -L http://bitly/10hA8iC | bash
Katie MC
fonte
12

Tente apenas:

bash <(curl -s http://mywebsite.com/myscript.txt)
Random832
fonte
11

Você também pode fazer isso:

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash
luismartingil
fonte
11

A melhor maneira de fazer isso é

curl http://domain/path/to/script.sh | bash -s arg1 arg2

que é uma ligeira mudança de resposta por @ user77115

Vamsidhar Muggulla
fonte
6

Costumo usar o seguinte é suficiente

curl -s http://mywebsite.com/myscript.txt | sh

Mas em um sistema antigo (kernel2.4), ele encontra problemas, e o seguinte pode resolvê-lo, tentei muitos outros, apenas os seguintes trabalhos

curl -s http://mywebsite.com/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

Exemplos

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

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

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$
Chinglin Wen
fonte
4

Além disso:

curl -sL https://.... | sudo bash -
Thomas Decaux
fonte
3
Que dose a última faixa significa?
towry
Na página de manual do bash: A - sinaliza o final das opções e desativa o processamento de opções adicionais. Quaisquer argumentos após o - são tratados como nomes de arquivos e argumentos. Um argumento de - é equivalente a -.
Mingjiang Shi
3

Apenas combinando as respostas de amra e user77115:

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

Ele executa o script distante bbstart.sh passando as opções -v -v.

ling
fonte
2

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.

Mauricio Sánchez
fonte
0

Desta forma, é bom e convencional:

17:04:59@itqx|~
qx>source <(curl -Ls http://192.168.80.154/cent74/just4Test) Lord Jesus Loves YOU
Remote script test...
Param size: 4

---------
17:19:31@node7|/var/www/html/cent74
arch>cat just4Test
echo Remote script test...
echo Param size: $#
javafoot
fonte
-3
bash | curl http://your.url.here/script.txt

exemplo real:

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 
Memes aleatórios 2k18
fonte
Isso está errado. Teste seus scripts antes de postar e não falsifique a saída.
korkman 18/04