Piping một kịch bản với những người đọc đọc sách để bash


10

Tôi cần phải chạy một kịch bản do đường ống thông qua bashvới wget(chứ không phải chạy nó trực tiếp với bash).

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

Nó không hoạt động vì tập lệnh của tôi có các readcâu lệnh trong đó. Vì một số lý do, những thứ này không hoạt động khi đường ống đến 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
$

Thay vì nhắc nhở input:và yêu cầu một giá trị như bình thường, lệnh đọc sẽ được chuyển qua bash.

Có ai biết làm thế nào tôi có thể đường ống một kịch bản với readtới bash?

Câu trả lời:


16

readđọc từ đầu vào tiêu chuẩn. Nhưng đầu vào tiêu chuẩn của quy trình bash đã được kịch bản thực hiện. Tùy thuộc vào trình bao, readsẽ không đọc bất cứ điều gì vì trình bao đã đọc và phân tích toàn bộ tập lệnh hoặc readsẽ tiêu thụ các dòng không thể đoán trước trong tập lệnh.

Giải pháp đơn giản:

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

Giải pháp phức tạp hơn, nhiều hơn cho mục đích giáo dục hơn là minh họa một giải pháp tốt cho kịch bản cụ thể này:

echo '{ exec </dev/tty; wget -O - http://example.com/my-script.sh; }' | bash

Thật sự cảm ơn. Điều này là gần như thanh lịch.
Robin Winslow

2

Quá trình thay thế sẽ làm những gì bạn muốn:

bash <(wget ...)

Điều đó nói rằng, tôi phải đặt câu hỏi về động lực của bạn ở đây. Nếu bạn kiểm soát máy chủ web (và sử dụng https) thì có lẽ điều này có thể có ý nghĩa. Nhưng chỉ cần chạy một kịch bản từ internet mù là rất rủi ro.


just running a script from the internet blind is very risky- vâng, chúng tôi biết đó là rủi ro, nhưng mọi người có thể chọn tin tưởng các tập lệnh từ các tổ chức nhất định. Xem các cuộc thảo luận trong các bình luận về câu trả lời của @ Xen2050.
Robin Winslow

1

Có điều gì đó sai với:

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

?


Sau đó tôi phải tạo một tập tin. Ý tôi là nó hoạt động, nó hơi lộn xộn.
Robin Winslow

1
Thật. Mặc dù đó là một lý do tốt để sử dụng /tmp, rất nhiều chương trình sử dụng tệp tạm thời. Tôi sẽ không muốn chạy bất kỳ tập lệnh đã tải xuống nào ngay lập tức mà không xem trước ...
Xen2050

Đó là cuộc gọi của bạn. Rất nhiều dự án cung cấp các lớp lót này, ví dụ Docker , ohmyzsh và các dự án khác mà tôi không thể nhớ ngay bây giờ. Trong trường hợp này, đó là tập lệnh thiết lập mà tôi muốn chạy trên các hệ thống mới từ kho lưu trữ của riêng tôi. Tôi không quá lo lắng về nội dung của nó, như tôi đã viết nó.
Robin Winslow

3
Tôi đang nghĩ về bất cứ ai khác tìm thấy câu hỏi này (một người dùng hoàn toàn mới) có thể không biết gì hơn.
Xen2050
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.