staging.inyokaproject.org

Simpel: tee in Variable

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

mode

Anmeldungsdatum:
30. Juli 2010

Beiträge: Zähle...

Hallo,

ich habe ein Script nach folgendem Muster:

1
2
3
#!/bin/sh
WALL=wall
echo "Text" | ${WALL}.

Nun möchte ich diesen Text zusäzlich noch per netcat versenden.

Somit habe ich

1
WALL="tee >(nc localhost 3552) | wall)"

eingesetzt. Das funktioniert aber nicht. Auch wenn ich die Klammern maskiere habe ich keine Erfolg.

Woran liegt es?

VG

Mode

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Hallo!

Das Script öffnet eine Untershell für "gepipte" Prozesse. Darin sind dann alle Variablen lokal. Vermutlich hängt da das Problem.

Bin allerdings auch nicht fit genug, um das nun in richtig hinzuschreiben. Da müssen die bash-Experten ran ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

mode schrieb:

1
WALL="tee >(nc localhost 3552) | wall)"

eingesetzt. Das funktioniert aber nicht. Auch wenn ich die Klammern maskiere habe ich keine Erfolg.

Wolltest du vielleicht eine Command Substitution benutzen ? ... 😉
Die sähe dann so aus:

WALL="$(tee >(nc localhost 3552) | wall)"
#           --------------------

Allerdings verstehe ich den unterstrichenen Teil nicht. Was soll der machen ?
Und: Du weist der Variablen die Ausgabe von wall zu. Wolltest Du das ?

LG,

track

mode

(Themenstarter)

Anmeldungsdatum:
30. Juli 2010

Beiträge: Zähle...

In der urspünglichen Version wird der "Text" an den Befehl wall übergeben.

Mit meiner Änderung möchte ich einfach nur den Text zusätzlich per netcat versenden.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Was spricht eigentlich dagegen, das einfach in zwei Schritten zu tun:

1
2
echo "Text" | wall
echo "Text" | nc localhost 3552

?

LG,

track

mode

(Themenstarter)

Anmeldungsdatum:
30. Juli 2010

Beiträge: 38

Es wäre zu einfach 😛

Nein im ernst, es gibt in dem Script sehr viele Stellen an denen Text in diese Variable gepiped wird. Diese wolle ich nicht alle einzeln anpassen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

mode schrieb:

In der urspünglichen Version wird der "Text" an den Befehl wall übergeben.

Mit meiner Änderung möchte ich einfach nur den Text zusätzlich per netcat versenden.

Warum weist Du dann wieder der Variable WALL zu? Das passt nicht zu Deiner Aussage. Wenn ich Deine Beschreibung ernst nehme, dann komme ich zu folgender Lösung:

1
2
3
4
#!/bin/sh
WALL=wall
out=$(tty)
echo "Text" | tee >(nc localhost 3552 >"$out") | $WALL

Die zweite Umleitung (die innerhalb der runden Klammern) ist nötig, damit die Ausgabe von nc nicht auch bei wall landet.

Man könnte das aber auch ganz profan so lösen:

1
2
3
4
5
6
7
8
9
#!/bin/sh

dupie() {
  echo "$1" | $2
  echo "$1" | nc localhost 3552
}

WALL=wall
dupie "Text" $WALL

mode

(Themenstarter)

Anmeldungsdatum:
30. Juli 2010

Beiträge: 38

Ich habe mich in meinem ersten Post scheinbar nicht eindeutig ausgedrückt. Entschuldigung dafür ☹ Für das Versenden über netcat habe ich Zeile 2

1
WALL=wall

durch

1
WALL="tee >(nc localhost 3552) | wall)"

ersetzt. Dies hat leider nicht funktioniert.

Um das ganze mal konkret zu machen. Es geht um das Script /etc/apcupsd/apccontrol des apcupsd. Dieses wird aufgerufen wenn die USV ein Event wirft. Normalerweise wird ein zu dem Event passender Text mit wall im System bekanntgegeben. Ich möchte nun aber zusätzlich diese Information mit netcat versenden.

Im Script gibt es eine Reihe von Meldungen die in folgender Art aufgebaut sind:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
case "$1" in
    killpower)
        echo "Apccontrol doing: ${APCUPSD} --killpower on UPS ${2}" | ${WALL}
        sleep 10
        ${APCUPSD} --killpower
        echo "Apccontrol has done: ${APCUPSD} --killpower on UPS ${2}" | ${WALL}
    ;;
    commfailure)
        echo "Warning communications lost with UPS ${2}" | ${WALL}
    ;;
    commok)
        echo "Communications restored with UPS ${2}" | ${WALL}
    ;;
...

Mein Ziel ist es nun die Variable WALL so anzupassen, dass die Meldung via wall und via netcat weiterverarbeitet werden kann. Eine Änderung an jedem echo Kommando möchte ich wenn möglich vermeiden.

Viele Grüße

mode

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Ich würde die Funktionalität in ein Skript packen und WALL auf das Skript zeigen lassen. Wie das Skript das machen kann, habe ich ja schon gezeigt.

mode

(Themenstarter)

Anmeldungsdatum:
30. Juli 2010

Beiträge: 38

Habe es jetzt wie folgt gelöst:

/etc/apcupsd/apccontrol

1
WALL="${SCRIPTDIR}/apccontrol_dispatcher"

/etc/apcupsd/apccontrol_dispatcher

1
2
3
4
5
6
#!/bin/sh

MESSAGE=`cat /dev/stdin`

wall ${MESSAGE}
echo ${MESSAGE} | nc localhost 3552

Vielen Dank allen, die mir Tipps gegeben haben 👍

Antworten |