ubuntuusers.de

Ausgabe nach STDOUT unterbinden

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

kustom

Anmeldungsdatum:
18. März 2008

Beiträge: 41

Wohnort: Nürnberg

Hi, ich habe mir ein kleines Skript geschrieben. Soweit funktioniert auch alles, das einzige was mich stört ist eine nicht gewollte Ausgabe nach STDOUT beim Aufruf von iwconfig.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/bin/bash
# Changing IP and Route for different wireless lan networks
# see /etc/wpa_supplicant.conf for known networks
# Version: 0.1a, August 2009
#

#
# Script has to be run as root
#
if [ $(whoami) != root ]; then
	echo "You have to be root to run $0"
	exit 1
fi

#
# /etc/resolv.conf
#
RESOLV=/etc/resolv.conf

#
# WPA_SUPPLICANT
#
ps_wpa=$(ps aux | awk '/wpa_supplicant/ && !/awk/ { print $11 }')

#
# Get active ESSID
#
act_wlan=$(iwconfig | awk '/ESSID/ { print $4 }' | sed 's/ESSID:"//' | sed 's/"//')

#
# Get wireless device
#
iface=$(iwconfig | awk '/ESSID/ { print $1 }')

#
# Router and Gateway IP
#
router_ip=$(route | awk '/default/ { print $2 }')

#
# Functions
#
function del_devices()
{
	ifconfig "$iface" down || return 1
	route del default || return 1
}

function wpa_running()
{
	if [ "$ps_wpa" = "wpa_supplicant" ];
		then
			:
		else
			wpa_supplicant -D wext -i "$iface" -c /etc/wpa_supplicant.conf -B
		fi
}

function wlan_nbg()
{
	ifconfig "$iface" 100.10.10.10 netmask 255.255.255.0 up || return 1
	route add default gw  100.10.10.1 || return 1
	echo "nameserver 100.10.10.1" > "$RESOLV"
}

function wlan_ste()
{
	ifconfig "$iface" 120.12.12.12 netmask 255.255.255.0 up || return 1
	route add default gw 120.12.12.1 || return 1
	echo "nameserver 120.12.12.1" > "$RESOLV"
}

function pingtest()
{
	ping -c 5 "$router_ip" > /dev/null
	if [ "$?" -eq 0 ]; then
		connected
	else
		not_connected
		exit 1
	fi
}

function connected()
{
	cat << _CON
	
:: Verbindung hergestellt
:: Netzwerk: "$act_wlan"
:: Done

_CON
}

function not_connected()
{
	cat << _NOCON

:: Keine Verbindung hergestellt
:: Abbbruch

_NOCON
}

#
# Change IP for each ESSID
#
case $act_wlan in
	ESSID1)
		del_devices
		wpa_running
		wlan_nbg
		pingtest
			;;
	ESSID2)
		del_devices
		wpa_running
		wlan_ste
		pingtest
			;;
	ESSID3)
		/home/tom/skripte/ohmwlan
			;;
	*)
			;;
esac

# EOF

Das Problem ist nun dass bei iface=$(iwconfig | awk '/ESSID/ { print $1 }') bzw. act_wlan=$(iwconfig | awk '/ESSID/ { print $4 }' | sed 's/ESSID:"//' | sed 's/"//') alle Netzwerkdevices in STDOUT erscheinen. In meinem Beispiel sieht dass dann folgendermaßen aus:

1
2
3
4
5
6
7
tom /home/tom
$ iwconfig | awk '/ESSID/ { print $4 }' | sed 's/ESSID:"//' | sed 's/"//'
lo        no wireless extensions.

eth1      no wireless extensions.

ESSID1

Eine Umlenkung nach >/dev/null bringt auch nicht den gewünschten Erfolg. Nun die Frage ob das machbar ist, dass diese Ausgabe verschwindet? Falls nicht wäre es auch nicht so schlimm, ist ja nur ein "Schönheitsfehler", aber falls es geht freue ich mich natürlich über Ratschläge.

pinguino

Avatar von pinguino

Anmeldungsdatum:
6. Februar 2007

Beiträge: 732

Wohnort: BW

versuche das

... 2> /dev/null

kustom

(Themenstarter)

Anmeldungsdatum:
18. März 2008

Beiträge: 41

Wohnort: Nürnberg

Das habe ich auch schon probiert, funktioniert jedoch auch nicht da es sicht um keine Fehlerausgabe handelt.

Um das W-Lan Interface zu identifizieren habe ich jetzt diesen Code verwendet:

iface=$(cat /proc/net/wireless | awk 'NR==3 { print $1 }' | sed 's/://)'

Anschließend wird iwconfig mit der Variable $iface ausgerufen und es klappt alles so wie ich mir das vorstelle.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Ein einfaches > /dev/null leitet nur die "normale" Standard-Ausgabe ins Nirvana. Die Meldungen, die du noch siehst, können eigentlich nur von der Standard-Fehlerausgabe stammen. Folglich musst du den entsprechenden Dateideskriptor für STDERR ebenfalls umleiten, um alles loszuwerden. Also z.B. so:

programmausgabe > /dev/null 2>&1

Damit schreibt STDOUT nach /dev/null und STDERR (Dateideskriptor 2) tut das, was Dateideskriptor 1 tut. ☺

kustom

(Themenstarter)

Anmeldungsdatum:
18. März 2008

Beiträge: 41

Wohnort: Nürnberg

Ja, nur geht das eben nicht bei Verwendung von iwconfig. Anscheinend gibt das immer alle verbauten Interfaces aus, warum auch immer. Dann hilft auch kein 2>&1.

Ist seltsam, ist aber so. 😉

tom /home/tom
$ iwconfig | grep eth0
lo        no wireless extensions.

eth1      no wireless extensions.

eth0      IEEE 802.11g  ESSID:"ichbingeheim:P"  

tom /home/tom
$ iwconfig | grep eth0 > /dev/null
lo        no wireless extensions.

eth1      no wireless extensions.


tom /home/tom
$ iwconfig | grep eth0 > /dev/null 2>&1
lo        no wireless extensions.

eth1      no wireless extensions.

Aber über /proc/net/wireless ist ja nun ein Weg gefunden wie man iwconfig umgehen kann.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Mit iwconfig hat es nichts zu tun. Wohl eher mit grep oder mit der Pipe. Ich kenne mich mit den internen Abläufen der Shell aber nicht aus, um sagen zu können, warum das so ist.

freebirth_one

Avatar von freebirth_one

Anmeldungsdatum:
19. Juli 2007

Beiträge: 5051

Wohnort: Mönchengladbach

Also, bei mir funktioniert folgendes:

$ iwconfig 2>/dev/null
eth1      IEEE 802.11  Nickname:""
          Access Point: Not-Associated
          Link Quality:4  Signal level:198  Noise level:162
          Rx invalid nwid:0  invalid crypt:0  invalid misc:0

Es ist nämlich die Fehlerausgabe vin iwconfig, die umgelenkt werden muss. Das macht man dann aber vor und nicht nach dem Pipen. Welches dann aber wenn ich das richtig verstanden habe, gar nicht mehr gebraucht wird.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

kustom schrieb:

Das habe ich auch schon probiert, funktioniert jedoch auch nicht da es sicht um keine Fehlerausgabe handelt.

Um das W-Lan Interface zu identifizieren habe ich jetzt diesen Code verwendet:

iface=$(cat /proc/net/wireless | awk 'NR==3 { print $1 }' | sed 's/://)'

Anschließend wird iwconfig mit der Variable $iface ausgerufen und es klappt alles so wie ich mir das vorstelle.

Das sed-Kommando endet falsch, es müßte so: ') enden.

Immer mit Cut'n'paste arbeiten bei (Fehler-)dokumententation, auch wenn es sonst verpönt ist.

AWK ist überflüssig, wenn Du eh sed benutzt:

iface=$(cat /proc/net/wireless | sed -n '3s/:.*//p')

sed -n bedeutet 'no output', '3s/...' daß die Substitution in Zeile 3 stattfindensoll, p bedeutet print (nötig wg. des no output).

Antworten |