Ich versuche, einen hübschen Drucker für LDAP-Einträge zu schreiben, die nur den Stamm LDAP-Datensatz einmal holt und dann die Ausgabe in tee
, die den hübschen Drucker für jeden Abschnitt aufruft.T-Stück mit Prozess Substitution Missverständnis
Zur Veranschaulichung sagen meine group_entry
Funktion gibt die LDIF eines bestimmten LDAP-DN zurück. Die Einzelheiten sind nicht wichtig, also lassen Sie uns sagen, dass es immer wieder:
dn: cn=foo,dc=example,dc=com
cn: foo
owner: uid=foo,dc=example,dc=com
owner: uid=bar,dc=example,dc=com
member: uid=foo,dc=example,dc=com
member: uid=baz,dc=example,dc=com
member: uid=quux,dc=example,dc=com
custom: abc123
ich einfach an die Eigentümer und die Mitglieder separat mit etwas grep
‚ing und cut
‘ ing extrahieren kann. Ich kann diese sekundären DNs dann in eine andere LDAP-Suchabfrage leiten, um ihre echten Namen zu erhalten. Aus Gründen der Beispiel sagen wir, ich habe eine pretty_print
Funktion, die auf dem LDAP-parametrisiert wird Attributnamen, die alle tut, die ich gerade erwähnt und formatiert dann alles schön mit AWK:
$ group_entry | pretty_print owner
Owners:
foo Mr Foo
bar Dr Bar
$ group_entry | pretty_print member
Members:
foo Mr Foo
baz Bazzy McBazFace
quux The Artist Formerly Known as Quux
Diese funktionieren einzeln in Ordnung, aber wenn ich versuche, sie zusammen zu tee
, passiert nichts:
$ group_entry | tee >(pretty_print owner) | pretty_print member
Members:
[Sits there waiting for Ctrl+C]
Offensichtlich ich einige Missverständnisse darüber, wie das funktionieren soll, aber es entgeht mir. Was mache ich falsch?
EDIT Der Vollständigkeit halber, hier ist mein ganzes Skript:
#!/usr/bin/env bash
set -eu -o pipefail
LDAPSEARCH="ldapsearch -xLLL"
group_entry() {
local group="$1"
${LDAPSEARCH} "(&(objectClass=posixGroup)(cn=${group}))"
}
get_attribute() {
local attr="$1"
grep "${attr}:" | cut -d" " -f2
}
get_names() {
# We strip blank lines out of the LDIF entry, then we always have "dn"
# followed by "cn" records; we strip off the attribute name and
# concatenate those lines, then sort. So we get a sorted list of:
# {{distinguished_name}} {{real_name}}
xargs -n1 -J% ${LDAPSEARCH} -s base -b % cn \
| grep -v "^$" \
| cut -d" " -f2- \
| paste - - \
| sort
}
pretty_print() {
local attr="$1"
local -A pretty=([member]="Members" [owner]="Owners")
get_attribute "${attr}" \
| get_names \
| gawk -F'\t' -v title="${pretty[${attr}]}:" '
BEGIN { print title }
{ print "-", gensub(/^uid=([^,]+),.*$/, "\\1", "g", $1), "\t", $2 }
'
}
# FIXME I don't know why tee with process substitution doesn't work here
group_entry "$1" | pretty_print owner
group_entry "$1" | pretty_print member
Wenn Sie den tatsächlichen Code teilen können, den Sie versuchen + Ihre falsche Ausgabe + Ihre erwartete Ausgabe, wird es uns einfach sein, Ihnen besser zu helfen. – Inian
Ein weiteres Problem ist, dass der Aufruf von 'pretty_print owner' seine Standardausgabe von der gleichen Stelle wie' tee' erbt, was bedeutet, dass 'pretty_print member' einige zusätzliche unerwartete Eingaben erhält. – chepner
Es gibt auch das Problem, dass die beiden Aufrufe von 'pretty_print' asynchron ausgeführt werden, sodass ihre Ausgabe wahrscheinlich verschachtelt wird, wenn sie in dieselbe Datei schreiben. – chepner