2010-03-24 19 views
5

mam aplikację, która uruchamia polecenie jak poniżej:Jak przekierować wyjście z dala od/dev/null

<command> <switches> >& /dev/null

mogę skonfigurować <command>, ale nie mam kontroli nad <switches>. Całe wyjście generowane przez to polecenie przechodzi do /dev/null. Chcę, aby dane wyjściowe były widoczne na ekranie lub przekierowane do pliku dziennika.

Próbowałem użyć freopen() i powiązanych funkcji, aby ponownie otworzyć /dev/null do innego pliku, ale nie mogłem go uruchomić.

Czy masz jakieś inne pomysły? Czy to w ogóle możliwe?

Dzięki za poświęcony czas.

PS: Pracuję nad Linuksem.

+0

co to ma wspólnego z Perl? –

+0

Jeśli nie możesz zmienić polecenia w skrypcie, myślę, że nie masz szczęścia. Po przekierowaniu na wartość null nie można go odzyskać, ponieważ wszystkie deskryptory plików, którymi można się z nią podzielić (stdin, stdout, stderr), zniknęły. – tvanfosson

+0

Masz kontrolę nad poleceniem, ale nie możesz go przekierować? Jeśli tak, to powiedziałbym, że e-t172 ma rację, a przynajmniej tak, jak masz prawo: http://stackoverflow.com/questions/2507569/how-to-redirect-output-away-from -dev-null/2507624 # 2507624 Jeśli nie, proszę zaktualizować, aby wyjaśnić. –

Odpowiedz

4

Ponieważ można modyfikować uruchamiane polecenie, można użyć prostego skryptu powłoki jako opakowania do przekierowania danych wyjściowych do pliku.

#!/bin/bash 
"[email protected]" >> logfile 

Jeśli zapiszesz to w drogę jako capture_output.sh następnie można dodać capture_output.sh rozpoczęciem polecenia dołączyć wyjście programu do pliku dziennika.

7

Terrible Hack:

użyć edytora tekstu w trybie binarnym otworzyć aplikację, znajdź '/ dev/null /' i zastąpić ją z ciągiem tej samej długości

e.g '~/tmp/log' 
  • makijażu pierwszy
  • kopii zapasowej należy zachować ostrożność
  • być bardzo ostrożny
  • nie wspominając już kopię zapasową?
+0

Wyjaśnienie: otwórz plik wykonywalny binarny za pomocą edytora tekstu Gdzieś w bełkocie plików binarnych powinno być "/ dev/null", co zastępujesz jako Zasugerowałem wyżej: – Ricket

+0

@lexu: Zrobiłem to wcześniej, zastąpiłem/dev/null ciągiem znaków o równej długości.To działa, ale dla każdej wersji aplikacji, hackowanie pliku wykonywalnego jest nużące ... Byłem myśląc o napisaniu programu, który wykonuje pewne przekierowanie, hackuje i wywołuje . To będzie jednorazowy wysiłek. – Gowtham

+1

+1 dla listy towarzyszącej. –

2

Dodaj # na końcu polecenia, aby stała się <command> # >& /dev/null, tym samym komentując niepożądaną część.

+0

@ e-t172: Dobry pomysł. Zapomniałem wspomnieć o . To polecenie jest nazywane jako '> & & dev/null' – Gowtham

1

Czy można utworzyć alias dla tego polecenia? Jeśli tak, to alias do innego polecenia, które zrzuca wynik do pliku.

0

EDYCJA: To nie jest dobry pomysł i na pewno nie warto próbować, chyba że wiesz, co to może pęknąć. Działa to dla mnie, może pracować również dla ciebie.

OK, to naprawdę zły hack i prawdopodobnie nie warto tego robić. Zakładając, że żadne z pozostałych poleceń nie działa, i po prostu nie masz dostępu do pliku binarnego/aplikacji (który zawiera polecenie z /dev/null) i nie możesz przekierować wyjścia do innego pliku (zastępując /dev/null).

Następnie można usunąć/dev/null ($> rm /dev/null) i utworzyć w jego miejsce własny plik (najlepiej z miękkim łączem), do którego można skierować wszystkie dane. Kiedy skończysz, możesz ponownie utworzyć/dev/null przy użyciu następującego polecenia:

$> mknod -m 666 /dev/null c 1 3

Wystarczy być bardzo jasne, to jest zły siekać i na pewno wymaga korzeniowych uprawnienia do pracy . Duże szanse, że Twój przekierowany plik może zawierać dane z wielu innych aplikacji/plików binarnych, które są uruchomione i używać jako zlewu /dev/null.

+0

Po prostu dodałem, próbowałem tego na moim komputerze, który jest Fedorą działającą w wersji 2.6.30. Ta informacja jest taka, że ​​liczba Major i Minor może być inna dla mknod na innych platformach/środowisku. – Shrey

+0

Byłoby świetnie, gdyby "dlaczego-moja-odpowiedź-było-przegłosowane" zostało wyjaśnione jako komentarz. Wiem, że to hack (wspomina cicho wyraźnie) i to jest dokładnie to, czego szukał plakat "... ale nie mam kontroli nad ...". – Shrey

+0

Usuwanie/dev/null wykracza poza bycie hackerem. To całkowicie zepsuty pomysł. Wpływa na cały system (dowolne nowe otwiera na ścieżce), a nie tylko na docelowy skrypt/program. To musi być "naprawione" po zakończeniu. I wymaga dostępu do roota.Odpowiedź nie brzmi: "przekierowanie/dev/null", ale ponowne otwarcie istniejących deskryptorów, które zostały pierwotnie otwarte z/dev/null. –

1

Plik urządzenia /dev/tty odwołuje terminalu kontrolowania aplikacji - jeśli się nie zmieniło, to powinno działać:

freopen("/dev/tty", "w", stdout); 
freopen("/dev/tty", "w", stderr); 

Alternatywnie, można ponownie otworzyć je wskazać w pliku dziennika:

freopen("/var/log/myapp.log", "a", stdout); 
freopen("/var/log/myapp.err", "a", stderr); 
2

Twoja aplikacja prawdopodobnie uruchamia powłokę i przekazuje ją tej linii poleceń.

Musisz uruchomić skrypt napisany przez Ciebie. Ten skrypt zastąpi >/dev/null w linii komend z >>/your/log i wywoła rzeczywistą powłokę ze zmodyfikowaną linią poleceń.

Pierwszym krokiem jest zmiana powłoki używanej przez aplikację. Zmiana zmiennej środowiskowej SHELL powinno wystarczyć, to uruchomić aplikację jako

SHELL=/home/user/bin/myshell theApp 

Jeśli to nie zadziała, spróbuj na chwilę łącząc /bin/sh do skryptu.

myshell wezwie oryginalną powłokę, ale po wymianie wzorca parametrów:

#!/bin/bash 
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"} 

Coś wzdłuż tych linii powinna działać.

0

w Perl, jeśli po prostu chcesz przekierować STDOUT do czegoś nieco bardziej użyteczne, można po prostu zrobić coś takiego:

open STDOUT, '>>', '/var/log/myscript.log'; 
open STDERR, '>>', '/var/log/myscript.err'; 

na początku skryptu, i że będzie przekierować go do końca twojego skryptu.

0

Wzorując się odpowiedź e-T172, można ustawić ostatni przełącznik (lub dołączyć do niego):

; echo 
1

Może nie dokładnie przekierować, ale pozwala uzyskać wyjście gdziekolwiek to jest wysłane

strace -ewrite -p $PID

To nie jest tak czysta (pokazuje linie takie jak: write (#,)), ale działa! (i jest jednolinijkowa: D) Możesz również nie lubić faktu, że argumenty są skrócone. Aby kontrolować ten parametr -s ustawiający maksymalną długość wyświetlanych łańcuchów.

Łapie wszystkie strumienie, więc możesz chcieć to filtrować.

Można ją filtrować:

strace -ewrite -p $PID 2>&1 | grep "write(1"

pokazuje tylko deskryptor 1 połączenia. 2> & 1 to przekierowanie stderr na standardowe wyjście, domyślnie strace zapisuje na stderr.

0

Jeśli możesz umieścić coś w linii przed przekazaniem rzeczy do/dev/null (nie wiesz, czy masz do czynienia z zakodowanym na stałe poleceniem), możesz użyć tee, aby przekierować do wybranego przez siebie użytkownika.

Przykład z Wikipedii, która pozwala eskalacji polecenia:

echo "Body of file..." | sudo tee root_owned_file > /dev/null 

http://en.wikipedia.org/wiki/Tee_(command)

Powiązane problemy