Hogyan lehet megoldani az "engedélyt megtagadni", ha a sudo-t a Bash átirányítással használod?

117

Amikor a sudo-t használod a fájlok szerkesztéséhez, rendszeresen megkapod az "engedélyt megtagadni".

Például az én egér ideges és lassú, ezért le szeretném tiltani a lekérést:

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

Jelszóra van szükséged, majd kapsz:

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

Így próbáltam átmenetileg módosítani a lekérés letiltását a következő használatával:

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

Még egyszer a rendszer válaszolt:

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

Bármely ötlet?

    
készlet Jack 19.12.2012 05:12
forrás

6 válasz

127

A kimeneti átirányítás (a> operátoron keresztül) a shell, nem pedig a echo . Be kell jelentkeznie rootként

sudo -i

Ezután átirányítást használhat

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

Ellenkező esetben futtathat bash sztringet a sudo

paranccsal
sudo bash -c "echo N> /sys/module/drm_kms_helper/parameters/poll"
    
válasz adott shantanu 19.12.2012 05:22
forrás
71

A kimeneti átirányítást az shell, amelyről a parancsot meghívták . Tehát mindent áttörünk bitekre, itt mi történik *:

  • shell meghívja asudo echo "options drm_kms_helper poll=N" parancsot, amelysudo parancsot futtat aecho "options drm_kms_helper poll=N" parancssorral

  • A sudo felkéri a jelszót, megnyitja a superuser shell parancsot, ésecho "options drm_kms_helper poll=N" -ra hívja fel aecho parancsot."options drm_kms_helper poll=N"

  • echo, fut aroot jogosultságokkal, kinyomtatja a karakterláncot a szabvány kimenetre.

  • echo parancs befejeződik, a superuser shell kilép,sudo befejeződik

  • a meghajtó, amelyről a parancsot meghívták, összegyűjti a kimenetet és megpróbálja átirányítani a/etc/modprobe.d/local.conf -ra, amit csak a root írhat. Az "engedély megtagadva" hibát kap.

A javítás módjait lásd: @shantanu válasz.

(*) - míg a fenti szekvencia segít megérteni a parancs sikertelenségét, a valóságban a dolgok némileg eltűnnek: az eredeti shell észleli az átirányítást és megpróbálja megnyitni a fájlt az íráshoz, mielőtt asudo ... parancs. A fájl megnyitásakor sikertelennek bizonyul, a héj még a parancsfájlba (a @PanosRontogiannis-nek köszönhetően) nem hivatkozik.

Itt van egy gyors teszt:

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

A fenti tesztben awhoami | tee who.txt létrehozta awho.txt nevű fájlt, amely a "root" szót tartalmazza. Ha azonban a kimenő átirányítás sikertelen a hívóhéjban, akkor a "who.txt" fájl is hiányzik, mert a parancs nem lett meghívva.

    
válasz adott Sergey 19.12.2012 06:19
forrás
55

Hozzáadás Shantanu válaszához:

... Vagy használhat egy tee parancsot, mint ez:

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

vagy a parancs kimenete:

echo 10 | sudo tee /sys/module/drm_kms_helper/parameters/poll
    
válasz adott Untitled 19.12.2012 07:50
forrás
13

Az itt nem említett megközelítés az, hogy egyszerűen végrehajtja az egész parancssort saját héjában. Asudo manpage maga példázza ezt a megközelítést:

  

A / home partícióban található könyvtárak használatának felsorolása. Ne feledje, hogy ez a parancsokat egy alhéjban futtatja, hogy a cd és a fájl átirányítása működjön.

$ sudo sh -c "cd /home ; du -s * | sort -rn > USAGE"
    
válasz adott kojiro 19.12.2012 14:53
forrás
3

sudo dd of=

A hozzáillesztéshez:

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

vagy a fájl újraindításához:

echo inbytes | sudo dd of=outfile

Előnyök:

  • szebb minttee, mivel nincs/dev/null átirányítás
  • szebb, mint ash, mivel nincs kifejezett alsó támasz (de az átirányításra egy implicit)
  • A (z)dd számos erőteljes lehetőséggel rendelkezik, pl. status=progress az átviteli előrehaladás megtekintéséhez

Működik, mert a sudo továbbítja a parancsot.

    
forrás
2

Egy másik lehetőség egy ideiglenes fájl használata. Ez hasznos a bash szkriptben.

temp=$(mktemp)
echo "Hello, world!" > $temp
sudo cp $temp /etc/wherever
    
válasz adott user545424 29.07.2014 17:51
forrás