rename
이 명령을 사용하여 대화형 스크립트에서 사용자가 입력한 문자를 기반으로 파일의 기본 이름에 있는 문자를 제거하고 싶습니다 .
기본적으로 저는 이렇게 하고 싶습니다:
read characters_to_remove_inputted_by_the_user
rename 's/$characters_to_remove_inputted_by_the_user//g' file
하지만 변수를 올바르게 삽입하고 스크립트 실행 중에 명령 구조를 유지하는 데 문제가 있습니다.
답변1
여러분의 명령줄에서 알 수 있듯이 다음을 가정해 보세요.perl
rename
구현(1989년 버전 3부터 포함된 샘플 스크립트는 perl
일반적으로 많은 운영 체제에 명령으로 포함되거나 때로는 패키지와 별도의 확장 재작성으로 포함됩니다 perl
.이것), prename
일부 Linux 배포판에서는 때때로 호출됩니다. rename
그렇지 않은 경우그것은에서 오는util-linux
, 다음 환경을 사용할 수 있습니다.
STRING=$characters_to_remove_inputted_by_the_user rename 's/\Q$ENV{STRING}\E//g' ./*
위 내용은$characters_to_remove_inputted_by_the_user
껍데기값으로 전달된 변수STRING
환경perl
검색된 변수를 사용합니다 $ENV{STRING}
.
export
또는 다음을 포함하여 실행하는 모든 명령의 환경에 쉘 변수를 전달하는 쉘 특수 내장 기능을 사용할 수 있습니다 rename
.
export characters_to_remove_inputted_by_the_user
rename 's/\Q$ENV{characters_to_remove_inputted_by_the_user}\E//g' ./*
/는 정규 표현식이 아닌 고정 문자열로 처리되도록 하기 위한 것 \Q
입니다 . 정규식으로 처리하려면 다음을 수행하십시오.\E
$STRING
REGEXP=$characters_to_remove_inputted_by_the_user rename 's/$ENV{REGEXP}//g' ./*
다음 상황을 피하십시오.
"s/$characters_to_remove_inputted_by_the_user//g"의 이름을 바꿉니다./*
위의 쉘 변수의 내용은 호출되기 전에 쉘에 의해 확장되므로 변수의 값이 코드(예: 이와 같은 값 ) rename
로 해석되므로 이는 명령 주입 취약점에 해당할 수 있습니다 .perl
//;system("reboot");s/
답변2
$ touch myfile1
$ ll
total 0
-rw-rw-r--. 1 fpm fpm 0 Mar 25 15:30 myfile1
$ read DELCHARS
my
$ rename -- "$DELCHARS" "" myfile1
$ ll
total 0
-rw-rw-r--. 1 fpm fpm 0 Mar 25 15:30 file1
$