Wie führe ich einen Befehl aus, bei dem sudo umgeleitet oder weitergeleitet wird?

60

Ich versuche, die Best Practices für die Verwendung von sudo anstelle des Root-Kontos zu befolgen.

Ich führe eine einfache Concat-Datei aus, wie zum Beispiel:

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

Dies schlägt fehl, da rechts neben ">>" der normale Benutzer ausgeführt wird. Das Hinzufügen zusätzlicher Sudos schlägt ebenfalls fehl (erwartetes Verhalten seit dem Weiterleiten an den Befehl sudo und nicht an die Datei).

Beispiel ist nur das, aber es wurde überprüft und unter dem Root-Konto getestet.

DarkSheep
quelle

Antworten:

75

Sie können eine neue Shell als root aufrufen:

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

Sie können auch einfach einen Prozess zum Schreiben in die Datei erhöhen:

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF
Chris Down
quelle
8
Im Allgemeinen ist die zweite Option sicherer, da nur die teeBefehle als root ausgeführt werden und nicht der Hauptbefehl, der komplex und anfällig für Fehlverhalten sein kann. (nicht der Fall von echo)
Pabouk
19

Eine andere, ebenso sichere Möglichkeit besteht darin, sich mit sudodem -iSchalter von 's als root anzumelden:

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

Dies folgt weiterhin den Best-Practice-Regeln, da das Root-Konto nicht als solches aktiviert ist, sondern Sie als Root sicher vorgehen können. Von 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. 
terdon
quelle
Eine andere Alternative istsudo bash
starbeamrainbowlabs
11

Wenn Sie Ihren Befehl ohne einfache Anführungszeichen ausdrücken, können Sie ihn in einfache Anführungszeichen setzen und über eine Zwischen-Shell ausführen.

Um dies als root auszuführen:

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

Schreiben Sie den Befehl auf eine andere Art und Weise, die nicht verwendet wird ':

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

Dann rufen Sie auf sudo sh -c …:

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

Um die Ausgabe in eine Datei zu schreiben, in die nur Root schreiben kann, rufen Sie auf sudo tee. Übergeben Sie die -aOption zum teeAnhängen an die Zieldatei, andernfalls wird die Datei abgeschnitten.

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

Für komplexere Dateiänderungen, können Sie anrufen sudo sed, sudo ed, sudo perl, ...

Verwenden Sie alternativ einen anständigen Editor und rufen Sie sudo auf. Öffnen Sie in Emacs /sudo:/etc/conf.d/hwclock. Rufen Sie :w !sudo tee %in Vim auf, um als root in die geöffnete Datei zu schreiben, oder verwenden Sie das Plugin sudo.vim . Oder geh vom sudo ende und ruf an sudoedit /etc/conf.d/hwclock.

Oder Sie können sich der dunklen Seite hingeben und eine Shell als root ausführen.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock
Gilles 'SO - hör auf böse zu sein'
quelle
5

Der Befehl schlägt aufgrund der Berechtigungen für die Datei fehl, zu der umgeleitet wird. Die Umleitung erfolgt noch bevor der sudoBefehl aufgerufen wird.

Sie müssen sicherstellen, dass es der Root ist, der die Datei zum Schreiben öffnet.

Das geht am einfachsten:

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

Das echoProgramm kann als normaler Benutzer ausgeführt werden, da nur eine Textzeichenfolge erstellt wird. Das teeDienstprogramm muss jedoch als root ausgeführt werden und tee -ahängt Daten an. Wir leiten die Ausgabe um zu, /dev/nullda teestandardmäßig die Eingabedaten auf die Standardausgabe dupliziert werden, zusätzlich zum Schreiben in die angegebenen Dateien.

Mit bashoder jeder Shell, die "Here-Strings" versteht:

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

Dies ist in der Wirkung identisch mit dem obigen. Nur die Art und Weise, wie wir die Zeichenfolge produzieren, wird geändert.


Eine andere, etwas umstrittene Art, es zu tun:

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

In diesem Fall erfolgt die Umleitung in einer sh -cuntergeordneten Shell, die als Root ausgeführt wird.

Kusalananda
quelle
4

sudo dd of=

So hängen Sie an, wie Sie möchten:

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

oder um die Datei von Grund auf neu zu erstellen:

echo inbytes | sudo dd of=outfile

Vorteile:

  • schöner als teeda keine /dev/nullumleitung
  • schöner als shda keine subshell
  • ddhat viele leistungsstarke Optionen, z. B. status=progressum den Übertragungsfortschritt zu sehen

Funktioniert, weil sudo stdin an den Befehl weiterleitet.

Ciro Santilli ist ein Schauspieler
quelle