Nowe posty

Autor Wątek: Zmiana części pliku tekstowego (sed?)  (Przeczytany 1567 razy)

Offline utf-8

  • Users
  • Użytkownik
  • **
  • Wiadomości: 56
    • Zobacz profil
Zmiana części pliku tekstowego (sed?)
« dnia: 2019-11-17, 00:24:05 »
Potrzebuję wyciąć kawałek kodu z wszystkich plików w danym katalogu (pozostałość po ataku). Sęk w tym że jest on tak niewygodny, że muszę złapać kilka linii aby nie wywalić czegoś istotnego.

To jest mniej więcej taki format tekstu
if (blablabla) {
blabla.bla(bla);
} else {
blablablabla;
}

Natłukłem się tych poleceń w konsoli. Ale poprzednie problemy rozwiązywałem zdaje się:
find . -type f -name "*.js" -print0 | xargs -0 sed...
No ale z tymi kilkoma liniami to zupełnie mi nie wychodzi w sed. Patrzyłem ale nie mam komendy pearl na tym serwerze. Czy ktoś mógłby podpowiedzieć jak to ogarnąć?

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Odp: Zmiana części pliku tekstowego (sed?)
« Odpowiedź #1 dnia: 2019-11-17, 12:35:54 »
Myslalem ze by Ci poradzic napisanie skryptu bash i nad takim przykladem myslalem,
ale potem stwierdzilem ze jest to troche skomplikowane, pomijam ze chodzi  ze komendy sed czy teoretycznie grep to jedno-linijkowce
ale chodzi o to ze skladnia "if" ktora pokazales (WZORZEC) jest zgodna z rozszerzeniem plikow *.js
i wedlug podanego wzoru usuneloby Ci zarówno dodatek po ataku jak i poprawne dzialajace konstrukcje "if".

Mozesz te konstrukcje z if wyszukac
grep -rin "if (.*) {" *
i recznie pliki edytowac.
Jest to wygodniejsze bo masz napisany numer linii w ktorej szukac,
chociaz w wiekszosci edytorow tez jest wyszukiwarka.
Ale co zrobisz jesli bylo tam dodane cos wiecej?   Jesli tak, to i tak musisz ręcznie przejrzec pliki.
« Ostatnia zmiana: 2019-11-17, 12:45:36 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline utf-8

  • Users
  • Użytkownik
  • **
  • Wiadomości: 56
    • Zobacz profil
Odp: Zmiana części pliku tekstowego (sed?)
« Odpowiedź #2 dnia: 2019-11-17, 12:56:10 »
Plików są setki jak nie tysiące. Ale fragment tekstu jest w każdym identyczny. Więc to chodzi tylko o to żeby wpisać frazę na te 5 linii. Problemem są linie:
} else {
}
 

Ponieważ one występują masowo i stąd muszę złapać wszystkie 5 linii.

Robiłem to za pomocą PHP Storm na okienkach. Ale ilość pomieszanych plików do skopiowania jest tak duża, że zajęłoby mi to cały dzień. A w konsoli zrobię to w kilkadziesiąt minut.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Odp: Zmiana części pliku tekstowego (sed?)
« Odpowiedź #3 dnia: 2019-11-17, 13:05:33 »
A nie da sie poprostu przygotowac do postawienia serwera na nowo
i jesli masz pliki konfiguracyjne lub jakies prywatne rzeczy bez kopii zapasowych to przejrzec recznie?
( W tych setkach plikow moze sie skrywac ten jeden najbardziej zlosliwy )
« Ostatnia zmiana: 2019-11-17, 13:11:50 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline utf-8

  • Users
  • Użytkownik
  • **
  • Wiadomości: 56
    • Zobacz profil
Odp: Zmiana części pliku tekstowego (sed?)
« Odpowiedź #4 dnia: 2019-11-17, 14:48:52 »
Tyle to wiem, ale kopi zapasowych nie było. Więc muszę sprzątać kod ręcznie. To już inne techniki wykorzystuję do namierzania tych wstawek. Na szczęście zrobił to ktoś kto uważa że jest zajebisty. Wstawki są identyczne, więc bez problemu się to usuwa. Zabranie hasła mysql z domyślnego pliku też odcięło nadpisywanie bazy. Teraz w logach będę szukał gdzie to siedzi co nadpisuje cyklicznie.

Natomiast wracając do mojego problemu. Denerwuje mnie fakt że nie można zrobić find and replace stringa w pliku, jeśli ten zawiera znaki nowej linii.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2757
  • 1709
    • Zobacz profil
Odp: Zmiana części pliku tekstowego (sed?)
« Odpowiedź #5 dnia: 2019-11-17, 16:31:07 »
Taki przyklad zrobilem

$ cat wzorzec | sed  ':a;N;$!ba;s/\n/wungiel123/g' | sed 's/wungiel123/\n/g'
if (blablabla) {
blabla.bla(bla);
} else {
blablablabla;
}
Ma on za zadanie zastapic nowe linie slowem aby wzorzec byl w jednej linii.
( Oczywiscie drugi sed mial za zadanie prywrocic strukture pliku do poprzedniego stanu )
Jesli tekst bedzie w jednej linii  to mozna uzyc sed.
Pewnie da sie bezposrednio, ale ja nie potrafie narazie.

#!/bin/bash


LISTA_PLIKOW=$(find . -type f -name "*.js")

# $ grep -rin -A4  "if (.*) {" *.js
# $ cat wzorzec | sed  ':a;N;$!ba;s/\n/wungiel123/g' | sed 's/wungiel123/\n/g'

WZORZEC2=$(cat wzorzec | sed  ':a;N;$!ba;s/\n/wungiel123/g')
##  https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed
#echo $WZORZEC2

for K in ${LISTA_PLIKOW}; do
    #cat  ${K} | sed  ':a;N;$!ba;s/\n/wungiel123/g' | sed  "s/$WZORZEC2//g" |  sed 's/wungiel123/\n/g'
     sed -i -e ':a;N;$!ba;s/\n/wungiel123/g' -e   "s/$WZORZEC2//g" -e 's/wungiel123/\n/g'  ${K}
done
Skrypt mozesz zastosowac tylko na kopii do testowania.


Cytuj
To już inne techniki wykorzystuję do namierzania tych wstawek.
Nie da sie, musisz przeczytac i sprawdzic kod od zera do deski.
To moze byc nawet tylko jeden znak "=" przy porownaniu lub inny dajacy dodatkowe uprawnienia.

Teoretycznie nawet data powstania pliku jest cyfrowym zapisem i moze byc sfalszowana.
Ale oczywiscie probowac mozesz.
« Ostatnia zmiana: 2019-11-17, 16:43:27 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.