"읽기"로 스크립트를 배싱하기


10

나는 그것을 통해 파이프하여 스크립트를 실행해야합니다 bashwget(보다는 떠들썩한 파티와 함께 직접 실행).

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

내 스크립트에 read문장 이 있기 때문에 작동하지 않습니다 . 어떤 이유로 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
$

input:값 을 입력하라는 메시지를 표시 하고 묻는 대신 read 명령이 전달됩니다 bash.

아는 사람 있나요 어떻게 파이프 할 수있는 스크립트 readbash?

답변:


16

read표준 입력에서 읽습니다. 그러나 bash 프로세스의 표준 입력은 이미 스크립트에서 가져 왔습니다. 쉘에 따라 read쉘이 이미 전체 스크립트를 읽고 구문 분석했기 때문에 아무것도 읽지 않거나 스크립트에서 read예기치 않은 행을 소비합니다.

간단한 해결책 :

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

이 특정 시나리오에 대한 좋은 솔루션을 설명하는 것보다 교육 목적을위한 더 복잡한 솔루션 :

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

정말 고마워 이것은 거의 우아합니다.
Robin Winslow

2

프로세스 대체는 당신이 원하는 것을 할 것입니다 :

bash <(wget ...)

즉, 나는 당신의 동기에 의문을 제기해야합니다. 웹 서버를 제어하고 https를 사용하면 이것이 의미가있을 수 있습니다. 그러나 인터넷 블라인드에서 스크립트를 실행하는 것은 매우 위험합니다.


just running a script from the internet blind is very risky-예, 위험하다는 것을 알고 있지만 사람들은 특정 조직의 스크립트를 신뢰하도록 선택할 수 있습니다. @ Xen2050의 답변에 대한 의견의 토론을 참조하십시오.
Robin Winslow

1

문제가 있습니까?

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

?


그런 다음 파일을 만들어야합니다. 나는 그것이 효과가 있다는 것을 의미합니다. 조금 지저분합니다.
Robin Winslow

1
진실. 그게 좋은 이유이지만 /tmp많은 프로그램이 임시 파일을 사용합니다. 먼저 보지 않고 다운로드 한 모든 스크립트를 즉시 실행하는 데 도움이 될 것입니다 ...
Xen2050

그게 당신의 전화입니다. 많은 프로젝트가 Docker , ohmyzsh 및 현재 기억할 수없는 다른 하나의 라이너를 제공합니다 . 이 경우 자체 저장소의 새 시스템에서 실행하려는 설정 스크립트입니다. 내가 쓴 내용에 대해 너무 걱정하지 않습니다.
Robin Winslow

3
다른 사람 이이 질문 (아마도 완전히 새로운 사용자)을 더 잘 알지 못할 것이라고 생각합니다.
Xen2050
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.