Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [sh] mkdir door eigen invoer.  (gelezen 7731 keer)

Offline Rik

  • Lid
    • http://www.den-haag.nu
[sh] mkdir door eigen invoer.
« Gepost op: 2010/06/25, 15:39:34 »
hoi allemaal,

Ik zal proberen zo duidelijk mogelijk uit te leggen wat ik wil bereiken.

ik gebruik veel joomla en moet hier dagelijks databasses voor aanmaken, nu leek het mij makkelijker om dit te doen doormiddel van een .sh file. ik gebruik nu op het moment 't volgende commando:

Citaat
#! /bin/bash
cd /var/www/
sudo mkdir <whatever>

is het niet mogelijk om gewoon in de command-line een map naam in te voeren en dat hij dan automatisch aangemaakt wordt i.p.v iedere keer het script te openen en de naam handmatig in te voeren.

alsvast bedankt Rik
system: Intel core 2 quad 6600 Oc'ed [ 3,6ghz ]
Watercooled by thermaltake
G.E.I.L 4096 mb 4-4-4-12 1066mhz
Western digital 74Gb Raptor
Gigabyte 2x 8800GTX SLI 768mb

Offline vanadium

  • Lid
Re: [sh] mkdir door eigen invoer.
« Reactie #1 Gepost op: 2010/06/25, 15:53:33 »
Met commandolijn parameters: hier kan je er wat over leren: http://www.ibm.com/developerworks/library/l-bash2.html

Offline Rik

  • Lid
    • http://www.den-haag.nu
Re: [sh] mkdir door eigen invoer.
« Reactie #2 Gepost op: 2010/06/25, 20:37:35 »
thanks, ik zal hier ook eens doorheen kijken.
maar is er niemand die een concreet voorbeeldje zou kunnen maken ?
system: Intel core 2 quad 6600 Oc'ed [ 3,6ghz ]
Watercooled by thermaltake
G.E.I.L 4096 mb 4-4-4-12 1066mhz
Western digital 74Gb Raptor
Gigabyte 2x 8800GTX SLI 768mb

Re: [sh] mkdir door eigen invoer.
« Reactie #3 Gepost op: 2010/06/25, 20:50:29 »
Het staat er eigenlijk heel duidelijk zonder veel te veel tekst :).

#! /bin/bash
cd /var/www/
sudo mkdir $1

$1 zal vervangen worden door het eerste commandline argument.

Re: [sh] mkdir door eigen invoer.
« Reactie #4 Gepost op: 2010/06/25, 20:53:14 »
Het staat er eigenlijk heel duidelijk zonder veel te veel tekst :).

#!/bin/bash
cd /var/www/
sudo mkdir "$1"

"$1" zal vervangen worden door het eerste commandline argument.
FTFY.
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Rik

  • Lid
    • http://www.den-haag.nu
Re: [sh] mkdir door eigen invoer.
« Reactie #5 Gepost op: 2010/06/25, 21:00:12 »
thanks, het zal er idd gestaan hebben , alleen ik ben nog echt een leek op dit gebied. dus vandaar dat het me niets zij.
ik ga eens proberen wat je zij SeySayux

als ik dat commando gebruik, komt het volgende er uit
Citaat
rikk@Ektor:~/Desktop/scripts$ sudo ./test.sh
mkdir: missing operand
Try `mkdir --help' for more information.

script

Citaat

#! /bin/bash
cd /home/rikk/Desktop
sudo mkdir $1
« Laatst bewerkt op: 2010/06/25, 21:04:41 door Rik »
system: Intel core 2 quad 6600 Oc'ed [ 3,6ghz ]
Watercooled by thermaltake
G.E.I.L 4096 mb 4-4-4-12 1066mhz
Western digital 74Gb Raptor
Gigabyte 2x 8800GTX SLI 768mb

Re: [sh] mkdir door eigen invoer.
« Reactie #6 Gepost op: 2010/06/25, 21:06:36 »
Waar is het argument? ;)

$ sudo ./test.sh testmap

Offline Rik

  • Lid
    • http://www.den-haag.nu
Re: [sh] mkdir door eigen invoer.
« Reactie #7 Gepost op: 2010/06/25, 21:08:18 »
Waar is het argument? ;)

$ sudo ./test.sh testmap

oh, direct na het uitvoerings commando de map naam plaatsen ? :) now i get it !
system: Intel core 2 quad 6600 Oc'ed [ 3,6ghz ]
Watercooled by thermaltake
G.E.I.L 4096 mb 4-4-4-12 1066mhz
Western digital 74Gb Raptor
Gigabyte 2x 8800GTX SLI 768mb

Offline Rik

  • Lid
    • http://www.den-haag.nu
Re: [sh] mkdir door eigen invoer.
« Reactie #8 Gepost op: 2010/06/25, 21:55:48 »
Waar is het argument? ;)

$ sudo ./test.sh testmap

is er ook een mogelijkheid dat dit vanuit een menu kan ?
dus dat je een optie kiest en dat er om een naam invoer gevraagd wordt ?

system: Intel core 2 quad 6600 Oc'ed [ 3,6ghz ]
Watercooled by thermaltake
G.E.I.L 4096 mb 4-4-4-12 1066mhz
Western digital 74Gb Raptor
Gigabyte 2x 8800GTX SLI 768mb

Re: [sh] mkdir door eigen invoer.
« Reactie #9 Gepost op: 2010/06/25, 22:21:16 »
Ik ben niet zo thuis in Bash, maar dat kan met het read commando.

Ongetest:
#! /bin/bash
cd /home/rikk/Desktop

echo "Geef een mapnaam op om aan te maken:"
read map
sudo mkdir $map

Offline Rik

  • Lid
    • http://www.den-haag.nu
Re: [sh] mkdir door eigen invoer.
« Reactie #10 Gepost op: 2010/06/25, 22:35:32 »
oke, thanks man, je bent echt mijn held van de week !
ik ga het proberen.
system: Intel core 2 quad 6600 Oc'ed [ 3,6ghz ]
Watercooled by thermaltake
G.E.I.L 4096 mb 4-4-4-12 1066mhz
Western digital 74Gb Raptor
Gigabyte 2x 8800GTX SLI 768mb

Re: [sh] mkdir door eigen invoer.
« Reactie #11 Gepost op: 2010/08/01, 21:27:25 »
Moet die spatie in de shebang lijn niet weg?
Dus #!/bin/bash i.p.v. #! /bin/bash?

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [sh] mkdir door eigen invoer.
« Reactie #12 Gepost op: 2010/08/01, 21:36:30 »
Ik ben niet zo thuis in Bash, maar dat kan met het read commando.

Ongetest:
#! /bin/bash
cd /home/rikk/Desktop

echo "Geef een mapnaam op om aan te maken:"
read map
sudo mkdir $map

Dit is wel gevaarlijk hoor.
Stel nou dat ik als mapnaam iets opgeef als "mapnaam; sudo [gevaarlijk commando]"
Er zijn ook nog wel andere manieren te bedenken waarop dit fout kan gaan.

Nu is dat met een eigen gemaakt script die alleen op je eigen computer gebruikt wordt niet direct een levensgevaar, maar het blijf toch iets om goed mee uit te kijken. Ook ongelukkige tikfoutjes kunnen heel gevaarlijk zijn.

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: [sh] mkdir door eigen invoer.
« Reactie #13 Gepost op: 2010/08/01, 23:56:00 »
Dit is wel gevaarlijk hoor.
Stel nou dat ik als mapnaam iets opgeef als "mapnaam; sudo [gevaarlijk commando]"
Er zijn ook nog wel andere manieren te bedenken waarop dit fout kan gaan.

Nu is dat met een eigen gemaakt script die alleen op je eigen computer gebruikt wordt niet direct een levensgevaar, maar het blijf toch iets om goed mee uit te kijken. Ook ongelukkige tikfoutjes kunnen heel gevaarlijk zijn.

Goede tip! Gelukkig maakt het niet uit als het alleen voor eigen gebruik is :)
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Re: [sh] mkdir door eigen invoer.
« Reactie #14 Gepost op: 2010/08/02, 00:44:10 »
Moet die spatie in de shebang lijn niet weg?
Dus #!/bin/bash i.p.v. #! /bin/bash?
Nope, sommige oude Unix-systemen vereisen die zelfs, maar meestal wordt het weggelaten. De kernel is slim genoeg om een trim te doen.

Ik ben niet zo thuis in Bash, maar dat kan met het read commando.

Ongetest:
#! /bin/bash
cd /home/rikk/Desktop

echo "Geef een mapnaam op om aan te maken:"
read map
sudo mkdir $map

Dit is wel gevaarlijk hoor.
Stel nou dat ik als mapnaam iets opgeef als "mapnaam; sudo [gevaarlijk commando]"
Er zijn ook nog wel andere manieren te bedenken waarop dit fout kan gaan.

Nu is dat met een eigen gemaakt script die alleen op je eigen computer gebruikt wordt niet direct een levensgevaar, maar het blijf toch iets om goed mee uit te kijken. Ook ongelukkige tikfoutjes kunnen heel gevaarlijk zijn.

Nee, dat gaat niet. Als je ; inleest in een variabele, beschouwt bash dat als een letterlijke ; en niet een commando-splits-dinges. Probeer maar als je me niet gelooft ;)
misschien nuttig om sudo -K uit te voeren hierna (dat reset de tijd dat je sudo kan gebruiken zonder wachtwoord, m.a.w., voor het volgende sudo-commando heb je terug je wachtwoord nodig)

seysayux@brrrh---pc:~$ x='echo a; echo b'
seysayux@brrrh---pc:~$ $x
a; echo b
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [sh] mkdir door eigen invoer.
« Reactie #15 Gepost op: 2010/08/02, 04:05:56 »
Je gebruikt nu wel enkele quotes om die tekst aan variabele x te koppelen.
Werkt het ook nog hetzelfde als je aanhalingstekens gebruikt, of als je die variabele vraagt van de gebruiker via read?

(momenteel geen linuxpc bij de hand om het zelf te proberen)

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: [sh] mkdir door eigen invoer.
« Reactie #16 Gepost op: 2010/08/02, 11:31:35 »
SeySayux, ik heb het net uitgeprobeerd en het werkt wel. Dit is mn script test.sh:
#!/bin/bash
echo $1;

En dan doe ik bijv ./test/sh hoi;sudo mkdir ROOTMAP
Uiteindelijk heb ik een map met root rechten ;) Ook als ik quotes om die $1 zet... (echo "$1"; )

Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Re: [sh] mkdir door eigen invoer.
« Reactie #17 Gepost op: 2010/08/02, 11:55:50 »
Je gebruikt nu wel enkele quotes om die tekst aan variabele x te koppelen.
Werkt het ook nog hetzelfde als je aanhalingstekens gebruikt, of als je die variabele vraagt van de gebruiker via read?

(momenteel geen linuxpc bij de hand om het zelf te proberen)
Bij read is het bevestigd.
SeySayux, ik heb het net uitgeprobeerd en het werkt wel. Dit is mn script test.sh:
#!/bin/bash
echo $1;

En dan doe ik bijv ./test/sh hoi;sudo mkdir ROOTMAP
Uiteindelijk heb ik een map met root rechten ;) Ook als ik quotes om die $1 zet... (echo "$1"; )


Bevestigd, zelfde uitvoer hier. Zal even kijken hoe je moet "escapen" in bash.

macbook:~ seysayux$ vim test.sh
i
#!/bin/bash
echo $1;
^[:wq
macbook:~ seysayux$ chmod a+x test.sh
macbook:~ seysayux$ ./test.sh x; echo y
x
y
macbook:~ seysayux$ echo '' > test.sh
macbook:~ seysayux$ vim test.sh
i
#!/bin/bash
read x
echo $x;
^[:wq
macbook:~ seysayux$ ./test.sh
x; echo y
x; echo y
macbook:~ seysayux$
« Laatst bewerkt op: 2010/08/02, 11:58:26 door SeySayux »
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Re: [sh] mkdir door eigen invoer.
« Reactie #18 Gepost op: 2010/08/02, 12:17:03 »
SeySayux, ik heb het net uitgeprobeerd en het werkt wel. Dit is mn script test.sh:
#!/bin/bash
echo $1;

En dan doe ik bijv ./test/sh hoi;sudo mkdir ROOTMAP
Uiteindelijk heb ik een map met root rechten ;) Ook als ik quotes om die $1 zet... (echo "$1"; )

Wat als je ./test.sh 'hoi; sudo mkdir ROOTMAP' doet :P ;)

ik kan ook gewoon echo a; echo b doen. Da's nog verschillend van echo 'a; echo b' ;)
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: [sh] mkdir door eigen invoer.
« Reactie #19 Gepost op: 2010/08/02, 12:31:29 »
Johan gaf in eerste instantie een goede tip. Houd dus rekening met dit soort dingen (potentiële exploits) als je zo'n script gebruikt op een server met meerdere gebruikers waar andere gebruikers dit script ook kunnen uitvoeren...

Om zoiets te voorkomen moet je de invoer controleren (valideren). 1 van de manieren om dit te doen is zoals SeySayux al zei door de invoer te "escapen". Als iemand hier nog kan vertellen hoe je het best de invoer kunt valideren zou dat een mooie toevoeging zijn lijkt me :)
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Re: [sh] mkdir door eigen invoer.
« Reactie #20 Gepost op: 2010/08/02, 14:34:12 »
Johan gaf in eerste instantie een goede tip. Houd dus rekening met dit soort dingen (potentiële exploits) als je zo'n script gebruikt op een server met meerdere gebruikers waar andere gebruikers dit script ook kunnen uitvoeren...

Om zoiets te voorkomen moet je de invoer controleren (valideren). 1 van de manieren om dit te doen is zoals SeySayux al zei door de invoer te "escapen". Als iemand hier nog kan vertellen hoe je het best de invoer kunt valideren zou dat een mooie toevoeging zijn lijkt me :)
Ik zeg je, het is onmogelijk om dit te exploiten. Zet misschien even sudo -K op het einde van het script.

als je ./test.sh a; sudo mkdir root doet, dan doe je:
* Voer test.sh uit met parameter a
* test.sh bevat "echo $1". $1 wordt gesubstitueerd door a.
* Dus je doet feitelijk echo a.
* Voer een tweede, nieuw commando uit, namelijk sudo mkdir root.

Dus, niks te exploit. Twee commando's achter elkaar zetten is een feature van bash. Alles achter de ; wordt nog eens niet doorgegeven als parameter. Probeer anders eens
#!/bin/bash
echo $1
sleep 100;
Nu wordt de map pas na 100 seconden gemaakt, wat bewijst dat er geen exploit is en er nooit was. Ok?
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [sh] mkdir door eigen invoer.
« Reactie #21 Gepost op: 2010/08/02, 21:02:22 »
Geen exploit, maar wel gevoelig voor fouten:
script:
#! /bin/bash
echo "Geef een mapnaam op om aan te maken:"
read map
mkdir $map

Uitvoer:
./test.sh
Geef een mapnaam op om aan te maken:
testmap1/testmap2
mkdir: cannot create directory `testmap1/testmap2': No such file or directory

En over dat escapen ga ik nog wat uitzoeken :)

Re: [sh] mkdir door eigen invoer.
« Reactie #22 Gepost op: 2010/08/02, 21:03:53 »
script:
#! /bin/bash
echo "Geef een mapnaam op om aan te maken:"
read map
mkdir -p $map
Wat dacht je daarvan?
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline Rachid

  • Lid
    • rachidbm
    • Mijn blog
Re: [sh] mkdir door eigen invoer.
« Reactie #23 Gepost op: 2010/08/02, 21:12:21 »
als je ./test.sh a; sudo mkdir root doet, dan doe je:
* Voer test.sh uit met parameter a
* test.sh bevat "echo $1". $1 wordt gesubstitueerd door a.
* Dus je doet feitelijk echo a.
* Voer een tweede, nieuw commando uit, namelijk sudo mkdir root.

Dus, niks te exploit. Twee commando's achter elkaar zetten is een feature van bash. Alles achter de ; wordt nog eens niet doorgegeven als parameter. Probeer anders eens
Ohja, ik heb verkeerd gekeken. Je hebt helemaal gelijk!
En die sudo -K is nooit verkeerd ja.

Desalniettemin is het nooit onverstandig je invoer te valideren :P
Ben je ook blij dat Ubuntu zo toegankelijk en gratis is, en wil je graag net als ik iets terugdoen, kijk dan eens rond bij mwanzo, dé poort naar het bijdragen aan Ubuntu en haar gemeenschap!

Offline Johan van Dijk

  • Administrator
    • johanvandijk
Re: [sh] mkdir door eigen invoer.
« Reactie #24 Gepost op: 2010/08/02, 21:48:21 »
Wat dacht je daarvan?
Die -p optie is mij bekend ja, het ging mij verder vooral om het principe.
Ga zelf maar eens rommelen met ; \; en meer van dat soort combinaties.
Dan krijg je hoe dan ook gekke resultaten.

En stel dat je dit script in Python zou willen doen, dan zou je zoiets kunnen maken:
#!/usr/bin/python
import os
foo=raw_input("Geef een mapnaam op:")
os.system("mkdir "+foo)
Het idee is hetzelfde: je vraagt om een mapnaam en die plak je achter het mkdir commando.

Resultaat:
johan@desktop:/tmp/test$ ./test.py
Geef een mapnaam op:testnaam; echo "all your base..."
all your base...
johan@desktop:/tmp/test$ ls -l
total 8
drwxr-xr-x 2 johan johan 4096 2010-08-02 21:42 testnaam
-rwxr-xr-x 1 johan johan   90 2010-08-02 21:40 test.py

Dat is dus wél een probleem, in tegenstelling tot het gelijkwaardige script in bash.

(ja, Python zal ongetwijfeld zelf ook heel goed mapjes kunnen maken en zo, maar het gaat om het principe)