Piszę regularnie skompilowaną aplikację, która musi utworzyć specjalny plik i zapisać w nim magiczne ciasteczko. Nie mogę zapisać pliku bezpośrednio z aplikacji, model bezpieczeństwa systemu wymaga ode mnie uruchomienia narzędzia pomocniczego o podwyższonych uprawnieniach. Mogę podać dowolną liczbę argumentów do narzędzia pomocnika. Teraz chciałbym wybrać bardzo proste polecenie systemowe, które posłuży jako narzędzie pomocnicze i utworzy plik dla mnie. Coś takiego:
/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"
Simple touch
nie tnie go, ponieważ muszę zapisać plik cookie w pliku, prosty echo
bez opakowania powłoki nie działa, ponieważ wymaga przekierowania, aby zapisać plik. Nie czuję się dobrze wzywając powłokę z uprawnieniami roota, aby wykonać tak trywialne zadanie. Czy jest jakieś naprawdę proste, ograniczone polecenie systemowe, które mógłbym wywołać, aby napisać plik dla mnie?
/bin/sh -c 'echo magic > /path/to/magic/file'
nie działa? Byłby to plik wykonywalny i dwa argumenty. Będziesz musiał zbudować ostatni argument jako ciąg znaków (z sprintf lub odpowiednikiem). Czy istnieje powód, dla którego to nie działałoby dla Ciebie? Z twojego pytania wynika, że doCommandAsRoot () nie pobiera danych wejściowych do strumienia do polecenia, prawda? W przeciwnym razie możesz zastąpić ostatni argument'cat > /path/to/magic/file'
i przekazać dane zamiast budować ciąg.tee
. Dzięki!Odpowiedzi:
Co powiesz na to:
Jasne, że są w tym przekierowania, ale tylko tee działa jako root, a nie shell. Działa
dd of=...
również z .źródło
doCommandAsRoot
). Ta funkcja akceptuje tylko ścieżkę do polecenia i jego argumentów, więc nie mogę od razu użyć przekierowania wyjściowego. Mógłbym przejść przez powłokę (jak pokazano w pytaniu), ale nie podoba mi się to pod względem bezpieczeństwa.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
Przykładem jest dość blisko tego, co chcę, dziękuję. Czy możesz wymyślić coś jeszcze prostszego?cp
lubmv
zamiastdd
.Bez przekierowania danych wyjściowych, bez potoku, ale z ciągiem „tutaj”:
źródło
status=none
stłumi wszystkie inne dane wyjściowe z nowoczesnych wersji jąder GNUdd
.Jest jeszcze jedna uwaga: nie chcesz umieszczać wartości magicznego ciasteczka w wierszu poleceń, ponieważ inni użytkownicy mogą to zaobserwować. Nawet jeśli program jest krótkotrwały (w tym jeśli program zeruje ciąg wiersza poleceń), istnieje możliwość ataku. Więc teoretyczna:
jest niebezpiecznym podejściem. Dlatego popieram sugestię @ stribika: zapisz wartość do pliku tymczasowego i skopiuj na miejsce. Upewnij się, że korzystasz z bezpiecznej funkcji, aby utworzyć plik tymczasowy (
mkstemp()
), aby nie było tam również warunków wyścigu.źródło
gąbka z moreutils - wchłoń standardowe wejście i zapisz do pliku:
W przeciwieństwie do przekierowania powłoki, gąbka wchłania wszystkie dane wejściowe przed zapisaniem pliku wyjściowego. Jeśli to możliwe, gąbka tworzy lub aktualizuje plik wyjściowy atomowo, zmieniając nazwę pliku tymczasowego na swoje miejsce.
Zobacz więcej
źródło