Jak uruchomić polecenie obejmujące przekierowywanie lub przesyłanie potokowe za pomocą sudo?


60

Staram się postępować zgodnie z najlepszymi praktykami korzystania z sudo zamiast konta root.

Korzystam z prostej operacji pliku concat, takiej jak:

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Nie udaje się to po prawej stronie „>>”, działa jak zwykły użytkownik. Dodanie dodatkowych sudos również kończy się niepowodzeniem (oczekiwane zachowanie od pipowania do polecenia sudo, a nie do pliku).

Przykład jest właśnie taki, ale został zweryfikowany i przetestowany na koncie root.

Odpowiedzi:


75

Możesz wywołać nową powłokę jako root:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Możesz także podnieść proces zapisu do pliku:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
Ogólnie rzecz biorąc, druga opcja jest bardziej bezpieczna, ponieważ tylko teepolecenia działają jako root, a nie główne polecenie, które może być złożone i podatne na niewłaściwe zachowanie. (nie przypadek echo)
pabouk

19

Inną opcją, równie bezpieczne, jest użycie sudo„s -iprzełączyć się zalogować jako root:

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Nadal jest to zgodne z zasadami najlepszych praktyk, ponieważ konto root nie jest tak naprawdę włączone jako takie, ale umożliwia bezpieczne wykonywanie operacji root. Od man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

Inną alternatywą jestsudo bash
starbeamrainbowlabs,

11

Jeśli wyrazisz swoje polecenie bez pojedynczych cudzysłowów, możesz umieścić je w pojedynczych cudzysłowach i wykonać je za pomocą powłoki pośredniej.

Aby wykonać to jako root:

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

Napisz polecenie w inny sposób, który nie używa ':

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

Następnie wywołaj sudo sh -c …:

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

Alternatywnie, aby zapisać dane wyjściowe w pliku, do którego tylko root może zapisywać, wywołaj sudo tee. Przekaż -aopcję teedołączania do pliku docelowego, w przeciwnym razie plik zostanie obcięty.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

W przypadku bardziej skomplikowanych modyfikacji plików, można zadzwonić sudo sed, sudo ed, sudo perl, ...

Alternatywnie, użyj porządnego edytora i spraw, aby zadzwonił do sudo. W Emacs otwórz /sudo:/etc/conf.d/hwclock. W Vimie wywołaj, :w !sudo tee %aby zapisać do otwartego pliku jako root, lub użyj wtyczki sudo.vim . Lub przejdź od końca sudo i zadzwoń sudoedit /etc/conf.d/hwclock.

Lub możesz poddać się ciemnej stronie i uruchomić powłokę jako root.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

Polecenie kończy się niepowodzeniem z powodu uprawnień do przekierowanego pliku. Przekierowanie odbywa się nawet przed sudowywołaniem polecenia.

Musisz upewnić się, że to root faktycznie otwiera plik do zapisu.

Najprostszy sposób to zrobić:

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echoMożna uruchomić jako zwykły użytkownik was jak to tylko wytwarza ciąg tekstowy. teeNarzędzie to będzie musiał uruchomić jako root, choć i tee -adoda dane. Przekierowujemy dane wyjściowe, /dev/nullponieważ teedomyślnie będą kopiować dane wejściowe na standardowe dane wyjściowe oprócz zapisu do wskazanych plików.

Z bashlub jakąkolwiek powłoką, która rozumie „ciągi znaków”:

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

Jest to identyczne z powyższym. Zmienia się tylko sposób produkcji łańcucha.


Kolejny, nieco okrężny sposób:

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

Przekierowanie odbywa się w ramach sh -cpowłoki podrzędnej działającej jako root.


4

sudo dd of=

Aby dołączyć, jak chcesz:

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

lub aby odtworzyć plik od zera:

echo inbytes | sudo dd of=outfile

Zalety:

  • ładniejsze niż teebez /dev/nullprzekierowania
  • ładniejsze niż shodkąd brak podpowłoki
  • ddma wiele zaawansowanych opcji, np. status=progressaby zobaczyć postęp transferu

Działa, ponieważ sudo przekazuje stdin do polecenia.

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.