Vraag Hoe om "toestemming geweigerd" op te lossen bij het gebruik van sudo met omleiding in Bash?


Wanneer ik sudo gebruik om bewerkingen toe te staan ​​aan bestanden, krijg ik regelmatig 'toestemming geweigerd'.

Mijn muis is bijvoorbeeld zenuwachtig en traag, dus ik wil polling uitschakelen:

sudo echo "options drm_kms_helper poll=N">/etc/modprobe.d/local.conf

Ik word gevraagd om een ​​wachtwoord en krijg dan:

bash: /etc/modprobe.d/local.conf: Permission denied

Dus ik heb geprobeerd een tijdelijke wijziging uit te voeren om polling uit te schakelen door het gebruik van:

sudo echo N> /sys/module/drm_kms_helper/parameters/poll

Nogmaals reageerde het systeem met:

bash: /sys/module/drm_kms_helper/parameters/poll: Permission denied

Om het even welke ideeën?


115
2017-12-19 04:12


oorsprong




antwoorden:


Outputomleiding (via de > operator) wordt gedaan door de shell, niet door echo. Je moet inloggen als root

sudo -i

Vervolgens kunt u omleiding gebruiken

echo N> /sys/module/drm_kms_helper/parameters/poll

Anders kun je bash-string uitvoeren met sudo

sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"

124
2017-12-19 04:22



Je kunt echo niet uitvoeren met sudo? hoe zit het met het resultaat dat ik kreeg: saji@laptop:~$ sudo echo "Hi" [sudo] password for saji: Hi - saji89
je kunt in het bestand schrijven, echo "something"> somewhre. Het gebruikt pijp. Dat is het probleem. - shantanu
Ok, als dat het geval is, werk dan je antwoord bij om aan te geven dat echo-uitvoering in dat geval alleen een probleem is. - saji89
Je kunt de ingebouwde shell niet simpelweg uitvoeren echo als sudo, tenzij je zoiets doet sudo bash -c 'echo …'; POSIX-systemen leveren echter meestal een extern apparaat echo commando zoals /bin/echo op OS X, die sudo kan uitvoeren zonder rigamarole. Dus, de echo commando dat je meestal uitvoert en de echo commando dat je uitvoert met sudo zijn waarschijnlijk twee verschillende, maar vergelijkbare commando's. - kojiro
Als dat het geval is, waarom suggereren de antwoorden op deze vraag dan een echo? askubuntu.com/questions/840431/... - Harsha


De uitvoeromleiding gebeurt door de shell van waaruit de opdracht is aangeroepen. Dus, alles in stukjes breken, hier wat er aan de hand is *:

  • shell roept op sudo echo "options drm_kms_helper poll=N", die wordt uitgevoerd sudo commando met echo "options drm_kms_helper poll=N" opdrachtregel

  • sudo vraagt ​​om een ​​wachtwoord, opent de shell van superuser en roept echo "options drm_kms_helper poll=N", die wordt uitgevoerd echo opdracht om het te passeren "options drm_kms_helper poll=N"

  • echo, loopt met root privileges, drukt de tekenreeks af naar de standaarduitvoer.

  • echo commando eindigt, superuser shell exits, sudo eindigt

  • de shell van waaruit de opdracht is opgeroepen, verzamelt de uitvoer en probeert deze om te leiden naar /etc/modprobe.d/local.conf, dat alleen door root kan worden beschreven. Het krijgt de foutmelding "permission denied".

Zie @shantanu answer voor de manieren om dit op te lossen.


(*) - terwijl de bovenstaande reeks helpt om te begrijpen waarom de opdracht mislukt, gebeuren dingen in werkelijkheid enigszins niet in de juiste volgorde: de oorspronkelijke shell ziet de omleiding en probeert het bestand te openen om te schrijven voordat het wordt aangeroepen sudo ... opdracht. Bij het openen van het bestand mislukt de shell niet eens de opdracht die naar het bestand zou moeten schrijven (dank aan @PanosRontogiannis voor het wijzen van dit).

Hier is een snelle test:

$ touch ./onlyroot.txt
$ sudo chown root:root ./onlyroot.txt
$ sudo bash -c "whoami | tee who.txt" > onlyroot.txt
bash: onlyroot.txt: Permission denied

In de test hierboven whoami | tee who.txt ging een bestand met de naam maken who.txt met het woord "root". Wanneer de uitvoeromleiding mislukt in de aanroepende shell, ontbreekt het bestand "who.txt" ook omdat de opdracht niet is aangeroepen.


71
2017-12-19 05:19



Het is waarschijnlijker dat de shell zelf 'opschrijft' en probeert /etc/modprobe.d/local.conf te openen voordat sudo wordt 'uitgeprobeerd', wat betekent dat de eerste 4 stappen die je beschrijft nooit daadwerkelijk plaatsvinden omdat het bestand niet kan worden geopend. - Panos Rontogiannis
@PanosRontogiannis: bedankt, ik heb het antwoord bijgewerkt - Sergey


Toevoegen aan het antwoord van Shantanu:

... Of je zou een a kunnen gebruiken tee commando als volgt:

sudo tee /sys/module/drm_kms_helper/parameters/poll <<<10

of als het de uitvoer van een opdracht is:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll

55
2017-12-19 06:50



+1 inloggen als root is een slecht idee voor handmatig werk, en a werkelijk slecht idee voor scripttaken. - l0b0
Ook, sudo tee /sys/module/drm_kms_helper/parameters/poll > /dev/null als u niet wilt dat er wordt afgedrukt stdout ook. - Fabian Tamp


Een benadering die ik hier niet heb genoemd, is om gewoon de volledige commandoregel in zijn eigen shell uit te voeren. De sudo manpage zelf geeft een voorbeeld van deze aanpak:

Om een ​​gebruiklijst van de mappen in de / home-partitie te maken. Merk op dat dit de commando's in een sub-shell uitvoert om de cd- en bestandsomleiding te laten werken.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"

13
2017-12-19 13:53





sudo dd of=

Om toe te voegen zoals je wilt:

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

of om het bestand opnieuw te maken:

echo inbytes | sudo dd of=outfile

voordelen:

  • beter dan tee sinds nee /dev/null redirection
  • beter dan sh omdat er geen expliciete subshell is (maar een impliciete voor de omleiding)
  • dd heeft veel krachtige opties, bijvoorbeeld status=progress om de voortgang van de overdracht te bekijken

Werkt omdat sudo de opdracht doorstuurt naar stdin.


3
2018-05-28 06:39



Dit is goed. We denken aan dd zoals hoe we onze eens zo goede bestandssystemen overschrijven, en we realiseren ons niet dat het ook voor alledaagse taken is - en dat andere commando's als root ook grote schade aanrichten als ze op de verkeerde bestanden / apparaten worden gebruikt. Graag willen sudo tee, sudo dd zal natuurlijk ook werken met hier snarenbijvoorbeeld sudo dd of=outfile <<<'hello world'. [Bedankt voor het bewerken. NB met sh -c 'cmd', sh is een subproces dat een shell is, maar niet echt een subshell behalve in die zin alle externe opdrachten beginnen als één.] - Eliah Kagan


Een andere optie is om een ​​tijdelijk bestand te gebruiken. Dit is handig in een bash-script.

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever

2
2017-07-29 15:51