wyjście programu tail do pliku w systemie Linux

9

Wiem, że możemy użyć poniższego formatu do przekierowania wyjścia ekranu do pliku:

$ your_program > /tmp/output.txt

Jednak gdy użyłem poniższego polecenia, napisano „-bash: /home/user/errors.txt: Odmowa uprawnień”

sudo tail /var/log/apache2/error.log > ~/errors.txt

Czy mogę wiedzieć, jak to zrobić? ~ / Error.txt nie istnieje. Czy muszę najpierw utworzyć ten plik txt, zanim użyję polecenia przekierowania?

Xianlin
źródło
1
Co się stanie, jeśli napiszesz echo hi > ~/errors.txt? Czy /home/usertwój poprawny katalog domowy (lub bash w jakiś sposób pomylił się co do tego, gdzie znajduje się twój katalog domowy)?
cjm
Czy userużytkownik, który uruchamia polecenie?
użytkownik nieznany
tak, użytkownik jest użytkownikiem, który wykonuje polecenie
Xianlin
Jest to normalne zachowanie dla sudo. sudonie zezwala na przekierowanie. zbyt wiele sposobów, aby ludzie mogli używać tego do robienia niegrzecznych rzeczy, których nie ma w sudoers.confpliku. Alternatywnie możesz uruchomić, sudo bash -c "tail /var/log/apache2/error.log > ~/errors.txt"aby zeskrobać koniec error.log do pliku w swoim katalogu domowym.
Tim Kennedy,

Odpowiedzi:

17

Sudo za fajką nie działa. Nie wiem, dlaczego nie możesz pisać do domu - może plik należy do katalogu głównego?

 sudo tail /var/log/apache2/error.log | sudo tee ~/errors.txt

Może potrzebujesz innej osoby stojącej za rurą. Na pewno nie potrzebujesz istniejącego pliku.

nieznany użytkownik
źródło
Tak, to działało ...
Xianlin,
Jeśli chodzi o problem z uprawnieniami, może $ HOME jest zamontowany w systemie plików NFS z rootquash?
Ansgar Esztermann
$ HOME nie jest zamontowany w systemie plików NFS.
Xianlin,
6

Kiedy piszesz sudo somecommand > ~/errors.txt, powłoka, która dzwoni sudo(i działa jak ty), wykonuje przekierowanie i otwieranie ~/errors.txt. Zobacz Przekierowywanie standardowego pliku do pliku, na którym nie masz uprawnień do zapisu . Zwykle problemem w tym przypadku jest to, że chcesz, aby root zapisał do pliku; zobacz powiązane pytanie, aby dowiedzieć się, jak to zrobić.

Dziwne jest to, że nie można zapisać do pliku w katalogu domowym. Możliwe, że wcześniej zapisałeś jakieś dane wyjściowe jako root /home/user/errors.txt, a ten plik już istnieje i należy do roota. Usuń plik (możesz to zrobić, dopóki masz uprawnienia do zapisu /home/user, a następnie będziesz mógł go utworzyć jako użytkownik.

rm ~/errors.txt
sudo tail /var/log/apache2/error.log > ~/errors.txt

Jeśli plik naprawdę nie istnieje, to nie masz uprawnień do zapisu w swoim katalogu domowym. Chociaż jest to technicznie możliwe i czasami przydatne dla niektórych ograniczonych użytkowników, jest to bardzo niezwykłe.

Gilles „SO- przestań być zły”
źródło
Próbowałem usunąć plik „/home/user/errors.txt” i użyć powyższego polecenia. Nie działało, wciąż zabraniam mi pisać do katalogu domowego. W każdym razie sądzę, że podany przez ciebie link może służyć jako moje rozwiązanie. To jest tak samo jak pierwsza odpowiedź w tym poście. Podałeś jednak kilka szczegółowych wyjaśnień na temat przekierowywania standardowego wejścia do pliku i dziękuję ci za to.
Xianlin