Linux: Cum fac...?

Am un router cu linux... o parte dintr-un linux... In fine...
Vreau sa rulez un server web pe router pe acelasi port pe care ruleaza si un server web din reteaua locala (port care este acum mapat). Cum fac sa "servesc" un subdomeniu cu serverul web de pe router si alt subdomeniu cu serverul web din LAN?

As putea rula "greul", adica PHP si baza de date, in LAN si sa folosesc doar serverul web din router, dar sunt curios daca se poate face prima varianta.
 
Alta:
Am instalat NUT pe router. Am conectat UPS-ul la el, am facut configuratia, rulat "de mana" => merge.
Acum ma chinui sa scriu un script init.d care sa porneasca toate 4-5 serviciile automat la bootare => fail.

Code:
# upslog -h
Network UPS Tools upslog merge-with-ng-663-gef950c01
UPS status logger.

usage: upslog [OPTIONS]

  -f <format>   - Log format.  See below for details.
                - Use -f "<format>" so your shell doesn't break it up.
  -i <interval> - Time between updates, in seconds
  -l <logfile>  - Log file name, or - for stdout
  -p <pidbase>  - Base name for PID file (defaults to "upslog")
  -s <ups>      - Monitor UPS <ups> - <upsname>@<host>[:<port>]
                - Example: -s myups@server
  -u <user>     - Switch to <user> if started as root

Some valid format string escapes:
        %% insert a single %
        %TIME format% insert the time with strftime formatting
        %HOST% insert the local hostname
        %UPSHOST% insert the host of the ups being monitored
        %PID% insert the pid of upslog
        %VAR varname% insert the value of ups variable varname

format string defaults to:
%TIME @Y@m@d @H@M@S% %VAR battery.charge% %VAR input.voltage% %VAR ups.load% [%VAR ups.status%] %VAR ups.temperature% %VAR input.frequency%

See the upslog(8) man page for more information.

Acest upslog ar trebui pornit de un script care face (simplificat) asta:
Code:
PROCS=upslog
ARGS="-u $(whoami) -s 'UPS1@localhost' -i 60 -l '/opt/var/log/ups.log' -f '%TIME @Y@m@d @H@M% %VAR input.frequency% %VAR input.voltage%=>%VAR output.voltage %VAR battery.voltage%/%VAR battery.charge%%% [%VAR ups.status%] %VAR ups.temperature% %VAR ups.load%%%'"
echo $PROCS $ARGS
$PROCS $ARGS

...dar rezulta asta:
Code:
upslog -u root -s 'UPS1@localhost' -i 60 -l '/opt/var/log/ups.log' -f '%TIME @Y@m@d @H@M% %VAR input.frequency% %VAR input.voltage%=>%VAR output.voltage %VAR battery.voltage%/%VAR battery.charge%%% [%VAR ups.status%] %VAR ups.temperature% %VAR ups.load%%%'
Network UPS Tools upslog merge-with-ng-663-gef950c01
logging status of @Y@m@d to @H@M% (0s intervals)
Warning: initial connect failed: Unknown error

Ce fac gresit?
 
De obicei problemele de tipul ăsta pornesc de la trei cauze:
- căi relative (dar nu par să fie la tine, cel puțin în exemple)
- environment vars. Pornirea script-urilor init se face fără să se ruleze script-urile de inițializare bash, așa că environment-ul poate fi complet diferit față de ce ai în mod normal. Dă-i un "set" în command line și compară cu un "set" din script-ul init, sau pornește de mână .bash_profile and stuff (cu punct în față, să se aplice în shell-ul curent ". .bash_profile").
- ordine incorectă. Dacă device-ul încă nu e gata când încerci să pornești serviciul (dar asta ar trebui să se întâmple doar la boot).
 
Nu-i de acolo, ca rulez scriptul de start din linia de comanda ca root (singurul utilizator dispnibil pe router) si tot nu merge.
Intre timp am incercat astea:
Code:
# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f %HOSTNAME%
=> merge

# upslog -u root -s UPS1@localhost -i 60 -l '/opt/var/log/ups.log' -f %HOSTNAME%
=> merge

# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f '%HOSTNAME%'
=> merge

# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f "%HOSTNAME%"
=> merge

# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f '%HOSTNAME% %HOSTNAME%'
=> merge si log-ul e scris corect cu doua hostname-uri

# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f "%HOSTNAME% %HOSTNAME%"
=> merge si log-ul e scris corect cu doua hostname-uri

# ARGS=%HOSTNAME%
# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f $ARGS
=> merge

# ARGS="%HOSTNAME% %HOSTNAME%"
# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f $ARGS
=> nu merge, afiseaza help. Stiu de ce.

# ARGS="%HOSTNAME% %HOSTNAME%"
# upslog -u root -s UPS1@localhost -i 60 -l /opt/var/log/ups.log -f "$ARGS"
=> merge

# ARGS="-l /opt/var/log/ups.log -f %HOSTNAME%"
# upslog -u root -s UPS1@localhost -i 60 "$ARGS"
logging status of UPS1@localhost to  /opt/var/log/ups.log -f %HOSTNAME% (60s intervals)
could not open logfile  /opt/var/log/ups.log -f %HOSTNAME%: No such file or directory
=> nu merge. Stiu de ce.

# ARGS="-l /opt/var/log/ups.log -f %HOSTNAME%"
# upslog -u root -s UPS1@localhost -i 60 $ARGS
=> merge.

# ARGS="-l /opt/var/log/ups.log -f '%HOSTNAME% %HOSTNAME%'"
# upslog -u root -s UPS1@localhost -i 60 $ARGS
=> nu merge. afiseaza help. DE CE?

# ARGS="-l /opt/var/log/ups.log -f \"%HOSTNAME% %HOSTNAME%\""
# upslog -u root -s UPS1@localhost -i 60 $ARGS
=> nu merge. afiseaza help. DE CE??
 
Code:
# cat demo.sh
#!/bin/sh
for ARG in $* ; do echo $ARG ; done
# ./demo.sh bla "bla bla1" 'bla bla2'
bla
bla
bla1
bla
bla2
#
WTF?!
for ARG in $@ face exact la fel.

Cred ca busybox-ul e busit rau. Cum ocolesc tampenia asta?
 
Last edited:
Ok, acum am înțeles; ține de modul de evaluare în bash. Când setezi valoarea variabilei de mediu, apostroafele din interior sunt escapate automat și nu mai funcționează ca apostroafe (pentru că de-escaparea nu e recursivă).

Poți vedea efectul în două moduri (test.sh e un shell simplu care listează argumentele date în linia de comandă):

Fără variabilă de mediu:
Code:
[miahi@dbservice ~]$ ./test.sh i '%H %H'
ARG: i
ARG: %H %H
(%H %H sunt grupate și aplicația le vede ca un singur argument și fără apostroafe)

Cu variabilă de mediu cu apostroafe
Code:
[miahi@dbservice ~]$ ARGS="i '%H %H'"
[miahi@dbservice ~]$ ./test.sh $ARGS
ARG: i
ARG: '%H
ARG: %H'
(%H %H sunt două argumente, cu apostroafe => aplicația se bușește)

Dacă te uiți efectiv la ce e setat în ARGS vezi problema mai bine
Code:
[miahi@dbservice ~]$ set | grep ARGS
ARGS='i '\''%H %H'\'''
(cu echo nu se vede pentru că tratează escape-urile)
Code:
[miahi@dbservice ~]$ echo $ARGS
i '%H %H'

Ca să ocolești problema ai două opțiuni, poți pune o variabilă de mediu separată pentru acel parametru și i-o dai în ghilimele (și faci upslog $RESTUL_DE_ARGUMENTE -f "$STR") sau poți folosi eval, care re-evaluează toată linia de comandă și execută:
Code:
[miahi@dbservice ~]$ eval ./test.sh $ARGS
ARG: i
ARG: %H %H

[miahi@dbservice ~]$ ARGS="%H %H"
[miahi@dbservice ~]$ OTHER_ARGS="I"
[miahi@dbservice ~]$ ./test.sh $OTHER_ARGS "$ARGS"
ARG: I
ARG: %H %H
 
Vezi că $* expandează și ce e în ghilimele.

La mine test.sh este
Code:
 #!/bin/bash 
 
while (( "$#" )); do 
  echo $1 
  shift 
done
 
Ah, f*ck, n-am inteles nimic. :D Pana la urma e un bug sau asa ar trebui sa mearga?
Nu merge sa adaug alt parametru, ca executia propriu-zisa se face in scriptul helper in care n-as vrea sa umblu, ca se va suprascrie la orice update.
Cum e aia cu eval ?
 
Eu citesc aici *standardul* care ar trebui urmat.
Zice asa:
2.2 Quoting
The application shall quote the following characters if they are to represent themselves:
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>

[...]

2.5.2 Special Parameters
@
Expands to the positional parameters, starting from one, initially producing one field for each positional parameter that is set. When the expansion occurs in a context where field splitting will be performed, any empty fields may be discarded and each of the non-empty fields shall be further split as described in Field Splitting. When the expansion occurs within double-quotes, the behavior is unspecified unless one of the following is true:

* Field splitting as described in Field Splitting would be performed if the expansion were not within double-quotes (regardless of whether field splitting would have any effect; for example, if IFS is null).

[...]

If one of these conditions is true, the initial fields shall be retained as separate fields, [...]
Deci e un bug.
 
Bug-ul e că nu vrei să înțelegi că folosind variabile de mediu cu ghilimele în interior, acele ghilimele sunt DUBLU ESCAPATE (vezi '\'') și că de-escaparea nu este recursivă, chestia cu quotes se aplică o singură dată. Adică vede "ah, apostroafe, le scoatem, ce rămâne? Păi \', care NU e un splitter-stopper, doar ' (ne-escapat) e." Și aplică tokenizarea și spațiul dintre n-o să fie între apostroafe, e liber.
 
Alta:
Cum dau shutdown la un windows dintr-un linux? Varianta google, cu "net rpc" nu merge, ca n-am programul ala disponibil. M-am mai gandit la:
- telnet pe windows; e deja instalat
- server web care executa un .php care da shutdown
- parca era un serviciu de messenger inclus in windows care putea face shutdown si il abuzau niste virusi acu' vreo 15 de ani? Asta ar fi bun si pentru notificari live ...
 
Globul meu de cristal nu știe ce windows ai (presupun că 98 customizat cu kernelul de 3.11). Probabil nici una din soluții nu merge pe un windows din ultimii 10 ani, pentru că shutdown necesită permisiuni elevate (nici măcar din remote desktop nu te lasă întotdeauna să dai shutdown).
 
Pe windowșii ăștia mai noi poți să instalezi server de ssh nativ, poate merge de-acolo (n-am folosit, habar nu am ce permisiuni îți trebuie).
 
Pai am mai multe calculatoare (3) cu windows-uri si versiuni variate, mai multe in fiecare. Naiba stie in care din ele o sa ma prinda pana de curent. Trebuie ceva general valabil. Primele doua stiu sigur ca merg, ca am avut telnet si php pe toate calculatoarele mele de la 486 cu Win95 pana la Phenom II 4GHz cu WinXP x64.
As prefera totusi ultima varianta, ca daca tin bine minte mergea cu o singura comanda pentru toate calculatoarele din workgroup.
 
Problema e că în ultimii ani s-au mai reparat problemele de securitate, așa că nu mai e la fel de ușor :). Built-in există chestii, dar nu-ți merge ție router-ul cu net rpc.

Vezi http://www.airytec.com/en/switch-off/ - răspunde la o cerere http, deci poți să-l scriptezi cu un wget / curl.
 
Alta:
Gentoo cu X si gpm. Cum dau "copy" la un text din browser si "paste" in consola*?
* adica altundeva decat in X, nu in xterm.
 
Back
Top