thj01 skrev:Jeg har haft nogle problemer med darktable, fordi databasen til programmet nogle gange fucker op, og der har jeg lavet et script for at af- og geninstallere det.
Men for at få det til at virke helt perfekt har jeg brug for at starte programmet op som min egen bruger, for at programmet danner sin konfigurationsfil, så jeg kan skifte sprog.
Jeg har prøvet at starte programmet op med kommandoen:
Kode: Vælg alt
sudo -u tj darktable
sleep 4
sudo pkill darktable
sleep2
sed bla bla bla.....
... og det starter fint op, men af en eller anden grund får den ikke etableret konfigurationsfilen så sed kommandoen virker...
Hvad gør jeg forkert?
Jeg forstår ikke hvad du mener med "ikke etaberet" i:
men af en eller anden grund får den ikke etableret konfigurationsfilen så sed kommandoen virker
Hvis et program bruger en bestemt konfigurationsfil, og du skal skifte i mellem >1 konfigurationsfil, så lader du programmet læse fra et symlink, der peger på den konfigurationsfil du vil bruge.
For at det virker så skal programmet bruge lstat (meget normalt) før det bruger andre fil I/O system kald, så som open, read, write.
Lstat giver et program informationer om den fil et sym link peger på, og dermed ikke selve sym link filen.
Kernen vil følge et sym link, til et symlink, til et symlink, etc., men kun et bestemt antal gange. Hvis grænsen nås, så vil kernen i stedet for information returnere en fejl meddelelse. Grænsen er ret høj, AFAIK.
---
Hvad angår din titel på indlægget:
sudo script som almindelige bruger
...
Der er 2 ting du skal være opmærksom på:
- sudo fjerner miljø variabler
- Kernen nægter at køre et script set uid root, altså med superbruger/root rettigheder, af den åbenlyse grund at det åbner en ladeport af muligheder for at omgå sikkerheden i et Linux baseret styresystem.
- At køre et program med sudo foran er ikke en set uid root fil, når set uid bit'en ikke er sat, og/eller user for filen ikke er superbrugeren, root.
Hvis du vil starte et program uden sudo, så skal du oversætte et wrapper program med f.eks en C compiler.
Programmet skal først, AFAIK, sætte programmets euid(=effective user id) til 0, altså root,, og så execv programmet du egentlig ville starte.
Programmets process id PID, vil blive genbrugt, da dit kompilerede wrapper program fuldstændig erstattes af det program du execv'er (=starter).
For at programmet virker, så skal du
enten sætte det kompilerede program
set uid root, (med chmod kommandoen),
eller tilføje de rigtige capabilities, (med setcap kommandoen).
Se manual siden capabilities(7) med:
... for at finde ud af hvilken/hvilke capabilities dit program skal bruge.
Bemærk at hvis du flytter filen, eller ændrer så meget som en eneste bit i filen, så mister filen omgående alle capabilities.
Det gælder også en
set uid root, fil, da sådan en fil er indehaver af samtlige capabilities fra capabilities(7).
/Lars