Jak wysłać wszystkie dane wyjściowe do `logger` w powłoce POSIX?
10
Chciałbym, aby zalogować standardowego wyjścia i standardowego błędu oddzielnie w .xprofileużyciu logger. Myślę, że w Bash wyglądałoby to mniej więcej tak:
(Spowoduje to również zapisanie każdego błędu z instancji stdout programu rejestrującego do instancji stderr. Można tego uniknąć dzięki dodatkowemu tasowaniu deskryptorów plików.)
Jeśli chcesz, aby powłoka nadrzędna zakończyła działanie, nawet jeśli loggerprocesy nadal działają, umieść &na końcu loggerwywołań.
To pojawi się w syslog jako dwa wpisy (out & err) dla całego skryptu. Przykład w pytaniu będzie miał jeden (lub dwa) wpisy na polecenie.
DarkHeart
@DarkHeart Nie rozumiem twojego komentarza. Kod w pytaniu i oba proponowane przeze mnie rozwiązania uruchamiają tę samą liczbę instancji loggeri przekazują te same dane wejściowe każdemu z nich.
... co robi to samo, tyle że pozwala mktempwybrać nazwę pliku dla ciebie. Działa to, ponieważ podstawianie procesów w żadnym wypadku nie jest magiczne i działa w bardzo podobny sposób jak zastępowanie poleceń . Zamiast wymieniać ekspansję z wartością polecenia uruchomienia w nim jako podstawienie komenda robi, podstawienie proces zastępuje go z nazwą łącza systemu plików, gdzie można znaleźć wyjście.
Podczas gdy powłoka POSIX nie zapewnia bezpośredniego następstwa takiej rzeczy, emulowanie jej jest bardzo proste. Wszystko, co musisz zrobić, to utworzyć plik, wydrukować jego nazwę do standardu z podstawienia polecenia, a w tle tego samego polecenia uruchomić polecenie, które wyświetli się w tym pliku. Teraz możesz po prostu przekierować na wartość tego rozszerzenia - dokładnie tak, jak w przypadku zastępowania procesów. I tak powłoka POSIX zapewnia wszystkie narzędzia, których potrzebujesz, oczywiście - wystarczy, abyś użył ich w sposób, który ci odpowiada.
Obie powyższe wersje zapewniają, że niszczą łącze systemu plików do tworzonych / używanych przez siebie potoków, zanim jeszcze z nich skorzystają. Oznacza to, że po tym fakcie nie jest wymagane czyszczenie, a co ważniejsze, ich strumienie są dostępne tylko dla procesów, które je początkowo otwierają - a zatem ich łącza do systemu plików nie mogą być użyte jako sposób na szpiegowanie / przejęcie kontroli nad logowaniem. Pozostawienie linków fs w systemie plików stanowi potencjalną lukę w zabezpieczeniach.
Innym sposobem jest owinięcie go. Można to zrobić z poziomu skryptu.
@ l0b0 - Właśnie zamierzam zaktualizować inny tego typu ... Jest to bardziej ogólny cel i wreszcie udało mi się dać mu możliwość obsługi niektórych opcji związanych z deskryptorami / plikami we / wy.
mikeserv
@ l0b0 - jeśli chciał użyć mktempi innych niestandardowych poleceń, może to być: _log()( p=; mkfifo "${p:=$(mktemp -u)}"; printf %s "$p"; exec <&- >&- <>/dev/null >&0; { rm "$p"; logger --priority user."$1" --tag "${0##*/}"; } <"$p" &). Napisałem go używając w pełni przenośnego języka poleceń na wszystkie sposoby - z wyjątkiem twojego własnego. Ponadto basenamenie jest bardzo użytecznym narzędziem. "${0##*/}"jest bardziej solidny i szybszy.
mikeserv
Zmieniłem to, ponieważ potrzebuję go tylko do pracy na nowoczesnych platformach; Głównym problemem było to, że .xprofilema być wykonany z sh.
l0b0
1
@Wildcard - za chwilę, a ja postaram się rozwiązać pierwszą część pytania, ale odpowiedź na drugą odpowiedź brzmi tak: przypadek na krawędzi jest zshwłączony w / multios. Co do pierwszej części: { this; can\'t; happen; before; } < this. To pomaga?
logger
i przekazują te same dane wejściowe każdemu z nich.Zastępowanie komend / procesów POSIX
Powinieneś być w stanie używać takich jak:
Oto wersja, która korzysta z
mktemp
polecenia:... co robi to samo, tyle że pozwala
mktemp
wybrać nazwę pliku dla ciebie. Działa to, ponieważ podstawianie procesów w żadnym wypadku nie jest magiczne i działa w bardzo podobny sposób jak zastępowanie poleceń . Zamiast wymieniać ekspansję z wartością polecenia uruchomienia w nim jako podstawienie komenda robi, podstawienie proces zastępuje go z nazwą łącza systemu plików, gdzie można znaleźć wyjście.Podczas gdy powłoka POSIX nie zapewnia bezpośredniego następstwa takiej rzeczy, emulowanie jej jest bardzo proste. Wszystko, co musisz zrobić, to utworzyć plik, wydrukować jego nazwę do standardu z podstawienia polecenia, a w tle tego samego polecenia uruchomić polecenie, które wyświetli się w tym pliku. Teraz możesz po prostu przekierować na wartość tego rozszerzenia - dokładnie tak, jak w przypadku zastępowania procesów. I tak powłoka POSIX zapewnia wszystkie narzędzia, których potrzebujesz, oczywiście - wystarczy, abyś użył ich w sposób, który ci odpowiada.
Obie powyższe wersje zapewniają, że niszczą łącze systemu plików do tworzonych / używanych przez siebie potoków, zanim jeszcze z nich skorzystają. Oznacza to, że po tym fakcie nie jest wymagane czyszczenie, a co ważniejsze, ich strumienie są dostępne tylko dla procesów, które je początkowo otwierają - a zatem ich łącza do systemu plików nie mogą być użyte jako sposób na szpiegowanie / przejęcie kontroli nad logowaniem. Pozostawienie linków fs w systemie plików stanowi potencjalną lukę w zabezpieczeniach.
Innym sposobem jest owinięcie go. Można to zrobić z poziomu skryptu.
To w zasadzie pozwoliłoby twojemu skryptowi wywoływać się, jeśli jeszcze tego nie zrobił, i uruchomić katalog roboczy w temp.
źródło
mktemp
i innych niestandardowych poleceń, może to być:_log()( p=; mkfifo "${p:=$(mktemp -u)}"; printf %s "$p"; exec <&- >&- <>/dev/null >&0; { rm "$p"; logger --priority user."$1" --tag "${0##*/}"; } <"$p" &)
. Napisałem go używając w pełni przenośnego języka poleceń na wszystkie sposoby - z wyjątkiem twojego własnego. Ponadtobasename
nie jest bardzo użytecznym narzędziem."${0##*/}"
jest bardziej solidny i szybszy..xprofile
ma być wykonany zsh
.zsh
włączony w / multios. Co do pierwszej części:{ this; can\'t; happen; before; } < this
. To pomaga?