[bash | premission denied fstab | ubuntu system]

Permalänk
Medlem

[bash | premission denied fstab | ubuntu system]

Hej!

sitter och bygger ett enkelt bash script för att lägga till lokal delade diskar i fstab för auto mount.
har lyckas med allt förutom att tmp.txt (filen som innehåller det som ska in i fstab) bli pipat in i fstab så här ser mitt försök ut hittils:

cat tmp.txt >> /etc/fstab rm tmp.txt

och det är de sker en premission denied.

någon som har något tips på detta? tack för svar!

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

så här ser innehållet i tmp.txt ut:

echo "//$ip/$folder /mnt/Disk cifs credentials=/home/$username/.smbcredentials,uid=$UserID,gid=$GrpID 0 0" >> tmp.txt

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Medlem

Du får premission denied för att du försöker skriva till en fil som ditt användarkonto inte har skrivrättigheter till. Du behöver använda sudo för att låta root-kontot skriva till fstab.

Du kan antingen köra ditt skript som root, via exempelvis: sudo ./mitt_script.sh

Eller så kan du göra så att ditt skript använder sudo och frågar efter lösenord.
Men, om du kör: sudo cat tmp.txt >> /etc/fstab
Så körs endast cat tmp.txt som root, och skrivningen till fstab från det konto du körde skriptet ifrån.

Det finns många lösningar. Jag brukar föredra sudo sh -c eller sudo bash -c, för att köra hela kommandon som root.
Exempelvis: sudo sh -c "cat tmp.txt >> /etc/fstab"
Eller om du kör scriptet via dubbelklick från nautilus och inte vill mata in lösenordet via terminal så kan du använda gksudo.
Exempelvis: gksudo sh -c "cat tmp.txt >> /etc/fstab"

Permalänk
Medlem

Hitta min lössning med hjälp av denna link.

Visa signatur

Смерть -это решение всех проблем. Нет человека - нет проблемы
Comp1: Ubuntu 16.04 Comp2: Arch Linux
Comp3: Ubuntu Server 16.04 Comp4: Centos 6.5
Comp5: Linux mint 16 Comp6: Raspberry pi (olika OS hela tiden)
Phone: Motorola Google Nexus 6

Permalänk
Hedersmedlem
Skrivet av Mejan:

Hitta min lössning med hjälp av denna link.

Skulle också ha rekommenderat en `tee`-lösning. En fördel är att man begränsar privilegieeskaleringen till det steg där den faktiskt behövs. I detta fall spelar det ingen större roll, men låt säga att man skulle vilja ha output från ett skript att pipea vidare: då är det inte önskvärt att köra hela skriptet som `root` om det går att undvika.

En annan sak att nämna är att `cat` i stort sett aldrig är varken bra eller nödvändigt att använda till detta ändamål. Använder man `cat` så behöver man starta en extra process bara för att skyffla data vidare, när skalet som redan körs mycket lättare kan presentera dessa direkt via omdirigering (program som `grep`/`sed`/`awk`/`wc`/etc. kan dessutom ta ett filnamn som direkt argument). Här skulle man exempelvis kunna köra:

sudo tee -a /etc/fstab < tmp.txt

eller om man tycker ovanstående ser bakvänt ut:

< tmp.txt sudo tee -a /etc/fstab

Jag tycker personligen att det första är tydligare, men det är bara en vanesak.

Detta är effektivare och använder skalet till vad det är till för. I detta fall är prestandaskillnaden säkerligen inte märkbar, men det finns likväl ingen anledning att lära sig olater . Det hindrar också tidigt framtida dåliga konstruktioner som `for i in $(cat minfil); do` (mellanslag och mer exotiska tecken kommer en dag bita den som skriver sådant, och dessutom kan man braka in i `ARG_MAX`-taket om man inte har koll på `minfil`) och att gå i fällor som kan illustreras av `cat minfil | while read x; do y=$x; done` (vad innehåller nu `$y`?). Utöver att skapa en extra process så kommer systemet i praktiken också behöva läsa inputdata multipla gånger om man använder `cat`, då den först kommer läsa filen till pipebufferten, och sedan läsa från denna och skicka vidare — handlar det om stora datamängder så kan detta bli märkbart. Ger man redirectoperatorn så kommer programmet läsa direkt från filen, vilket även ger möjlighet för programmet att söka i filen om det skulle ge fördelar.

Om det bara handlar om en enda fil så finns det alltså extremt sällan någon anledning att använda `cat`. Vill man däremot konkatenera (slå ihop) flera filer innan de skickas vidare (vilket ju är det `concatenate` egentligen är till för) så kan `cat minfil1 minfil2 |` vara en bra konstruktion.

Notera återigen att hastigheten inte nödvändigen är det centrala (även om man någon dag säkert kommer råka på en gigantisk fil, eller skapa en loop som körs många gånger), utan att det snarare handlar om att använda de verktyg man har på det sätt det är tänkt.

Se även Useless Use of Cat Award . (EDIT: länk via archive.org, då originalsidan eventuellt är nertagen.)

Lade till archive.org-länk.
Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.