Sudo printf met newline

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 30-09 23:01
Het volgende werkt prima middels sudo:

in de sudoers file:
/bin/find /folder -maxdepth 1 -type f -iname \*.tar -printf test

uitvoeren op de shell:
sudo -u gebruiker find /folder -maxdepth 1 -type f -iname \*.tar -printf 'test'


Bovenstaande is natuurlijk niet het echte commando wat ik straks wil gebruiken.
Ik wil straks met "-delete" alle tars wissen en met de "printf" dit tonen.

Het probleem is wanneer ik een newline "\n" ga gebruiken.

Op de shell, ik zou voor elke tar file dus het woord "test" moeten zien. Ik mag hem echter niet uitvoeren als sudo.
sudo -u gebruiker find /folder -maxdepth 1 -type f -iname \*.tar -printf 'test\n'


Ik probeer bijvoorbeeld de volgende aanpassingen in de sudoers file:
/bin/find /folder -maxdepth 1 -type f -iname \*.tar -printf 'test'
/bin/find /folder -maxdepth 1 -type f -iname \*.tar -printf 'test\\n'

Sudo blijft mijn commando niet accepteren. Ik weet op dit moment niet aan welke kant de fout zit, in de sudoers, of het commando.
Meerdere combinaties getest, krijg nooit voor elkaar dat ie newlines toont in de output.

Acties:
  • 0 Henk 'm!

  • d1ng
  • Registratie: Augustus 2009
  • Laatst online: 06-05-2024
Wat heb je precies in de sudoers file?

Acties:
  • 0 Henk 'm!

  • hcQd
  • Registratie: September 2009
  • Nu online
Gooi het find-commando in een script, en voeg het script toe aan sudoers. Simpeler voor jou, eenvoudiger voor de gebruikers omdat die niet ellenlang commando letter-precies over hoeven te typen.

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

In je sudoers bestand heb je een regel toegevoegd om '/bin/find' te mogen uitvoeren met root rechten als normale gebruiker. Prima. Vervolgens ga je 'sudo -u <gebruiker>' gebruiken om dus een commando als een andere gebruiker uit te voeren. En dan krijg je niet wat je wilt? Wat gek. Dat zou ik nou helemaal niet verwachten. :o

Zet nu eens voor jezelf op een rijtje wat je wilt bereiken en wat je hiervoor nodig denkt te hebben. Kom dan hier met die bevindingen. Want je zit nu met een klok-klepel situatie en dat schiet niet op.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 30-09 08:10
MisterE schreef op dinsdag 26 april 2016 @ 16:05:
Sudo blijft mijn commando niet accepteren. Ik weet op dit moment niet aan welke kant de fout zit, in de sudoers, of het commando.
quote: man sudoers(5)
Note that the following characters must be escaped with a ‘\’ if they are used in command arguments: ‘,’, ‘:’, ‘=’, ‘\’.
Hoe ziet je sudoers file eruit?

Ik vraag me overigens ook af of/hoe dat goed gaat met die asterisk in je sudoers-line, * is immers ook een sudoers glob wildcard, wat impliceert dat \* een unescaped asterisk in werkelijke command is.

[ Voor 20% gewijzigd door Thralas op 26-04-2016 22:54 ]


Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 30-09 23:01
Zoals aangegeven, de regel hieronder werkt. Dus nee, dit is niet de complete sudoers file, en ik mag deze dus als "gebruiker" uitvoeren. Lijkt me voor de vraag ook niet relevant.

in de sudoers file:
/bin/find /folder -maxdepth 1 -type f -iname \*.tar -printf test

uitvoeren op de shell:
sudo -u gebruiker find /folder -maxdepth 1 -type f -iname \*.tar -printf 'test'


Het probleem ontstaat met de newline "\n". Als ik dit invoer op de shell:
code:
1
sudo -u gebruiker find /folder -maxdepth 1 -type f -iname \*.tar -printf 'test\n'

Wat maakt de shell er dan van? Ik verwacht dit:
code:
1
sudo -u gebruiker find /folder -maxdepth 1 -type f -iname *.tar -printf test\n

Dus * komt letterlijk aan, en zet ik dus letterlijk in de sudoers (maar escapen daar omdat ie anders als een wildcard ziet)
Maar de newline heb ik meerdere testjes mee gedaan maar krijg dit niet voor elkaar. bijv als dit in de sudoers:
code:
1
/bin/find /folder -maxdepth 1 -type f -iname \*.tar -printf test\\n

Zo uit mijn hoofd werkt dit wel (technisch) maar ik krijg geen newlines in de output


Dit is trouwens niet een commando dat een gebruiker zelf hoeft te gaan typen, de aanroep is vanuit een script. Ik wil ook geen wildcards gaan ondersteunen in sudo (niet veilig). En de andere afdeling gaat ook dit script niet in beheer willen nemen.
Een aternatief zou misschien iets met "xargs" kunnen zijn. Maar dit moet toch ook gewoon kunnen werken?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Waarom heb je nog steeds niet de man-page gelezen waar dit gewoon in staat? We hebben die dingen voor een reden.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
     A user specification determines which commands a user may run (and as what user) on specified hosts.  By default, commands are run as root,
     but this can be changed on a per-command basis.

     The basic structure of a user specification is "who where = (as_whom) what".  Let's break that down into its constituent parts:

    ...

     A Runas_Spec sets the default for the commands that follow it.  What this means is that for the entry:

     dgb     boulder = (operator) /bin/ls, /bin/kill, /usr/bin/lprm

     The user dgb may run /bin/ls, /bin/kill, and /usr/bin/lprm - but only as operator.  E.g.,

     $ sudo -u operator /bin/ls

Duidelijker heb je 't niet. Je moet wel de boel goed invullen. De regel die je hebt in je sudoers is niet goed. Alles wat je als opties en parameters uitvoert met find, boeit niet.

Maar ook wel belangrijk, wat wil je nou met die printf doen?

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 30-09 23:01
Grappig je aangeeft dat ik de man niet lees, terwijl jij mijn post niet leest
Je blaast zelf steeds erg hoog van je toren. Misschien dat ik het niet goed begrijp maar een beejte respect mag wel, zeker als admin hier.
Ik wil straks met "-delete" alle tars wissen en met de "printf" dit tonen.
Als je namelijk "-delete" gebruikt met "find" dan toont ie niet wat is wist. Dat kan je met de printf oplossen.


Dan punt 2, ik wil geen wildcards ondersteunen. Daarmee is je sudo commando zo lek als een mandje. Tenzij ik Sudo verkeerd begrijp maar ik zal even het voorbeeld quoten uit https://www.bsdcan.org/20...l%20-%20bsdcan%202014.pdf
Dangers of Wildcards
Pete ALL=/bin/cat /var/log/messages*
● So you can view all the /var/log/messages
archives...
$ sudo cat /var/log/messages /etc/shadow
● ...and all the other files in the system
Met andere woorden, ik wil geen "find *" in de sudo lijst.
Wat ik al meerdere keren heb aangegeven is dat ie valt over de newline. Ik kan prima een sudo regel aanmaken die werkt totdat ik de newline erin verwerk

[ Voor 3% gewijzigd door MisterE op 27-04-2016 14:08 ]


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 30-09 22:30

Hero of Time

Moderator LNX

There is only one Legend

Als je weet hoe je een sudo line moet toevoegen, waarom hebben we dan nog steeds niet de correcte regel gezien van je (volgens de syntax van sudoers)? En ik geef ook net aan dat wildcards helemaal niet nodig zijn. Het opgeven van /usr/bin/find moet genoeg zijn. In mijn tests werkte dat prima, zelfs bij het gebruik van printf.

En wat is er dan nog mis met print, ipv printf? Waarom zonodig printf?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ find . -mtime +30
./python-gdbm_2.7.11-2_amd64.deb
./lock
./compton-conf_0.1.0+20151226-2_amd64.deb
./compton_0.1~beta2-1_amd64.deb

$ sudo find . -mtime +30 -delete -print
./python-gdbm_2.7.11-2_amd64.deb
./lock
./compton-conf_0.1.0+20151226-2_amd64.deb
./compton_0.1~beta2-1_amd64.deb

$ find . -mtime +30
$

Alles wat verwijdert moet worden, wordt netjes per regel weergegeven en is ook echt weg.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 30-09 23:01
Helaas geen oplossing gevonden voor de newline, maar een workaround verzonnen. Uiteindelijk geworden:

code:
1
/bin/find /folder -maxdepth 1 -type f ( -iname \*.tar ! -iname *prod* -or ( -iname snapshot\*prod\*.tar ) ) -mtime +0 -exec echo Delete\: '{}' \\; -exec rm -f {} \\;

Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 30-09 08:10
Je hebt alsnog 2 wildcards in je regel staan.
Pagina: 1