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.

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.


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'

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).


0

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

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


-2

Zrobiłby lewę:

ssh host "sudo su root -c 'echo "add this line to the code" >> /etc/hosts'"

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.