Sziasztok,
Adott a jmxterm, ami egy lassan induló CLI alkalmazás. Nem csak terminálról működik, lehet bármilyen FD az stdin/stdout. Azt szeretném, hogy egyszer kelljen elindítani, majd több processz is futtathasson benne parancsokat (különböző monitoring pluginek).
A nehezítések:
* tcp-n át is be tudjak kérdezni, ne csak lokálisan
* párhuzamosan több bekérdezés is elindulhat (a jmxterm csak egy klienssel beszéljen egy időben, de elutasítani egyet sem szabad)
* nem akarok saját szoftvert írni, meglévő eszközökkel kellene megoldani
Az (x)inetd "wait" majdnem pont jó erre, de nem egészen.
(Előre is köszi.)
- 4019 megtekintés
Hozzászólások
Hát most ez lett:
server:
#!/bin/bash
mkfifo /var/run/jmxterm/jmx_{in,out}
exec 5<> /var/run/jmxterm/jmx_in
exec 6<> /var/run/jmxterm/jmx_out
exec /usr/bin/socat -ly -,ignoreeof SYSTEM:/usr/bin/jmxterm <&5 >&6
client:
#!/bin/bash
trap "{
kill %%
wait %% 2>/dev/null
flock -u 5
}" EXIT
exec 5> /var/run/jmxterm/jmxterm.lock
flock -x 5
cat </var/run/jmxterm/jmx_out &
cat >/var/run/jmxterm/jmx_in
A client működik inetd-ből is mint nowait service és a lock állítja sorba a kéréseket. Nem a legszebb, de egyelőre működik.
- A hozzászóláshoz be kell jelentkezni
Most, hogy volt időm jobban utánajárni, erre egyszerűsödött le a fenti:
server:
/usr/bin/socat -t0 SYSTEM:'java -jar /usr/lib/jmxterm/jmxterm-1.0-alpha-4-uber.jar -l $JMX_REMOTE -n -v silent' \
UNIX-LISTEN:/var/run/jmxterm-socket,mode=XXX,fork
client:
/usr/bin/socat -t0.5 -W/tmp/jmxterm.lock - UNIX-CONNECT:/var/run/jmxterm-socket
Ez már tetszik.
- A hozzászóláshoz be kell jelentkezni
Semmi közöm hozzá, meg már másképp csináltad, de szerintem nem túl szerencsés a file descriptort bedrótozni, mert senki sem mondta, hogy az szabad. A live linuxomban csinálok ilyesmit, ott valami ehhez hasonló van:
exec {fd}<> "$FIFO"
Hivatkozni a későbbiekben $fd-vel lehet rá.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Ezt az exec sort megmagyaráznád? Mi a túró az a {fd} (a többit értem) ?
- A hozzászóláshoz be kell jelentkezni
Valahol olvastam, és valóban működik. Kapcsos zárójelek között kell szerepeltetni egy változónevet, ekkor maga a shell ad egy szabad file descriptort értékül neki, amit a későbbiekben használhatsz.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Lécci adj egy shell nevet és verziót és egy kb 3 soros példát amin működik. Először végigkerestem a bash man-ját sűrű kanyázások közben, de nem találtam a leírásban. Aztán kipróbáltam ezt:
bash$ exec 5< /etc/profile
bash$ while read a ; do echo "$a" ; done <&5
.... (a /etc/profile tartalma)
Majd annyit változtattam volna, hogy az 5 helyére ezt írom {x}, a done után meg ugye ${x} - no már ez se ment, kidobott a bash egy hibaüzenetet, hogy {x} számára nem létezik, de azért boldogan elkezdte az exec-et és az átirányítást végrehajtani. Aztán megpróbáltam {fd} -vel, hátha csak spéci változóra megy, de úgy se sikerült. Szóval most kicsit értetlenül szemlélem a dolgokat.
- A hozzászóláshoz be kell jelentkezni
Kivancsisagbol rakerestem a manualban (en sem hallottam rola :-)), valahol a 3.1.17 es 4.1.5 kozott kerulhetett bele. A REDIRECTION fejezetben ir rola:
Each redirection that may be preceded by a file descriptor number may instead be preceded by a word of the form {varname}. In this case, for each redirection operator except >&- and <&-, the shell will allocate a file descriptor greater than 10 and assign it to varname. If >&- or <&- is preceded by {varname}, the value of varname defines the file descriptor to close.
- A hozzászóláshoz be kell jelentkezni
Itt 3.2.51.(1) van, abban nincs ez a csoda. De a FreeBSD-s bash manuálban megtaláltam. Hát kösz, ma is tanultam valamit, amitől nem biztos, hogy jó nekem :-) De legalább a fenti példa ebben a bash verzióban már működik. Az meg külön jó, hogy a ${varname} persze innentől kellemesen elérhető. Az még egy érdekes kérdés, hogy az íly módon kapott FD-re vajon be van-e állítva a Close-on-exec flag, vagy netán ezt is megöröklik a bash-ból indított processzek, jó kis információszivárgást lehetővé téve. Tudom, nem lehetek ennyire szemét, hogy ezt feltételezem, hogy ennyire hülyék lennének.
És szereti ha azt mondom, hogy typeset -r varname (gyengébbek kedvéért: readonly varname), mert onnantól már nem működik ez a vicces lehetőség ;-)
- A hozzászóláshoz be kell jelentkezni
Bash-ben nincs close-on-exec, az utolsó távoli Exim exploitban ezt ki is használták ha jól emlékszem.
Mondjuk ha lenne is, opcionális kéne hogy legyen, mert ezt néha használom mint feature.
- A hozzászóláshoz be kell jelentkezni
Hát ezt most nem tudom eldönteni, hogy ez - a COE hiánya - egy olyan fícsör aminek örülni kell, vagy olyan, amitől sírni. (Korn-)shell alatt, én asszem a büdös életben nem akartam olyat, hogy
exec 9
random_program.ami ír/olvas az fd9-re/ről open nélkül
Csak és kizárólag olyat, amikor az erre szolgáló eszközökkel értem el:
read -u 9 var
echo "$var" >&9
print -u 9 "$var"
random_program <&9
De ugyebár a második kettő bash-ban nem létezik csak ksh-ban, a 2. és a 4. ezzel szemben nem igazán használja az fd9-et, hisz FD-duplikálás zajlik, nem pedig a FD9 direkt piszkálása. Szóval ha nem mondtok értelmes indokot a COE hiányára, akkor inkább sírok.
- A hozzászóláshoz be kell jelentkezni
Hát most hirtelen ez ugrott be;
tee -vel duplikálom a streamet és mindkét példányt stdin-re küldöm feldolgozásra.
#!/bin/bash
exec {fd}> >(socat -ly -lpdvr0-to-mcast -u - UDP4-SENDTO:$RAWSTREAM_ADDR:$RAWSTREAM_PORT)
gnutv -out stdout 2> >(stdbuf -o0 tr '\r' '\n' | logger -t gnutv -p daemon.info) | \
tee /dev/fd/$fd | \
cvlc - ":sout=[...]"
exec {fd}>&-
Mondjuk ezt FIFO-val is meg lehetne oldani, csak így nem kell vesződni vele.
- A hozzászóláshoz be kell jelentkezni
[muszi@muszi temp]$ cat test
#! /bin/bash
exec 5</etc/hostname
echo "${0##*/}: open files:"
ls -l "/proc/self/fd"
read -p "${0##*/}: press a key... "
"$0-exec"
[muszi@muszi temp]$ cat test-exec
#! /bin/bash
echo "${0##*/}: open files:"
ls -l "/proc/self/fd"
read -p "${0##*/}: press a key... "
[muszi@muszi temp]$ ./test
test: open files:
total 0
lrwx------ 1 muszi muszi 64 Oct 8 19:51 0 -> /dev/pts/1
lrwx------ 1 muszi muszi 64 Oct 8 19:51 1 -> /dev/pts/1
lrwx------ 1 muszi muszi 64 Oct 8 19:51 2 -> /dev/pts/1
lr-x------ 1 muszi muszi 64 Oct 8 19:51 3 -> /proc/2584/fd
lr-x------ 1 muszi muszi 64 Oct 8 19:51 5 -> /etc/hostname
test: press a key...
test-exec: open files:
total 0
lrwx------ 1 muszi muszi 64 Oct 8 19:51 0 -> /dev/pts/1
lrwx------ 1 muszi muszi 64 Oct 8 19:51 1 -> /dev/pts/1
lrwx------ 1 muszi muszi 64 Oct 8 19:51 2 -> /dev/pts/1
lr-x------ 1 muszi muszi 64 Oct 8 19:51 3 -> /proc/2586/fd
lr-x------ 1 muszi muszi 64 Oct 8 19:51 5 -> /etc/hostname
test-exec: press a key...
- A hozzászóláshoz be kell jelentkezni
Kosz a kodot. Ugye nem baj, ha nem vagyok boldog. Azzal egyutt, hogy nem tudom az egyeb shellek ugyanezzel mit csinalnak. (pdksh, ksh93, mksh, ash dash, busybox, stb)
- A hozzászóláshoz be kell jelentkezni
pdksh es ksh93 van elerheto kozelsegben. Elso nem tudja, masodik tudja, es dokumentalt is ez a furcsa {xyz}< formaju atiranyitas. A COE-t most nincs kedvem ezek alatt tesztelni.
- A hozzászóláshoz be kell jelentkezni
dash-0.5.7:
$ ./test
test: open files:
total 0
lrwx------ 1 muszi muszi 64 Oct 9 07:56 0 -> /dev/pts/5
lrwx------ 1 muszi muszi 64 Oct 9 07:56 1 -> /dev/pts/5
lrwx------ 1 muszi muszi 64 Oct 9 07:56 2 -> /dev/pts/5
lr-x------ 1 muszi muszi 64 Oct 9 07:56 3 -> /proc/6385/fd
lr-x------ 1 muszi muszi 64 Oct 9 07:56 5 -> /etc/hostname
test: press a key...
test-exec: open files:
total 0
lrwx------ 1 muszi muszi 64 Oct 9 07:56 0 -> /dev/pts/5
lrwx------ 1 muszi muszi 64 Oct 9 07:56 1 -> /dev/pts/5
lrwx------ 1 muszi muszi 64 Oct 9 07:56 2 -> /dev/pts/5
lr-x------ 1 muszi muszi 64 Oct 9 07:56 3 -> /proc/6387/fd
lr-x------ 1 muszi muszi 64 Oct 9 07:56 5 -> /etc/hostname
test-exec: press a key...
- A hozzászóláshoz be kell jelentkezni
rpm -q bash
bash-4.2.53-1.fc20.i686
Az otthoni gépemen 4.3.30-as van. Meg az 64 bites, de ennek most semmi jelentősége.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Na ezért szeretem az ilyen rendszerközeli problémákat kihuppolni, mindig jön valami érdekesség amiről addig nem tudtam.
$ exec {fd}< /etc/profile
$ wc -l <&$fd
37
$ exec {fd}>&-
$ echo $BASH_VERSION
4.2.37(1)-release
Köszi, nagyszerű!
- A hozzászóláshoz be kell jelentkezni
Biztonságos a bash-ed? ;)
(amúgy csak subscribe)
- A hozzászóláshoz be kell jelentkezni
screen vagy tmux?
- A hozzászóláshoz be kell jelentkezni