Wget um script e execute-o

Respostas:

51

Cuidado

Antes de executar o script, você confia na pessoa que o escreveu?

Por exemplo, você esperava que o script contivesse isso?

echo "brain1" > /etc/hostname

Isso tentará alterar seu nome de host.


Para referência futura, se, após verificar o script estiver correto e não malicioso, você poderá executá-lo em uma linha como esta:

wget -O - http://dl.dropbox.com/u/11210438/flockonus-stack.sh | bash

Mas faça o download separadamente e leia-o antes de executá-lo pela primeira vez.

Observe também que os avisos interativos dentro do script baixado podem não funcionar corretamente usando esse método.

Mikel
fonte
9
+1 por apontar as preocupações (significativas) de segurança com isso. Tenha absoluta certeza de que confia na fonte. Isso echo "brain1" > /etc/hostnamepoderia ser tão facilmente rm -rf /.
Christopher Cashell
2
+1 Obrigado pessoal, esse script é meu, é seguro .. Adorei o one-liner, mas ele tem algumas linhas interativas que não rodaram .. não sei por que?
Fabiano Soriani
1
Suas apt-get installfalas? Se apt-getinstalar quaisquer dependências extras, ele perguntará e, se não puder, sairá para ser seguro. Adicione todos os pacotes dependentes aos argumentos da linha de comando ou considere adicionar -y, por exemplo,apt-get -y install...
Mikel
o problema não está relacionado a dependências, tem a ver com o apt flushing stdin.
Zoredache
1
Na verdade, você não pode confiar na fonte, mesmo que "confie na fonte" por causa dos ataques do homem no meio. Dito isso, os URLs privados aleatórios com scripts bash devem ser um vetor de ataque estreito o suficiente para que ninguém com a capacidade de executá-lo se preocupe o suficiente.
SpamapS
9

Scripts não interativos

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

Observe que, ao usar esse método, os scripts interativos não funcionarão.


Scripts interativos

Para que os scripts interativos funcionem, você pode usar o seguinte:

bash <(wget -qO- http://website.com/my-script.sh)

Scripts interativos que precisam ser executados como raiz

Aviso: Isso é extremamente perigoso. Não recomendado.

sudo su -c "bash <(wget -qO- http://website.com/my-script.sh)" root

Observe que você não pode usar de maneira simples, sudo bashpois o uso <(...)criará um arquivo virtual e seu descritor de arquivo não estará acessível a partir da instância do bash do roots. Ele deve ser executado no mesmo usuário que precisa ler o arquivo virtual; portanto, ele deve ser enviado como seu próprio comando dentro do shell do usuário raiz.

Nathan F.
fonte
1
Esta é a melhor resposta. Abrange os aspectos importantes da execução interativa versus não interativa versus privilegiada.
Leonid Makarov
5

Esse script é meu, é seguro .. Adorei o one-liner, mas tem algumas linhas interativas que não foram executadas .. não sei por que?

Quando o dpkg é executado, chamado pelo apt-get, ele libera stdin. Se você estiver usando um comando como esse curl blah | bash, estará basicamente enviando o conteúdo da página para o bash via STDIN. Se um dos seus comandos for o apt-get, então será executado, todo o resto será liberado.

O truque é usar um comando como este apt-get install --yes denyhosts </dev/null. Isso fornece ao apt-get uma entrada diferente e simplesmente libera / dev / null em vez do restante do seu script.

Se você quiser ver um exemplo completo de instalação de algo por meio de um script remoto, consulte este script para configurar denyhosts

Para o registro, eu prefiro enrolar sobre o wget por isso, mas o wget também deve estar bem.

Zoredache
fonte
Eu tentei com um script fictício com algum interativo, funcionou cara .. Eu não entendi xD dl.dropbox.com/u/11210438/lala.sh #
Fabiano Soriani #
4
#!/bin/sh
if [ ! -f "/tmp/flockonus-stack.sh" ]
then
    wget -O /tmp/flockonus-stack.sh http://dl.dropbox.com/u/11210438/flockonus-stack.sh
fi

sh /tmp/flockonus-stack.sh
Lynxman
fonte
4

Todos esses exemplos estão faltando um ponto bastante importante. Se você usar o URL http://dl.dropbox.com/u/11210438/flockonus-stack.sh, precisará auditar o script sempre que fizer o download, pois ele pode ser modificado por qualquer pessoa no caminho da rede entre você e o dropbox. Se você mudar para http s : //dl.dropbox.com/u/11210438/flockonus-stack.sh , não terá essa fonte de insegurança.

(O Dropbox tenta redirecionar o URL http para https, mas, no caso de um ataque de rede, o wget nunca consegue falar com o dropbox real e nunca vê o redirecionamento)

pde
fonte
2
Provavelmente é melhor deixar isso como um comentário sobre a pergunta, não como uma resposta, pois não responde exatamente à pergunta. Ainda vale a pena apontar com certeza!
Bill Weiss
2

Tente simplesmente fazer o download conforme especificado com o wget e depois executá-lo diretamente. Você pode ser extravagante e usar variáveis ​​para o script que deseja baixar, etc., mas isso fará o truque

Por exemplo:

!#/bin/bash

#Change to temp directory
cd /tmp

#Download file using wget
wget http://dl.dropbox.com/u/11210438/flockonus-stack.sh

#Execute the file

sh flockonus-stack.sh
Brett
fonte
Como eu diria ao meu sistema para realmente fazer isso na inicialização?
Metallkiller 16/06