Czy bezpiecznie jest używać standardowych danych wejściowych i wyjściowych z danymi binarnymi?

14

Muszę podzielić plik binarny na dwa. Zastanawiałem się, czy można użyć głowy i / lub ogona, ale zastanawiałem się ... czy bezpiecznie jest używać przekierowania, potokowania itp. Z danymi binarnymi? Czy nowe wiersze są pomijane, ignorowane są wartości null, czy backspace lub delete robią coś specjalnego? (bash, kubuntu 18.04 LTS)

B.Tanner
źródło
1
Spójrz na splitpolecenie.
egmont

Odpowiedzi:

19

Tak, jest bezpieczny, jeśli potokujesz go do innego procesu lub zapiszesz w pliku. Istnieje potencjalna „dziwność”, jeśli zezwolisz binarnemu standardowemu drukowaniu na terminalu, ponieważ może on zawierać sekwencje specjalne (losowe), które mogą tymczasowo zepsuć wyświetlanie terminala.

Eric Mintz
źródło
6
W takim przypadku możesz wpisać reseti nacisnąć klawisz Enter, aby to naprawić.
Baard Kopperud
4
@BaardKopperud Myślałem, że przeczytałem gdzieś o niektórych przypadkach narożnych, w których tset / reset nie działa
Xen2050,
1
@ Xen2050 Nie wiem. jedyny przypadek, który miałby miejsce, gdyby jakaś sekwencja zmiany znaczenia zmieniła układ / kodowanie klawiatury, tak że pisanie w reset<enter> rzeczywistości nie wpisuje tej sekwencji znaków widzianej przez terminal ...
Bakuriu
3
Zobacz także naprawić zacisk po wyświetleniu pliku binarnego i dlaczego potrzeby konsoli czasem resetu po Ctrl + C . Jak zasugerowano w pierwszym łączu, stty sane; tput rs1sekwencja poleceń sprawdzi się, gdy wystąpią narożne przypadki resetniedziałania. Takie przypadki, oprócz wspomnianych przez Bakuriu, mogą obejmować szerokość linii / kolumn terminala lub domyślam się ustawień związanych z komunikacją szeregową (szybkość transmisji / parzystość).
Sergiy Kolodyazhnyy
1

Główny problem z używaniem poleceń takich jak headlub tailpolega na tym, że są one zorientowane liniowo, a pliki binarne nie. Jeśli mają w sobie znaki nowej linii, często nie są używane do reprezentowania końca linii, a jeśli tak, mogą być po prostu częścią ciągów znaków, takich jak komunikaty programu lub pola danych.

Jeśli dane są w jakikolwiek sposób ustrukturyzowane, musisz wziąć to pod uwagę, wybierając punkty podziału, aby nie rozbijać struktur w środku.

Jeśli znasz strukturę pliku, możesz użyć polecenia takiego jak

dd -if input-file -of output-file ...

z opcjami kopiowania tylko tak wielu bloków danych o określonym rozmiarze, zaczynając od określonego (przyrostowego) przesunięcia do pliku.

Wygląda na to, że splitpolecenie wspomniane przez @egmont zautomatyzuje ten proces, ale wydaje się, że domyślnie jest zorientowane liniowo, więc musisz określić dodatkowe opcje, takie jak --bytes countpowiedzieć, jak duży powinien być każdy kawałek pliku być.


Na marginesie, jeśli nie wiesz, co znajduje się w pliku, ale podejrzewasz, że zawiera on co najmniej pewne znaczące dane tekstowe, stringspolecenie to świetny sposób na sprawdzenie, z czym masz do czynienia.

strings -n 6 file | less

znajdzie wszystkie serie drukowalnych znaków o długości co najmniej sześciu znaków i wyświetli je w pagerze, aby nie przelatywały przez terminal. Użycie liczby nieco większej niż domyślna liczba 4 znaków pomaga wyeliminować małe fragmenty danych, które po prostu nadają się do wydruku, ale nie są używane w ten sposób w pliku.

Jeśli później będziesz musiał zbadać plik bardziej szczegółowo za pomocą edytora binarnego, takiego jak hexedit, będziesz mieć punkty orientacyjne wskazujące, gdzie można znaleźć coś interesującego.

stringsma opcję - t x która poprzedza każdy wydrukowany ciąg z przesunięciem do pliku w systemie szesnastkowym (o dla liczby ósemkowej / d dla liczby dziesiętnej), abyś wiedział, gdzie go później znaleźć. Nawet bardzo krótkie pliki mają wiele do czynienia, gdy trzeba na nie patrzeć znak po znaku.

Joe
źródło