Przekazanie skryptu poleceniem „read” do bash

10

Muszę uruchomić skrypt przez potokiem to przez bashz wget(raczej niż uruchomienie go bezpośrednio z bash).

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

To nie działa, ponieważ mój skrypt zawiera readinstrukcje. Z jakiegoś powodu nie działają one podczas wysyłania potoku do bash:

# Piping to bash works in general
$ echo 'hi'
hi
$ echo "echo 'hi'" | bash
hi

# `read` works directly
$ read -p "input: " var
input: <prompt>

# But not when piping - returns immediately
$ echo 'read -p "input: " var' | bash
$

Zamiast monitować input:i pytać o wartość, jaka powinna, komenda read zostaje pominięta bash.

Czy ktoś wie, w jaki sposób mogę przesłać skrypt readdo bash?

Robin Winslow
źródło

Odpowiedzi:

16

readodczytuje ze standardowego wejścia. Ale standardowe wejście procesu bash jest już zajęte przez skrypt. W zależności od powłoki albo readnic nie będzie czytać, ponieważ powłoka już przeczytała i przeanalizowała cały skrypt, lub readzużyje nieprzewidywalne linie w skrypcie.

Proste rozwiązanie:

bash -c "$(wget -O - http://example.com/my-script.sh)"

Bardziej złożone rozwiązanie, bardziej do celów edukacyjnych niż do zilustrowania dobrego rozwiązania dla tego konkretnego scenariusza:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash
Gilles „SO- przestań być zły”
źródło
Wielkie dzieki. To jest prawie tak eleganckie.
Robin Winslow
2

Zastąpienie procesu zrobi to, co chcesz:

bash <(wget ...)

To powiedziawszy, muszę tutaj zakwestionować twoją motywację. Jeśli kontrolujesz serwer WWW (i używasz https), może to ma sens. Ale samo uruchomienie skryptu z niewidomego Internetu jest bardzo ryzykowne.

Lexelby
źródło
just running a script from the internet blind is very risky- Wiemy, że to ryzykowne, ale ludzie mogą ufać skryptom niektórych organizacji. Zobacz dyskusję w komentarzach do odpowiedzi @ Xen2050.
Robin Winslow,
1

Czy coś jest nie tak z:

wget -O tmpscript.sh http://example.com/my-script.sh
chmod +x tmpscript.sh
tmpscript.sh

?

Xen2050
źródło
Bo wtedy muszę utworzyć plik. Mam na myśli, że to zadziała, jest trochę bałagan.
Robin Winslow
1
Prawdziwe. Chociaż jest to dobry powód do używania /tmp, wiele programów korzysta z plików tymczasowych. Byłbym ostrożny w uruchamianiu pobranych skryptów natychmiast, bez uprzedniego spojrzenia ...
Xen2050,
Cóż, to twój telefon. Wiele projektów oferuje te linijki , np. Docker , Ohmyzsh i inne, których obecnie nie pamiętam. W tym przypadku jest to skrypt instalacyjny, który chcę uruchomić na nowych systemach z własnego repozytorium. Nie martwię się zbytnio o jego zawartość, tak jak ją napisałem.
Robin Winslow
3
Myślę o tym, że ktokolwiek inny znalazłby to pytanie (być może zupełnie nowy użytkownik) może nie wiedzieć nic lepszego.
Xen2050