Jak dodać wiersz do pliku, który ma tylko uprawnienia do zapisu roota i kontynuować wykonywanie skryptu

9

Próbuję nauczyć się skryptowania bash. Pracuję nad praktycznym problemem i w pewnym momencie muszę dodać wiersz do pliku, który wymaga rootpozwolenia na zapis.

Kod wygląda następująco:

# some code
echo "add this line to the code" >> fileName
# some code

Czy jest możliwe, aby w jakiś sposób skrypt poprosił o hasło roota, zweryfikował hasło i po udanym uwierzytelnieniu zmodyfikował plik? Skrypt powinien następnie powrócić do trybu użytkownika i kontynuować wykonywanie polecenia.

Alex
źródło

Odpowiedzi:

13

Na stronie podręcznika znajduje się wskazówka, sudoktóra wyjaśnia, jak zrobić coś takiego. Oto moja linijka:

#!/usr/bin/bash
sudo sh -c "echo \"add this line to the code\" >> fileName"

Oczywiście najpierw musisz skonfigurować użytkownika, aby miał sudouprawnienia. shPowłoka jest stosowany ze względu na przekierowanie do pliku głównego własnością. Musiałem także uciec od cytatów użytych dla echopolecenia.

SigueSigueBen
źródło
2

su jest dostępny na większości systemów uniksowych i powinien działać:

su root -c 'echo "add this line to the code" >> fileName'
cud173
źródło
W przeciwieństwie do sudohaseł nie wydaje się, aby były buforowane su.
Ryne Everett
@Ryne Everett: Nie znam sudo. Ale zachowanie „su” jest tak naprawdę potrzebne scenariuszowi OP. Przez większość czasu używam „su” na odwrót: zmiana z roota na innego użytkownika. W takim przypadku hasło nie jest potrzebne.
miracle173
1

Możesz użyć teez sudo:

echo "add this line to the code" | sudo tee -a filename > /dev/null

echowyjście jest przekierowywane za pomocą |( potoku ) do sudo tee. w tym przypadku teeodczytuje ze standardowego wejścia i zapisuje na standardowe wyjście dowolny plik filename. -a(lub --append) teedodaje do plików, bez których pliki zostałyby nadpisane. Po teeuruchomieniu sudootwiera pliki z uprawnieniami administratora. Wreszcie, > /dev/nulltłumi teewyjście na standardowe wyjście .

Jedną z zalet używania teezamiast uruchamiania całego polecenia, w tym przekierowania z su -club, sudo sh -cjest to, że nie trzeba w żaden sposób zmieniać cytowania początkowego polecenia (cytowanie wierszy już zawierających cudzysłowy może czasami być dość brzydkie).

Adaefon
źródło
0

Wypróbuj To polecenie jest dostępne w systemach Unix i Linux.

sudo sh -c "echo 'add this line to the code' >> fileName"

JongYoung
źródło
-2

Zrobiłby lewę:

ssh host "sudo su root -c 'echo "add this line to the code" >> /etc/hosts'"
użytkownik1934677
źródło
Dlaczego ssh? Nie trzeba susię sudoani zrobić trzeba określić root, jak to jest domyślnie. Podsumowując, byłoby trochę więcej wyjaśnień, ponieważ OP chciał się czegoś nauczyć, a nie tylko rozwiązać problem.
Adaephon
Myślę, że
wpadniesz