URL에서 bash 스크립트 실행


184

"http://mywebsite.com/myscript.txt"URL에 스크립트가 포함 된 파일이 있다고 가정 해 보겠습니다.

#!/bin/bash
echo "Hello, world!"
read -p "What is your name? " name
echo "Hello, ${name}!"

이 스크립트를 먼저 파일로 저장하지 않고이 스크립트를 실행하고 싶습니다. 어떻게해야합니까?

이제 구문을 보았습니다.

bash < <(curl -s http://mywebsite.com/myscript.txt)

그러나 파일에 저장 한 다음 실행하면 작동하지 않는 것 같습니다. 예를 들어 readline이 작동하지 않고 출력은 다음과 같습니다.

$ bash < <(curl -s http://mywebsite.com/myscript.txt)
Hello, world!

마찬가지로, 나는 시도했다 :

curl -s http://mywebsite.com/myscript.txt | bash -s --

같은 결과로.

원래 나는 다음과 같은 해결책을 가지고 있었다.

timestamp=`date +%Y%m%d%H%M%S`
curl -s http://mywebsite.com/myscript.txt -o /tmp/.myscript.${timestamp}.tmp
bash /tmp/.myscript.${timestamp}.tmp
rm -f /tmp/.myscript.${timestamp}.tmp

그러나 이것은 조잡 해 보이며 더 우아한 해결책을 원합니다.

URL에서 셸 스크립트를 실행하는 것과 관련된 보안 문제를 알고 있지만 지금은이 모든 것을 무시하겠습니다.


3
임시 파일을 생성하게되면 아마도 mktemp여러분 자신의 솔루션을 롤링 하는 대신에 아마 사용하고있을 것입니다
Hasturkun

cmd <<foo 대부분의 쉘에서 heredoc 구문이며 아마도 원하는 것이 아닙니다.
dietbuddha

답변:


218
source <(curl -s http://mywebsite.com/myscript.txt)

해야합니다. 또는 표준 입력을 리디렉션하는 초기 리디렉션을 사용하지 마십시오. 경로 bash재 지정없이 파일 이름을 가져 와서 제대로 실행하고 <(command)구문은 경로를 제공합니다.

bash <(curl -s http://mywebsite.com/myscript.txt)

출력을 보면 더 명확해질 수 있습니다. echo <(cat /dev/null)


고마워, 무슨 일이 있었는지 분명하게했다. 궁금한 점은 초기 리디렉션을 사용하면 어떤 이점이 있습니까? RVM 설치를 위해 다음 명령을 사용합니다. bash < <(curl -s https://rvm.beginrescueend.com/install/rvm) 이유는 다음과 같습니다. bash <(curl -s https://rvm.beginrescueend.com/install/rvm)
Tristan

4
작은 노트 : wget을 사용할 수 있지만, 컬이 (주식 우분투 데스크탑 시스템 등)을하지 않은 경우, 당신은 대체 할 수 있습니다 wget -q http://mywebsite.com/myscript.txt -O -에 대한 curl -s http://mywebsite.com/myscript.txt).
D Coetzee

5
스크립트에는 명령 행 인수를 전달할 수 없습니다. bash will_not_work foobar <(curl -s http://example.com/myscript.sh)스크립트를 소유하고 있다면 환경 변수를 대신 사용할 수 있습니다. MYFLAG1=will_work bash MYFLAG2=foobar <(curl -s http://example.com/myscript.sh)파이프와 같이 작동합니다 : curl -s http://example.com/myscript.sh | MYFLAG1=will_work MYFLAG2=foobar bash물론 $ 1과 $ 2 대신 MYFLAG1과 MYFLAG2를 사용해야합니다.
Bruno Bronosky

3
$ sudo bash <(curl -s xxx )에 오류가 발생했습니다 : bash : / dev / fd / 63 : 잘못된 파일 디스크립터
Jake

2
첫 번째 솔루션 (소스를 사용하는 솔루션)은 전혀 작동하지 않았습니다. 두 번째는 다소 효과가 있었지만 한계가 있습니다. 서브 쉘의 URL에서 스크립트를 실행 중입니다. 부모에서 사용하려는 스크립트에 일부 함수가 정의되어 있습니다. 어쨌든 그것을 달성 할 수 있습니까? 아니면 운이 나쁘고 유일한 해결책은 해당 스크립트를 임시 파일로 복사 한 다음 소스하는 것입니까?
Harsh Pandey

86

다음은 일부 인수 (arg1 arg2)를 전달하여 원격 스크립트를 실행하는 방법입니다.

curl -s http://server/path/script.sh | bash /dev/stdin arg1 arg2

2
bash <(curl ... ) stdin을 사용 하면 stty : \ 사용이 중단 됩니다
Flores Robles

47

bash, Bourne shell 및 fish의 경우 :

curl -s http://server/path/script.sh | bash -s arg1 arg2

플래그 "-s"는 stdin에서 쉘을 읽습니다.


1
예를 들어, 이것은 대부분의 껍질에서 작동하지만 허용되는 대답은 물고기 에서는 작동하지 않습니다 .
hoijui 2016 년

16

사용 wget: 일반적으로 기본 시스템 설치의 일부입니다.

bash <(wget -qO- http://mywebsite.com/myscript.txt)

RTFM : gnu.org/software/wget/manual/wget.html . ||| -q == --quiet == "Wget의 출력을 끕니다." ||| -O- == --output-document =-== 파일로 '-'를 사용하면 문서가 표준 출력으로 인쇄됩니다.
amra

13

사용하다:

curl -s -L URL_TO_SCRIPT_HERE | bash

예를 들면 다음과 같습니다.

curl -s -L http://bitly/10hA8iC | bash

12

그냥 시도하십시오 :

bash <(curl -s http://mywebsite.com/myscript.txt)

11

당신은 또한 이것을 할 수 있습니다 :

wget -O - https://raw.github.com/luismartingil/commands/master/101_remote2local_wireshark.sh | bash

11

가장 좋은 방법은

curl http://domain/path/to/script.sh | bash -s arg1 arg2

@ user77115의 답변이 약간 변경되었습니다.


6

나는 종종 다음을 사용하면 충분하다

curl -s http://mywebsite.com/myscript.txt | sh

그러나 오래된 시스템 (kernel2.4)에서는 문제가 발생하여 다음을 수행하여 해결할 수 있습니다.

curl -s http://mywebsite.com/myscript.txt -o a.sh && sh a.sh && rm -f a.sh

$ curl -s someurl | sh
Starting to insert crontab
sh: _name}.sh: command not found
sh: line 208: syntax error near unexpected token `then'
sh: line 208: ` -eq 0 ]]; then'
$

네트워크 속도를 느리게 처리하거나 네트워크 속도를 정상적으로 처리 할 수없는 너무 오래된 bash 버전으로 인해 문제가 발생할 수 있습니다.

그러나 다음은 문제를 해결합니다.

$ curl -s someurl -o a.sh && sh a.sh && rm -f a.sh
Starting to insert crontab
Insert crontab entry is ok.
Insert crontab is done.
okay
$

4

또한:

curl -sL https://.... | sudo bash -

3
마지막 줄의 복용량은 무엇입니까?
towry February

bash 매뉴얼 페이지에서 : A-옵션의 끝을 알리고 추가 옵션 처리를 비활성화합니다. -뒤에 나오는 인수는 파일 이름 및 인수로 취급됩니다. -의 인수는-와 같습니다.
Mingjiang Shi

3

amra와 user77115의 답변을 결합하면됩니다.

wget -qO- https://raw.githubusercontent.com/lingtalfi/TheScientist/master/_bb_autoload/bbstart.sh | bash -s -- -v -v

bbstart.sh 원격 스크립트를 실행하여 -v -v 옵션을 전달합니다.


2

다음 명령을 사용하는 무인 스크립트입니까?

sh -c "$(curl -fsSL <URL>)"

URL에서 직접 스크립트를 실행하지 않는 것이 좋습니다. URL이 안전한지 확인하고 실행하기 전에 스크립트의 내용을 확인해야합니다. 실행하기 전에 SHA256 체크섬을 사용하여 파일의 유효성을 검사 할 수 있습니다.


0

이 방법은 좋고 전통적입니다.

17:04:59@itqx|~
qx>source <(curl -Ls http://192.168.80.154/cent74/just4Test) Lord Jesus Loves YOU
Remote script test...
Param size: 4

---------
17:19:31@node7|/var/www/html/cent74
arch>cat just4Test
echo Remote script test...
echo Param size: $#

-3
bash | curl http://your.url.here/script.txt

실제 예 :

juan@juan-MS-7808:~$ bash | curl https://raw.githubusercontent.com/JPHACKER2k18/markwe/master/testapp.sh


Oh, wow im alive


juan@juan-MS-7808:~$ 

이것은 똑바로 잘못되었습니다. 게시하기 전에 스크립트를 테스트하고 출력을 위조하지 마십시오.
korkman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.