Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2008-07-19 23:32:39

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

powłoka: bezpieczne wczytanie zmiennych z pliku

Chcę do skryptu wczytać zmienne z pliku konfiguracyjnego. Na pozór prosta sprawa:

Kod:

source plik

Problem z tym tylko, że metoda ta nie jest przesadnie bezpieczna. Załóżmy bowiem, że ktoś kreatywny w pliku tym zapisał nie tylko potrzebne zmienne, ale np. rm -rf $HOME — nieszczęście gotowe. Zna ktoś jakiś prosty sposób na wczytanie z pliku tylko zmiennych (a jeszcze lepiej tylko zdefiniowanych przez mnie zmiennych)?


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#2  2008-07-19 23:45:12

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: powłoka: bezpieczne wczytanie zmiennych z pliku

Nie wiem czy uznasz za mądre używanie do tego awka, jednak proponuje takie rozwiązanie:

Plik konfiguracyjny:

Kod:

ZMIENNA=16665
BLE=5555
Apfe=123
ATOPOPSUTAZMIENNA="666"

A skrypt wczytujacy:

Kod:

eval $(awk -F'=' '/.+=.+/{
        if ( $1 == "BLE" || $1 == "ZMIENNA" || $1 == "Apfe" )
                print $1 "=" $2
}' plik.conf)

eval output skryptu interpretuje jako nowe zmienne środowiskowe.


Pozdrawiam, Tomek

Offline

 

#3  2008-07-19 23:58:34

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: powłoka: bezpieczne wczytanie zmiennych z pliku

awk jest super :) Dzięki wielkie.

Tylko jeden defekt jest — zmienne muszą być jednolinijkowe, w momencie gdy jakaś jest kilkulinijkowa, np.

Kod:

ZMIENNA="kopy
tko"

to awk się wysypuje. Niestety muszę brać pod uwagę, że jedna ze zmiennych może być właśnie w takiej postaci. Co prawda mogę być Złym I Niedobrym Skrypciarzem™ i nakazać używania \n, ale wolałbym nie być. Da się to jakoś przeskoczyć?

Ostatnio edytowany przez azhag (2008-07-19 23:58:58)


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#4  2008-07-20 00:02:12

  urug - Członek DUG

urug
Członek DUG
Skąd: Częstochowa
Zarejestrowany: 2008-04-22
Serwis

Re: powłoka: bezpieczne wczytanie zmiennych z pliku

Na pewno się da :>
Ale w tym momencie nie przychodzi mi nic do głowy (Jeśli pierwszą rzeczą o jakiej pomyślałem był program w C/C++ do parsowania tego, to znaczy że więcej nie wymyslę ;] )


Pozdrawiam, Tomek

Offline

 

#5  2008-07-20 00:08:41

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: powłoka: bezpieczne wczytanie zmiennych z pliku

urug napisał(-a):

Na pewno się da :>

wiadomo, wszystk się da, tylko trzeba wiedzieć jak :)

urug napisał(-a):

Ale w tym momencie nie przychodzi mi nic do głowy (Jeśli pierwszą rzeczą o jakiej pomyślałem był program w C/C++ do parsowania tego, to znaczy że więcej nie wymyslę ;] )

;]

Trudno, Źli i Niedobrzy Użytkownicy™ będą się musieli dostosować. :)
Jeszcze raz dzięki.


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#6  2008-07-20 19:00:41

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: powłoka: bezpieczne wczytanie zmiennych z pliku

ponizszy kod pozwoli na lamanie linii w ramach zmiennych objetych w " ... nie dopuszcza natomiast w tego typu zmiennych \"

Kod:

eval $(awk '
  BEGIN {
    FS="[=]"
    cont=0
  }
  cont != 0 && /\"/ {
    cont=0
    print $0
    next
  }
  cont != 0 {
    print $0
    next
  }
  $1 != "BLE" && $1 != "ZMIENNA" && $1 != "Apfe" {
    next
  }
  /.+=[\t ]*\"[^\"]+$/ {
    cont=1
  }
  /.+=.+/ {
    print $1 "=" $2
  } 
' config.sh)

OSTRZEZENIE: w obu wypadkach wpisanie w pliku konfiguracyjnym

Kod:

ZMIENNA=16665; ls -l

spowoduje wykonanie komendy ls -l

Edit:
wydaje się ze ponizsze rozwiazuje wysztskie problemy z takim importem:

Kod:

eval export `cat config.sh`

Ostatnio edytowany przez bercik (2008-07-20 20:05:03)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)