Lesen und bestätigen Sie das Shell-Skript, bevor Sie von curl zu sh (curl -s [url] | sh) leiten.

11

Immer wenn ich ein Shell-Skript aus dem Web ausführen muss curl -s [url] | sh, öffne ich es zuerst urlin meinem Webbrowser, um sicherzustellen, dass das Skript nicht schädlich ist und sicher ausgeführt werden kann.

Ich erinnere mich an einen Befehlszeilentrick, der es ermöglichte, das Skript über die Befehlszeile zu lesen und die Ausführung nach dem Lesen des Skripts zu bestätigen. Wenn ich mich richtig erinnere, sah es ungefähr so ​​aus curl -s [url] | something...here | shund erforderte keine Softwareinstallation.

Kennt jemand diesen Trick?

Olivier Lalonde
quelle

Antworten:

5

Es gibt ein Dienstprogramm moreutilsnamens vipe, das stdin in einem Editor anzeigt, in dem Sie die Datei überprüfen und ändern können, bevor sie an stdout übergeben wird.

Wenn Sie nicht installieren möchten moreutils, können Sie Folgendes erreichen:

file=$(mktemp); curl -s "$url" > $file; $EDITOR $file; sh $file; rm $file

mktempist in coreutilsund ist sehr wahrscheinlich bereits auf Ihrem System installiert.

Shawn J. Goff
quelle
2

Ich kann mir kein einziges Dienstprogramm vorstellen, das das tut, was Sie beschreiben, aber es ist einfach genug, daraus ein Shell-Snippet zu machen.

script=$(curl -s "$url")
printf "%s\nDo you want to run this script? [yN]" "$script"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh -c "$script";;
esac

Dies setzt voraus, dass das Skript eine Textdatei ist. Null-Bytes werden nicht unterstützt: Je nach Shell werden sie möglicherweise entfernt oder eine Zeile oder die gesamte Datei wird abgeschnitten. Außerdem werden alle Zeilenumbrüche am Ende der Datei entfernt (das Heredoc-Konstrukt fügt einen zurück). Dies ist normalerweise kein Problem für ein Skript, es kann jedoch beispielsweise sein, dass das Skript mit einem Archiv im Binärformat endet, das es extrahiert. Dies ist keine sehr zuverlässige Methode zum Verteilen einer Datei, da ein erhebliches Risiko besteht, dass ein solches Binärskript irgendwann falsch codiert wird. Sie können dies jedoch tun, indem Sie das Skript in eine temporäre Datei schreiben.

script_file=$(mktemp)
curl -s "$url" | tee "$script_file"
printf "Do you want to run this script? [yN]"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh "$script_file";;
esac
rm "$script_file"
Gilles 'SO - hör auf böse zu sein'
quelle
$()sollte in der ersten Zeile zitiert werden. Dies würde auch NUL-Zeichen in der Eingabe entfernen, was möglicherweise schwerwiegend sein könnte (zum Beispiel im Fall eines selbstextrahierenden Skripts).
10b0
1
@ l0b0 Du musst nicht in einer Aufgabe zitieren, obwohl es wohl ein guter Stil ist . Null-Bytes gehen in der Tat verloren, ebenso wie endgültige Zeilenumbrüche. Wenn Sie ein Archiv in ein Shell-Skript aufnehmen möchten, empfehle ich die Verwendung einer Textcodierung wie base64.
Gilles 'SO - hör auf böse zu sein'
Alle gültigen Punkte wie gewohnt. +1
10b0
@ l0b0 Auf den zweiten Blick ist dies zwar ein gewisses Risiko, aber ein gültiger Anwendungsfall. Ich habe meine Antwort aktualisiert. Ich habe auch einen Fehler in meiner ursprünglichen Antwort korrigiert, der es dem Skript nicht erlaubte, sein stdin zu verwenden (weil das Skript ohne guten Grund an stdin übergeben wurde).
Gilles 'SO - hör auf böse zu sein'
1

Es ist schwer vorstellbar, warum Sie dies überhaupt tun möchten, geschweige denn, wo Sie eine Quelle (oder Quellen) von Skripten finden, die Sie so häufig herunterladen und ausführen können, dass ein spezielles Tool erforderlich ist.

Warum nicht einfach das Skript mit curl(oder wgetoder snarfoder was auch immer) herunterladen , untersuchen und bearbeiten (es ist ein seltenes Skript, das für Ihr bestimmtes System nicht angepasst werden muss) und es dann ausführen - entweder indem es mit chmododer mit ausführbar gemacht wird sh scriptname?

cas
quelle
Ich möchte kein Spezialwerkzeug. Ich erinnere mich, dass es eine einfache Möglichkeit gab, dies mit Standardwerkzeugen zu tun.
Olivier Lalonde
2
Es wäre nicht schwer, ein kleines Shell-Skript (wahrscheinlich nur 5 oder so Zeilen) zu schreiben, um ein Skript herunterzuladen, es zum Anzeigen mit lessoder etwas anderem zu präsentieren und Sie dann zu fragen, ob Sie es ausführen möchten. Ich kann nicht sehen, dass das besser wäre, als nur das Skript herunterzuladen, es anzuzeigen und es dann auszuführen, wenn es in Ordnung zu sein scheint. IMO wäre es schlimmer, es würde keinen Vorteil bieten, würde aber die Flexibilität beseitigen, die Sie erhalten, wenn Sie nur in Ihrer Shell arbeiten.
Cas
0

Verwenden Sie diese Befehlszeile:

curl URL | ( cat > /tmp/file; read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) | sh

Sie könnten dafür eine kleine Funktion verwenden:

curlsh()
{
    curl "$1" \
    | ( cat > /tmp/file;read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) \
    | sh
}

Und dann benutze es so:

curlsh http://site.in.net/path/to/script
Igor Chubin
quelle
0

Angenommen, Ihr Lesevorgang kennt -p (Eingabeaufforderung) und das Skript muss nicht mit dem vom Shebang angegebenen Interpreter ausgeführt werden:

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
Benutzer unbekannt
quelle