Dano mi dostęp do sudo na jednym z naszych pakietów programistycznych RedHat i wydaje mi się, że dość często muszę przekierowywać dane wyjściowe do lokalizacji, do której normalnie nie mam dostępu do zapisu.
Problem w tym, że ten wymyślony przykład nie działa:
sudo ls -hal /root/ > /root/test.out
Właśnie otrzymałem odpowiedź:
-bash: /root/test.out: Permission denied
Jak mogę to uruchomić?
root
(w takim przypadku czytaj dalej odpowiedzi), ale bardzo często po prostu musisz utworzyć plik gdzieś indziej, jak sam.Odpowiedzi:
Twoje polecenie nie działa, ponieważ przekierowanie jest wykonywane przez twoją powłokę, która nie ma uprawnień do pisania
/root/test.out
. Przekierowanie wyjścia nie jest wykonywane przez sudo.Istnieje wiele rozwiązań:
Uruchom powłokę z sudo i wydaj komendę, używając
-c
opcji:Utwórz skrypt za pomocą swoich poleceń i uruchom ten skrypt za pomocą sudo:
Uruchom
sudo ls.sh
. Zobacz Steve Bennett odpowiedź , jeśli nie chcesz utworzyć pliku tymczasowego.Uruchom powłokę, a
sudo -s
następnie uruchom polecenia:Użyj
sudo tee
(jeśli musisz często uciekać podczas korzystania z-c
opcji):Przekierowanie do
/dev/null
jest potrzebne, aby zatrzymać wyświetlanie tee na ekranie. Aby dołączyć zamiast zastąpić plik wyjściowy (>>
), użyjtee -a
lubtee --append
(ostatni jest specyficzny dla coreutils GNU ).Dziękujemy Jd , Adamowi J. Forsterowi i Johnathanowi za drugie, trzecie i czwarte rozwiązanie.
źródło
perl -e 'print "STDIN\n"; print STDERR "STDERR\n"; ' > >( tee stdout.log ) 2> >( tee stderr.log >&2 )
Ktoś tutaj zaproponował właśnie koszulkę sudoing:
Można to również wykorzystać do przekierowania dowolnego polecenia do katalogu, do którego nie masz dostępu. Działa, ponieważ program tee jest w rzeczywistości programem „echa do pliku”, a przekierowanie do / dev / null ma za zadanie zatrzymać wyświetlanie go również na ekranie, aby pozostało takie samo jak w oryginalnym wymyślonym powyżej przykładzie.
źródło
sudo
(tj. Dla samego polecenia) może zostać pominiętySztuczka, którą sam sobie wymyśliłem
źródło
sudo dd
jest lepszy niżsudo tee /root/file > /dev/null
powyższe przykłady!dd
to nazwa polecenia,of=/root/test.out
argument, który mówi,dd
co to są pliki wyjściowe.of
oznacza plik wyjściowy idd
jest bardzo popularnym narzędziem używanym zarówno w systemie Linux, jak i OSX (głównie do zapisywania obrazów na dyskach). To na pewno fajna sztuczka.dd
jest prawdopodobnie równie przydatny jaktee
tutaj. W obu przypadkach używasz wspólnego, dobrze znanego polecenia w celu, który - choć nieco różni się od pierwotnego zamierzonego celu - jest nadal dobrze znany i dobrze udokumentowany. Chociażdd
jest dobry w kopiowaniu dużych ilości danych, nie zasysa niewielkich ilości. Ma tę zaletę, że nie przypomina echa wyjścia również standardowego.sudo dd
obok siebie, chcesz być bardzo, bardzo pewien, że następujące argumenty są poprawne (szczególnie biorąc pod uwagę jego niestandardową składnię). Nie bez powodu nazywają to „niszczycielem dysków”Problem polega na tym, że polecenie zostaje uruchomione
sudo
, ale przekierowanie jest uruchamiane przez użytkownika. Robi to powłoka i niewiele można na to poradzić.Zwykłe sposoby na obejście tego są:
Zawiń polecenia w skrypt, który wywołujesz w sudo.
Jeśli komendy i / lub plik dziennika ulegną zmianie, skrypt może traktować je jako argument. Na przykład:
Wywołaj powłokę i przekaż wiersz poleceń jako parametr za pomocą
-c
Jest to szczególnie przydatne w przypadku jednorazowych poleceń złożonych. Na przykład:
źródło
Kolejna odmiana na temat:
Lub oczywiście:
Mają (małe) tę zaletę, że nie trzeba pamiętać żadnych argumentów
sudo
lubsh
/bash
źródło
Wyjaśniono nieco, dlaczego preferowana jest opcja tee
Zakładając, że masz odpowiednie uprawnienia do wykonania polecenia, które tworzy dane wyjściowe, jeśli potokujesz dane wyjściowe swojego polecenia do tee, wystarczy jedynie podnieść uprawnienia tee za pomocą sudo i skierować tee do zapisu (lub dołączenia) do danego pliku.
w przykładzie podanym w pytaniu oznaczałoby to:
kilka praktycznych przykładów:
W każdym z tych przykładów pobierasz dane wyjściowe nieuprzywilejowanego polecenia i zapisujesz do pliku, który zwykle jest zapisywalny tylko przez root, który jest źródłem twojego pytania.
Warto to zrobić w ten sposób, ponieważ polecenie generujące dane wyjściowe nie jest wykonywane z podwyższonymi uprawnieniami. Wydaje się, że nie ma to znaczenia,
echo
ale gdy polecenie źródłowe jest skryptem, któremu nie całkowicie ufasz, jest to bardzo ważne.Zauważ, że możesz użyć opcji -a, aby dodać lub dołączyć
>>
plik docelowy (jak ) do pliku docelowego, zamiast go zastąpić (jak>
).źródło
Niech sudo uruchomi powłokę, tak jak to:
źródło
Chciałbym poradzić sobie z tym problemem:
Jeśli musisz zapisać / zamienić plik:
Jeśli chcesz dołączyć do pliku:
źródło
Co powiesz na napisanie skryptu?
Nazwa pliku: myscript
Następnie użyj sudo, aby uruchomić skrypt:
źródło
Ilekroć muszę zrobić coś takiego, po prostu się rootuję:
To chyba nie najlepszy sposób, ale działa.
źródło
Zrobiłbym to w ten sposób:
źródło
su
):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'
init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411)
Nie znaczy pokonać martwego konia, ale nie ma zbyt wiele odpowiedzi tutaj zastosowanie
tee
, co oznacza, że trzeba przekierowaćstdout
do/dev/null
chyba że chcesz zobaczyć kopię na ekranie.Prostszym rozwiązaniem jest
cat
takie użycie :Zwróć uwagę, w jaki sposób przekierowanie jest umieszczane w cudzysłowach, aby było oceniane przez powłokę uruchomioną przez
sudo
zamiast uruchomionej.źródło
sudo bash -c "ls -hal /root > /root/test.out"
. Użycie koszulki pozwala uniknąć konieczności używania skorupy, podczas gdy kot nie.Jest to oparte na zaangażowanej odpowiedzi
tee
. Aby to ułatwić, napisałem mały skrypt (nazywam gosuwrite
) i wstawiłem/usr/local/bin/
za+x
zgodą:Jak pokazano w USAGE w kodzie, wszystko, co musisz zrobić, to przesłać dane wyjściowe do tego skryptu, a następnie żądanej nazwy pliku dostępnej dla superużytkownika, aw razie potrzeby automatycznie wyświetli monit o podanie hasła (ponieważ zawiera
sudo
).Zauważ, że ponieważ jest to proste opakowanie
tee
, zaakceptuje również-a
opcję dołączenia tee , a także obsługuje zapis do wielu plików jednocześnie.Ma również uproszczoną ochronę przed zapisem na
/dev/
urządzeniach, co było problemem wspomnianym w jednym z komentarzy na tej stronie.źródło
Może dostałeś sudo dostęp tylko do niektórych programów / ścieżek? W takim razie nie ma możliwości robienia tego, co chcesz. (chyba że jakoś go zhakujesz)
Jeśli tak nie jest, być może możesz napisać skrypt bash:
Naciśnij ctrl+ d:
Mam nadzieję, że to pomoże.
źródło
źródło
sudo
tak,at
to nie jest przydatne ani konieczne.sudo sh -c 'echo test >/tmp/test.out'
robi to samo znacznie bardziej wydajnie i elegancko (ale wciąż ma wadę, że prawdopodobnie uruchamiasz rzeczy,root
które nie potrzebują tego uprawnienia; na ogół powinieneś unikać uprzywilejowanych poleceń, kiedy możesz).