curl에서 sh로 파이프하기 전에 쉘 스크립트를 읽고 확인하십시오 (curl -s [url] | sh)


11

웹에서 쉘 스크립트를 실행해야 할 때마다 curl -s [url] | sh먼저 url웹 브라우저에서 스크립트가 악성이 아니고 실행하기에 안전한지 확인하기 위해 엽니 다 .

커맨드 라인에서 스크립트를 읽은 다음 스크립트를 읽은 후 실행을 확인할 수있는 커맨드 라인 트릭을 본 것을 기억합니다. 올바르게 기억 curl -s [url] | something...here | sh하면 소프트웨어 처럼 보일 필요가 없습니다.

누구 든지이 트릭을 알고 있습니까?

답변:


5

에 유틸리티가있다 moreutils라는 vipe쇼 당신은 revew하고이 표준 출력에 전달되기 전에 파일을 수정할 수 있습니다 편집기에서 stdin을 그게.

설치하지 않으려는 경우 moreutils다음과 유사한 작업을 수행 할 수 있습니다.

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

mktempcoreutils매우 가능성이 이미 시스템에 설치되어 있습니다.


2

나는 당신이 묘사 한 것을 할 수있는 단일 유틸리티를 생각할 수 없지만 쉘 스 니펫을 만드는 것은 쉽습니다.

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

스크립트가 텍스트 파일이라고 가정합니다. 널 바이트는 지원되지 않습니다. 쉘에 따라 제거되거나 행 또는 전체 파일이 잘릴 수 있습니다. 또한 파일 끝의 모든 줄 바꿈이 제거됩니다 (heredoc 구문은 다시 줄 바꿈). 일반적으로 스크립트에는 문제가되지 않지만, 예를 들어 스크립트가 2 진 형식의 아카이브로 압축을 푼 경우 일 수 있습니다. 이진 스크립트가 언젠가 잘못 인코딩 될 위험이 크기 때문에 파일을 배포하는 매우 안정적인 방법은 아닙니다. 그럼에도 불구하고 스크립트를 임시 파일에 작성하여 처리 할 수 ​​있습니다.

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"

$()첫 줄에 인용해야합니다. 또한 이것은 입력에서 NUL 문자를 제거하여 치명적일 수 있습니다 (예 : 자동 압축 풀기 스크립트의 경우).
l0b0

1
@ l0b0 과제를 인용 할 필요는 없지만 논란의 여지가없는 스타일 입니다. 마지막 줄 바꿈과 마찬가지로 널 바이트도 손실됩니다. 쉘 스크립트에 아카이브를 포함 시키려면 base64와 같은 텍스트 인코딩을 사용하는 것이 좋습니다.
Gilles 'SO- 악마 그만'

평소와 같이 모든 유효한 포인트. +1
l0b0

@ l0b0 두 번째 생각에는 다소 위험하기 쉽지만 유효한 사용 사례입니다. 내 답변을 업데이트했습니다. 또한 스크립트가 stdin을 사용하도록 허용하지 않는 원래 답변의 결함을 수정했습니다 (스크립트가 stdin에 전달 되었기 때문에 정당한 이유가 없습니다).
Gilles 'SO- 악마 그만해'

1

특수 목적 도구가 필요할 정도로 자주 다운로드하여 실행할 스크립트 소스를 찾을 수있을뿐만 아니라 왜이 작업을 수행해야하는지 상상하기 어렵습니다.

왜 그냥으로 스크립트를 다운로드 curl(또는 wget이나 snarf과가 실행함으로써 중 - 또는 무엇이든), 검사 및 편집이 (가 특정 시스템에 대한 희귀 스크립트 않을 필요가 일부 사용자 정의의) 다음은 실행 chmod이나와 sh scriptname?


특수 목적 도구를 원하지 않습니다. 표준 도구를 사용하여 쉽게 수행 할 수있는 방법이 있다는 것을 기억합니다.
Olivier Lalonde 1

2
작은 셸 스크립트 (아마도 5 줄 정도만)를 작성하여 스크립트를 다운로드하고 볼 수있는 스크립트를 제공 less한 다음 실행 여부를 묻는 것은 어렵지 않습니다 . 스크립트를 다운로드하여 확인한 다음 정상적으로 보이면 실행하는 것보다 낫다는 것을 알 수 없습니다. IMO는 더 나쁠 것이고, 어떤 이점도 제공하지 않지만 쉘에서 작업 할 때 얻는 유연성을 제거 할 것입니다.
cas

0

이 명령 행을 사용하십시오.

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

작은 기능을 사용할 수 있습니다.

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

그리고 이런 식으로 사용하는 것보다 :

curlsh http://site.in.net/path/to/script

0

read 가 -p (prompt)를 알고 있고 shebang에 의해 지정된 인터프리터로 스크립트를 실행할 필요가 없다고 가정합니다 .

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.