🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
7 messages
7 total messages Started by Bartosz Feński aka fEnIo Wed, 09 Dec 2009 20:07
system() i mysqldump
#51705
Author: Bartosz Feński aka fEnIo
Date: Wed, 09 Dec 2009 20:07
50 lines
2778 bytes
Hello.

Będzie pewnikiem trochę lamersko, ale sobie wykminiłem, że zrobię pierwszy
mało prowizoryczny skrypt, z configiem i w ogóle same ochy i achy.

Żeby była jasność to z Perla cudotwórca nie jestem i raczej poza 
wspomaganiem się nim gdy coś w Bashu było niemożliwe lub bardzo upierdliwe 
nic w nim nigdy nie pisałem.

Nawet z pomocą Config::IniFiles mi odczyt tego configa wyszedł, ale jak 
próbuję przekazać te argumenty do mysqldump wywołanego przez system() 
to mi to za cholerę nie chce zarobić.

To co wyczytało z configa mam w:

$dump = mysqldump
$cfg->val('baza', 'host') = localhost
$cfg->val('baza', 'user') = root
$cfg->val('baza', 'db') = baza
$cfg->val('baza', 'password') = nieistotne

No i próbuję sklecić wywołanie system():

system($dump, '-h', $cfg->val('baza', 'host'),
              '-u', $cfg->val('baza', 'user'),
              '-p', $cfg->val('baza', 'password'),
              $cfg->val('baza', 'db'),
              '> /home/backups/baza.sql');

No i skończyłem z tym, że pyta mnie o hasło.
Jak podmienię 3 linijkę na '-pnieistotne' to działa, ale chciałbym 
to jednak brać z owego configa. Czyli przekazywanie argumentów 
w taki sposób dowala tam spację, której mysqldump nie lubi. Da się to inaczej
wywołać czy mam sobie ten argument zbudować najpierw gdzieś na boku?

Poza tym gdy już mam wklepane owe '-pnieistotne' to z kolei kończę z:

mysqldump: Couldn't find table: " > /home/backups/baza.sql"

Czyli mój znaczek ">" jest totalnie zlewany, a raczej jakoś cudacznie
przekazywany do shella, że ten go nie traktuje jako przekierowanie.
Jak to obejść?

pozdr,
fEnIo
-- 
  ,''`.  Bartosz Fenski | mailto:fenio@debian.org | pgp:0x13fefc40 | irc:fEnIo
 : :' :       32-050 Skawina - Glowackiego 3/15 - malopolskie v. - Poland
 `. `'           phone:+48602383548 | proud Debian maintainer and user
   `-            http://fenski.pl | xmpp:fenio@jabber.org | rlu:172001
Re: system() i mysqldump
#51704
Author: Adam Osuchowski
Date: Wed, 09 Dec 2009 20:19
35 lines
2417 bytes
Bartosz Feński aka fEnIo wrote:
> No i próbuję sklecić wywołanie system():
> 
> system($dump, '-h', $cfg->val('baza', 'host'),
>               '-u', $cfg->val('baza', 'user'),
>               '-p', $cfg->val('baza', 'password'),
>               $cfg->val('baza', 'db'),
>               '> /home/backups/baza.sql');
> 
> No i skończyłem z tym, że pyta mnie o hasło.
> Jak podmienię 3 linijkę na '-pnieistotne' to działa, ale chciałbym 
> to jednak brać z owego configa. Czyli przekazywanie argumentów 
> w taki sposób dowala tam spację, której mysqldump nie lubi. Da się to inaczej
> wywołać czy mam sobie ten argument zbudować najpierw gdzieś na boku?
> 
> Poza tym gdy już mam wklepane owe '-pnieistotne' to z kolei kończę z:
> 
> mysqldump: Couldn't find table: " > /home/backups/baza.sql"
> 
> Czyli mój znaczek ">" jest totalnie zlewany, a raczej jakoś cudacznie
> przekazywany do shella, że ten go nie traktuje jako przekierowanie.
> Jak to obejść?

Przeczytać manual do funkcji system():

    If there is more than one argument in LIST, or if LIST is an array
    with more than one value, starts the program given by the first element
    of the list with arguments given by the rest of the list.  If there is
    only one scalar argument, the argument is checked for shell metacharacters,
    and if there are any, the entire argument is passed to the system's command
    shell for parsing (this is "/bin/sh -c" on Unix platforms, but varies on
    other platforms).

Innymi słowy, jak chcesz, żeby działały shellowe znaki specjalne,
przekaż do funkcji system() jeden argument.
Re: system() i mysqldump
#51707
Author: hubert depesz lubaczewski
Date: Wed, 09 Dec 2009 21:15
13 lines
1064 bytes
zamień to:

>               '-p', $cfg->val('baza', 'password'),

na:

>               '-p' . $cfg->val('baza', 'password'),

depesz

-- 
Linkedin: http://www.linkedin.com/in/depesz  /  blog: http://www.depesz.com/
jid/gtalk: depesz@depesz.com / aim:depeszhdl / skype:depesz_hdl / gg:6749007
Re: system() i mysqldump
#51709
Author: Szymon Sokół
Date: Wed, 09 Dec 2009 21:22
30 lines
2299 bytes
On Wed, 9 Dec 2009 21:07:59 +0100, Bartosz Feński aka fEnIo wrote:

> system($dump, '-h', $cfg->val('baza', 'host'),
>               '-u', $cfg->val('baza', 'user'),
>               '-p', $cfg->val('baza', 'password'),
>               $cfg->val('baza', 'db'),
>               '> /home/backups/baza.sql');
> 
> No i skończyłem z tym, że pyta mnie o hasło.
> Jak podmienię 3 linijkę na '-pnieistotne' to działa, ale chciałbym 
> to jednak brać z owego configa. Czyli przekazywanie argumentów 
> w taki sposób dowala tam spację, której mysqldump nie lubi. Da się to inaczej
> wywołać czy mam sobie ten argument zbudować najpierw gdzieś na boku?

Ja bym to zrobił tak:
system(
  sprintf('%s -h %s -u %s -p%s %s > /home/backups/baza.sql',
         $dump,
         $cfg->val('baza', 'host'),
         $cfg->val('baza', 'user'),
         $cfg->val('baza', 'password'),
         $cfg->val('baza', 'db')
  )
);

-- 
Szymon Sokół (SS316-RIPE) -- Network Manager                                 B
Computer Center, AGH - University of Science and Technology, Cracow, Poland  O
http://home.agh.edu.pl/szymon/ PGP key id: RSA: 0x2ABE016B, DSS: 0xF9289982  F
Free speech includes the right not to listen, if not interested -- Heinlein  H
Re: system() i mysqldump
#51706
Author: Bartosz Feński aka fEnIo
Date: Wed, 09 Dec 2009 21:49
51 lines
3112 bytes
W artykule Adam Osuchowski napisał(a):

>> No i próbuję sklecić wywołanie system():
>> 
>> system($dump, '-h', $cfg->val('baza', 'host'),
>>               '-u', $cfg->val('baza', 'user'),
>>               '-p', $cfg->val('baza', 'password'),
>>               $cfg->val('baza', 'db'),
>>               '> /home/backups/baza.sql');
>> 
>> No i skończyłem z tym, że pyta mnie o hasło.
>> Jak podmienię 3 linijkę na '-pnieistotne' to działa, ale chciałbym 
>> to jednak brać z owego configa. Czyli przekazywanie argumentów 
>> w taki sposób dowala tam spację, której mysqldump nie lubi. Da się to inaczej
>> wywołać czy mam sobie ten argument zbudować najpierw gdzieś na boku?
>> 
>> Poza tym gdy już mam wklepane owe '-pnieistotne' to z kolei kończę z:
>> 
>> mysqldump: Couldn't find table: " > /home/backups/baza.sql"
>> 
>> Czyli mój znaczek ">" jest totalnie zlewany, a raczej jakoś cudacznie
>> przekazywany do shella, że ten go nie traktuje jako przekierowanie.
>> Jak to obejść?
>
> Przeczytać manual do funkcji system():
>
>     If there is more than one argument in LIST, or if LIST is an array
>     with more than one value, starts the program given by the first element
>     of the list with arguments given by the rest of the list.  If there is
>     only one scalar argument, the argument is checked for shell metacharacters,
>     and if there are any, the entire argument is passed to the system's command
>     shell for parsing (this is "/bin/sh -c" on Unix platforms, but varies on
>     other platforms).
>
> Innymi słowy, jak chcesz, żeby działały shellowe znaki specjalne,
> przekaż do funkcji system() jeden argument.

Grrr... no czytałem to i jakoś mi do łba owe "if there is only one scalar
argument" inaczej właziło :/

Sorry. Teraz jak to czytam to rzeczywiście jakoś źle sobie to
zinterpretowałem. Dzięki.

pozdr,
fEnIo

-- 
  ,''`.  Bartosz Fenski | mailto:fenio@debian.org | pgp:0x13fefc40 | irc:fEnIo
 : :' :       32-050 Skawina - Glowackiego 3/15 - malopolskie v. - Poland
 `. `'           phone:+48602383548 | proud Debian maintainer and user
   `-            http://fenski.pl | xmpp:fenio@jabber.org | rlu:172001
Re: system() i mysqldump
#51710
Author: Bartosz Feński aka fEnIo
Date: Thu, 10 Dec 2009 09:06
41 lines
2471 bytes
W artykule Szymon Sokół napisał(a):

>> system($dump, '-h', $cfg->val('baza', 'host'),
>>               '-u', $cfg->val('baza', 'user'),
>>               '-p', $cfg->val('baza', 'password'),
>>               $cfg->val('baza', 'db'),
>>               '> /home/backups/baza.sql');
>> 
>> No i skończyłem z tym, że pyta mnie o hasło.
>> Jak podmienię 3 linijkę na '-pnieistotne' to działa, ale chciałbym 
>> to jednak brać z owego configa. Czyli przekazywanie argumentów 
>> w taki sposób dowala tam spację, której mysqldump nie lubi. Da się to inaczej
>> wywołać czy mam sobie ten argument zbudować najpierw gdzieś na boku?
>
> Ja bym to zrobił tak:
> system(
>   sprintf('%s -h %s -u %s -p%s %s > /home/backups/baza.sql',
>          $dump,
>          $cfg->val('baza', 'host'),
>          $cfg->val('baza', 'user'),
>          $cfg->val('baza', 'password'),
>          $cfg->val('baza', 'db')
>  )
>);

No tak. Ciekawe czy sobie kiedyś wbiję do głowy tę elastyczność perlową ;)

Zaczynam dochodzić do wniosku, że bez jakiejś dobrej książki zmarnuję masę
czasu, bo przy okazji próbuję poskromić obiektowe podejście, które mi jakoś
nigdy nie leżało. 

Dzięki wszystkim za odpowiedzi. Jestem przynajmniej krok dalej ;)

pozdr,
fEnIo

-- 
  ,''`.  Bartosz Fenski | mailto:fenio@debian.org | pgp:0x13fefc40 | irc:fEnIo
 : :' :       32-050 Skawina - Glowackiego 3/15 - malopolskie v. - Poland
 `. `'           phone:+48602383548 | proud Debian maintainer and user
   `-            http://fenski.pl | xmpp:fenio@jabber.org | rlu:172001
Re: system() i mysqldump
#51708
Author: Bartosz Feński aka fEnIo
Date: Thu, 10 Dec 2009 09:25
20 lines
1439 bytes
W artykule hubert depesz lubaczewski napisał(a):

> zamień to:
>
>>               '-p', $cfg->val('baza', 'password'),
>
> na:
>
>>               '-p' . $cfg->val('baza', 'password'),

Aż mi głupio, że o konkatenacji tam nie pomyślałem :/

pozdr,
fEnIo

-- 
  ,''`.  Bartosz Fenski | mailto:fenio@debian.org | pgp:0x13fefc40 | irc:fEnIo
 : :' :       32-050 Skawina - Glowackiego 3/15 - malopolskie v. - Poland
 `. `'           phone:+48602383548 | proud Debian maintainer and user
   `-            http://fenski.pl | xmpp:fenio@jabber.org | rlu:172001
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads