Misez sur un script et exécutez-le

Réponses:

51

Prudent

Avant d'exécuter le script, faites-vous confiance à la personne qui l'a écrit?

Par exemple, vous attendiez-vous à ce que le script contienne cela?

echo "brain1" > /etc/hostname

Cela va essayer de changer votre nom d'hôte.


Pour référence future, si, après avoir vérifié que le script est correct et non malveillant, vous pouvez l'exécuter sur une seule ligne comme ceci:

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

Mais téléchargez-le séparément et lisez-le avant de l'exécuter la première fois.

Notez également que les invites interactives dans le script téléchargé peuvent ne pas fonctionner correctement à l'aide de cette méthode.

Mikel
la source
9
+1 pour avoir signalé les problèmes de sécurité (importants) à cet égard. Soyez absolument certain de faire confiance à la source. Cela echo "brain1" > /etc/hostnamepourrait tout aussi bien l'être rm -rf /.
Christopher Cashell
2
+1 Merci les gars, ce script est de moi, il est sûr .. J'ai adoré le one-liner, mais il a des lignes interactives qui ne fonctionnaient pas .. ne sais pas pourquoi?
Fabiano Soriani
1
Vos apt-get installlignes? Si apt-getinstallerait des dépendances supplémentaires, il vous le demandera, et s'il ne le peut pas, il quittera simplement pour être sûr. Soit ajoutez tous les packages dépendants aux arguments de la ligne de commande, soit envisagez d'ajouter -y, par exempleapt-get -y install...
Mikel
le problème n'est pas lié aux dépendances, il a à voir avec apt flushing stdin.
Zoredache
1
En fait, vous ne pouvez pas faire confiance à la source même si vous "faites confiance à la source" à cause des attaques de l'homme au milieu. Cela dit, les URL privées aléatoires avec des scripts bash devraient être un vecteur d'attaque suffisamment étroit pour que personne ayant la capacité de les retirer ne s'en soucie suffisamment pour le faire.
SpamapS
9

Scripts non interactifs

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

Notez que lorsque vous utilisez cette méthode, les scripts interactifs ne fonctionneront pas.


Scripts interactifs

Pour que les scripts interactifs fonctionnent, vous pouvez utiliser ceci:

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

Scripts interactifs qui doivent être exécutés en tant que root

Avertissement: c'est extrêmement dangereux. Non recommandé.

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

Notez que vous ne pouvez pas utiliser simplement sudo bashcar l'utilisation <(...)créera un fichier virtuel et son descripteur de fichier ne sera pas accessible à partir de l'instance bash de root. Il doit être exécuté sur le même utilisateur qui doit lire le fichier virtuel, il doit donc être envoyé comme sa propre commande dans le shell des utilisateurs root.

Nathan F.
la source
1
C'est la meilleure réponse. Il couvre les aspects importants de l'exécution interactive vs non interactive vs exécution privilégiée.
Leonid Makarov
5

Ce script est de moi, il est sûr .. J'ai adoré le one-liner, mais il a des lignes interactives qui ne fonctionnaient pas .. ne sais pas pourquoi?

Lorsque dpkg s'exécute, appelé par apt-get, il vide stdin. Si vous utilisez une commande comme curl blah | bash, alors vous envoyez essentiellement le contenu de la page à bash via STDIN. Si l'une de vos commandes est apt-get, puis s'exécute, tout le reste sera vidé.

L'astuce consiste à utiliser une commande comme celle-ci apt-get install --yes denyhosts </dev/null. Cela donne à apt-get une entrée différente, et il vide simplement / dev / null au lieu du reste de votre script.

Si vous voulez voir un exemple complet d'installation de quelque chose via un script distant, vous pouvez regarder ce script pour configurer les denyhosts

Pour mémoire, je préfère le curl plutôt que le wget pour cela, mais le wget devrait également convenir.

Zoredache
la source
J'ai essayé avec un script factice avec un peu interactif, ça a fonctionné mec .. Je ne comprends pas 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
la source
4

Tous ces exemples manquent un point assez important. Si vous utilisez l'URL http://dl.dropbox.com/u/11210438/flockonus-stack.sh, vous devez auditer le script chaque fois que vous le téléchargez, car il peut être modifié par n'importe qui sur le chemin réseau entre vous et dropbox. Si vous passez à http s : //dl.dropbox.com/u/11210438/flockonus-stack.sh , vous n'aurez pas cette source d'insécurité.

(Dropbox essaie de rediriger l'URL http vers https, mais dans le cas d'une attaque réseau, wget ne pourra jamais parler à la vraie dropbox et ne verra jamais la redirection)

pde
la source
2
Il vaut probablement mieux laisser un commentaire sur la question, pas une réponse, car cela ne répond pas exactement à la question. Cela vaut toujours la peine d'être souligné!
Bill Weiss
2

Essayez simplement de le télécharger comme vous l'avez spécifié avec wget, puis de l'exécuter directement. Vous pouvez avoir de la fantaisie et utiliser des variables pour le script que vous souhaitez télécharger, etc., mais cela fera l'affaire

Par exemple:

!#/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
la source
Comment pourrais-je dire à mon système de le faire au démarrage?
Metallkiller