2012-03-02 2 views
2

나는 STDIN을 통해 비밀번호를 받고 몇 가지 다른 검사를 거치는 bash 스크립트를 작성하고 있습니다.Bash는 STDIN에서 읽을 때 심볼 확장을 방지합니다

기호가 포함 된 암호를 사용할 때 문제가 발생합니다.

일반 암호 grassy은 정상이지만 gra$$y과 같은 복잡한 조합은 gra3308y으로 확장됩니다.

내가 사용하고있는 스크립트입니다

read INPUT 

if [ $(echo -n $INPUT|wc -m) -ge 6 ] 

then exit 0 
else exit 1 

fi 

내가 인용의 모든 다른 종류를 시도했다하지만 난 특수 문자를 확장에서 STDIN 비밀번호를 중지 할 수 없습니다.

예를 들어, 이것을 해결하기 위해 수행 할 수있는 원래 값을 작은 따옴표로 묶지 않고 예를 들어 보겠습니다. 스크립트 내부 변수 확장 주위

[email protected] ~ $ echo gra$$| { read INPUT; echo ${INPUT}; } 
gra2598 
+0

그것은 확장하고있는 표준이 아니며, 'echo'호출의 쉘입니다. 한 가지 가능한 방법은 임시 파일에 파일을 저장하고 파일을 'shred -u'하는 것입니다. 또 다른 방법은'eval'과'sed'를 부적절한 방법으로 적용하는 것입니다 ... – 0xC0000022L

+0

실제로 STDIN에서 읽는 원본 스크립트는 STDIN에서'gra $$'를 입력 할 때 잘 동작하지만 테스트 명령은'$$' INPUT 변수에서 읽히기도 전에. – anubhava

+0

또한 'read'는'-r'을 사용하지 않는 한 입력에서 백 슬래시를 사용합니다. – AmigoNico

답변

2

사용 따옴표는 : 스크립트를 개발하는 동안

read INPUT 
echo "Password was: $INPUT" 
if [ $(echo -n "$INPUT" | wc -m) -ge 6 ] 
then echo "OK"; exit 0 
else echo "Bogus"; exit 1 
fi 

, 작업중인 것을 보여 echo를 사용하지만, 큰 따옴표를 사용합니다.

이 프로그램에서 줄을 입력하면 입력 한 문자에 대해 셸 확장이 수행되지 않습니다. 당신이 echo이있는 사용자 입력을 시뮬레이션 할 경우에, 당신은, 따라서 어떤 메타 문자 확장에서 echo을 실행하는 쉘 방지해야합니다

echo 'gra$$' | bash yourscript 

를 작은 따옴표를 생략하면 쉘 (PID를 가진 $$을 대체된다는 것을 의미합니다 아마도 파이프 라인의 껍질이 아니라 부모 껍질의 PID일지도 모릅니다.

bash yourscript 

은 또한 사용할 수 있습니다 : 당신이 실행 한 후 5 개 문자와 줄 바꿈을 입력에서 이것은 다른

$ cat > password-file 
gra$$ 
<control-D> 
$ cat password-file 
gra$$ 
$ bash yourscript < password-file 

<control-D>는 EOF 표시입니다; 마지막 줄 바꿈이 입력 된 이후에 입력 된 모든 0 문자를 플러시하고 cat은 0 바이트를 EOF로 사용할 수 있는지 해석합니다. 따라서 파일에는 'g', '', 'a', '$'두 개의 기호 및 개행 문자가 포함됩니다. 이것은 귀하의 스크립트에 의해 그대로 읽을 것입니다; 데이터가 확장되지 않습니다.

+0

고마워요 조나단, 내가 뭘 생각하는지 모르겠다. +1 – Paulpro

+0

방금 ​​슛을 성공 시켰습니다. 에코 확장에 대해 무슨 뜻인지 알 겠어. 그래서 혼란 스럽다. 시간을내어 설명해 주셔서 감사합니다. – David

+0

또한'set -f' 명령을 사용하여 일부 명령에서 globbing을 비활성화하고 다시 활성화 할 수 있습니다. – 0xC0000022L