Skript-Schnipsel

From DD-WRT Wiki

(Difference between revisions)
Jump to: navigation, search
Revision as of 17:26, 9 June 2009 (edit)
Dr. Ongo (Talk | contribs)
(Traffic Schnipsel - Vereinfachung: aus 6 mach 4)
← Previous diff
Revision as of 17:37, 9 June 2009 (edit) (undo)
Dr. Ongo (Talk | contribs)
m
Next diff →
Line 1: Line 1:
-===drahtlose Schnipsel===+===Drahtlose Schnipsel===
====wl==== ====wl====
-Die meisten wireless-Optionen können über das Programm "wl" auch über die Console eingestellt und überwacht werden<br>+Die meisten wireless-Optionen können über das Programm "wl" auch über die Konsole eingestellt und überwacht werden<br>
-Eine Übersicht über alle wl- Comandos erhält man mit der Eingabe von:+Eine Übersicht über alle wl-Komandos erhält man mit der Eingabe von:
<pre> <pre>
~ # wl cmds ~ # wl cmds
Line 47: Line 47:
</pre> </pre>
-Dieses Programm beherrscht weit mehr Optionen als der WRT überhaupt verarbeiten kann.<br>+Dieses Programm beherrscht weit mehr Optionen als WRT überhaupt verarbeiten kann.<br>
Einige Befehle können nur im Client-Modus und andere nur im AP-Modus verwendet werden. Einige Befehle können nur im Client-Modus und andere nur im AP-Modus verwendet werden.
Line 54: Line 54:
<i>Was machts?</i> <i>Was machts?</i>
Das drahtlose Netzwerk wird im über alle Kanäle gescannt, nach eine Pause von 5 Sekunden wird der Bildschirm gelöscht, und das Ergebnis des Scanns ausgegeben.<br> Das drahtlose Netzwerk wird im über alle Kanäle gescannt, nach eine Pause von 5 Sekunden wird der Bildschirm gelöscht, und das Ergebnis des Scanns ausgegeben.<br>
-Mit der Tastenkombination Strg C kann das Script beendet werden. +Mit der Tastenkombination Strg-C kann das Skript beendet werden.
 +<pre>
 +#!/bin/sh
 +while [ 1 ]; do
 + wl scan
 + sleep 5
 + clear
 + wl scanresults
 +done
 +</pre>
 +Ausgabe:
<pre> <pre>
-while [ 1 ]; 
- do 
- wl scan ; 
- sleep 5; 
- clear; 
- wl scanresults; 
- done; 
- 
Mode: Managed RSSI: -76 dBm noise: -93 dBm Channel: 10 Mode: Managed RSSI: -76 dBm noise: -93 dBm Channel: 10
BSSID: 00:FB:DD:11:22:33 Capability: ESS BSSID: 00:FB:DD:11:22:33 Capability: ESS
Line 73: Line 75:
BSSID: 11:22:33:50:45:FE Capability: ESS BSSID: 11:22:33:50:45:FE Capability: ESS
Supported Rates: [ 1(b) 2(b) 5.5(b) 11(b) ] Supported Rates: [ 1(b) 2(b) 5.5(b) 11(b) ]
- 
- 
</pre> </pre>
-Um auch die versteckten Netzwerke angezeigt zu bekommen, kann man den Scanner in den monitor und passive Modus versetzen. Die zweite SSID ist übrigends eine Turbo-Cell+Um auch die versteckten Netzwerke angezeigt zu bekommen, kann man den Scanner in den Monitor- und passiven Modus versetzen. Die zweite SSID ist übrigends eine Turbo-Cell
<pre> <pre>
~ # wl monitor 1 ~ # wl monitor 1
~ # wl passive 1 ~ # wl passive 1
</pre> </pre>
-Jetzt kann es natürlich unübersichtlich werden.....+Jetzt kann es natürlich unübersichtlich werden ...
Das Programm "grep" hilft bei der Auswahl von Zeilen, die den gewünschen Informationsgehalt besitzen<br> Das Programm "grep" hilft bei der Auswahl von Zeilen, die den gewünschen Informationsgehalt besitzen<br>
Hier wird nach <i>SSID: </i> und <i>Mode:</i> gesucht Hier wird nach <i>SSID: </i> und <i>Mode:</i> gesucht
<pre> <pre>
-while [ 1 ];+while [ 1 ]; do
- do+ wl scan
- wl scan ;+ sleep 5
- sleep 5;+ clear
- clear;+ wl scanresults | grep 'SSID: "\|Mode:'
- wl scanresults | grep 'SSID: "\|Mode:';+done
- done;+
</pre> </pre>
Das Ergebnis sieht dann so aus: Das Ergebnis sieht dann so aus:
Line 112: Line 111:
Mich interessiert also nur dieser. Mich interessiert also nur dieser.
<pre> <pre>
-while [ 1 ];+while [ 1 ]; do
-do+ CHANNEL=$(wl channel | grep target | cut -c16- )
- CHANNEL=$(wl channel | grep target | cut -c16- );+ MAC=$(wl assoclist|cut -d' ' -f2 )
- MAC=$(wl assoclist|cut -d' ' -f2 );+ RATE=$(wl rate|cut -d' ' -f3 )
- RATE=$(wl rate|cut -d' ' -f3 );+ RSSI=$(wl rssi|cut -d' ' -f3 )
- RSSI=$(wl rssi|cut -d' ' -f3 );+ NOISE=$(wl noise|cut -d' ' -f3 )
- NOISE=$(wl noise|cut -d' ' -f3 );+ let SNR="$RSSI- $NOISE"
- let SNR="$RSSI- $NOISE";+ clear
- clear;+ echo "MAC=$MAC Kanal $CHANNEL: Rate=$RATE RSSI=$RSSI Noise=$NOISE SNR=$SNR"; sleep 5
- echo "MAC=$MAC Kanal $CHANNEL: Rate=$RATE RSSI=$RSSI Noise=$NOISE SNR=$SNR"; sleep 5;+done
-done;+
#Ergibt: #Ergibt:
MAC=00:FB:DD:11:22:33 Kanal : Rate=11 RSSI=-77 Noise=-91 SNR=14 MAC=00:FB:DD:11:22:33 Kanal : Rate=11 RSSI=-77 Noise=-91 SNR=14
</pre> </pre>
- 
Die Idee zum letzten Schnipsel stammt von [http://www.vorhauer.homepage.t-online.de/firmware.htm hier] Die Idee zum letzten Schnipsel stammt von [http://www.vorhauer.homepage.t-online.de/firmware.htm hier]
Line 154: Line 151:
# echo "<meta http-equiv="refresh" content="10"><b>Host names and IP addresses of WLAN clients</b> (last update: $(date))<p>" > /tmp/www/wlan.html # echo "<meta http-equiv="refresh" content="10"><b>Host names and IP addresses of WLAN clients</b> (last update: $(date))<p>" > /tmp/www/wlan.html
while read assocLINE; do while read assocLINE; do
- dumpleases | awk 'BEGIN IGNORECASE=1; /'"$assocLINE"'/ {print "Host name: " $1, "MAC: " $2, "IP: " $3}'+ dumpleases | awk 'BEGIN IGNORECASE=1; /'"$assocLINE"'/ {print "Host name: " $1, "MAC: " $2, "IP: " $3}'
- # echo "<br>";+ # echo "<br>";
done < /tmp/assocLIST # >> /tmp/www/wlan.html done < /tmp/assocLIST # >> /tmp/www/wlan.html
- sleep 10;+ sleep 10
done done
</pre> </pre>
Line 266: Line 263:
-Das ganze findet man dann unter http://routerIP/user/traffic.htm+Das Ganze findet man dann unter http://routerIP/user/traffic.htm
''Wie kann ich dieses Dokument schützen? Ich möchte, dass man es nur anschauen kann, wenn man im Web interface eingeloggt ist. Kann das hier jemand schreiben?'' ''Wie kann ich dieses Dokument schützen? Ich möchte, dass man es nur anschauen kann, wenn man im Web interface eingeloggt ist. Kann das hier jemand schreiben?''
Line 275: Line 272:
==== Anzeige der maximalen Verbindungen ==== ==== Anzeige der maximalen Verbindungen ====
Mit folgendem Schnipsel kann man sich die Anzahl der aufgebauten Verbindungen anzeigen lassen: Mit folgendem Schnipsel kann man sich die Anzahl der aufgebauten Verbindungen anzeigen lassen:
-<pre>wc -l < /proc/net/ip_conntrack</pre>+<code>wc -l < /proc/net/ip_conntrack</code>
wenn man sich nur für einen Port oder einen Portrange interessiert, geht das wie folgt: wenn man sich nur für einen Port oder einen Portrange interessiert, geht das wie folgt:
-<pre>Einzelner Port:+Einzelner Port:
-grep 4661 /proc/net/ip_conntrack | wc -l+<code>grep 4661 /proc/net/ip_conntrack | wc -l</code>
Portrange: Portrange:
-grep 46[61-72] /proc/net/ip_conntrack | wc -l</pre>+<code>grep 46[61-72] /proc/net/ip_conntrack | wc -l</code>
===Idle Time umgehen=== ===Idle Time umgehen===
-Falls man vom Provider getrennt wird, wenn man keinen traffic erzeugt:+Falls man vom Provider getrennt wird, wenn man keinen Traffic erzeugt:
<pre> <pre>
- while [ 1 ];+#!/bin/sh
- do+while [ 1 ]; do
- ping -c 5 www.example.com > /dev/null # ping 5 packets+ ping -c 5 www.example.com > /dev/null # ping 5 packets
- sleep 300; # wait 5 minutes+ sleep 300 # wait 5 minutes
- done;+done
</pre> </pre>
Falls dieses nicht funktioniert (der Provider ignoriert ICMP Pakete) dann benutze: Falls dieses nicht funktioniert (der Provider ignoriert ICMP Pakete) dann benutze:
<pre> <pre>
- while [ 1 ];+#!/bin/sh
- do+while [ 1 ]; do
- wget http://www.example.com/ -O /tmp/index -q # download index file+ wget http://www.example.com/ -O /tmp/index -q # download index file
- sleep 300; # wait 5 minutes+ sleep 300 # wait 5 minutes
- done;+done
</pre> </pre>
-===Kleines Sendmail Programm (noch keine Fehlerabhandlung!!!)===+===Kleines Sendmail-Programm (ohne Fehlerabhandlung)===
-Falls man keine Lust hat ein Sendmail-Programm zu installieren.+Falls man keine Lust hat, ein Sendmail-Programm zu installieren.
<pre> <pre>
#!/bin/sh #!/bin/sh
while read a; do while read a; do
-echo $a >> body.$$+ echo $a >> body.$$
-done+ done
-while getopts s:r:m:h: name+while getopts s:r:m:h: name; do
-do+ case $name in
- case $name in+ s) server="$OPTARG";;
- s) server="$OPTARG";;+ r) rec="$OPTARG";;
- r) rec="$OPTARG";;+ m) mailer="$OPTARG";;
- m) mailer="$OPTARG";;+ h) subject="$OPTARG";;
- h) subject="$OPTARG";;+ esac
-esac+
done done
#echo $server #echo $server
Line 341: Line 337:
===Links=== ===Links===
-selbe Kategorie im [http://www.dd-wrt.com/wiki/index.php/Script_Examples engl. Wiki]+Dieselbe Kategorie im [http://www.dd-wrt.com/wiki/index.php/Script_Examples englischen Wiki]
[[Category:Deutsche Dokumentation]] [[Category:Deutsche Dokumentation]]

Revision as of 17:37, 9 June 2009

Contents

Drahtlose Schnipsel

wl

Die meisten wireless-Optionen können über das Programm "wl" auch über die Konsole eingestellt und überwacht werden
Eine Übersicht über alle wl-Komandos erhält man mit der Eingabe von:

~ # wl cmds
ver               cmds              up                down
out               clk               restart           reboot
ucflags           radio             dump              srdump
nvdump            nvset             nvget             revinfo
msglevel          PM                wake              promisc
monitor           frag              rts               cwmin
cwmax             srl               lrl               rate
mrate             infra             ap                bssid
channel           tssi              txpwr             txpwr1
txpathpwr         txpwrlimit        powerindex        atten
phyreg            radioreg          shmem             macreg
antdiv            txant             plcphdr           phytype
scbdump           ratedump          rateparam         wepstatus
primary_key       addwep            rmwep             wep
tkip              aes               keys              tsc
wsec_test         tkip_countermeasures wsec_restrict     eap
authorize         deauthorize       deauthenticate    wsec
wpa_auth          set_pmk           scan              passive
regulatory        spect             scanresults       assoc
status            disassoc          chanlist          channels
channels_in_country curpower          scansuppress      evm
rateset           roam_trigger      roam_delta        roam_scan_period
suprates          scan_channel_time scan_unassoc_time scan_home_time
scan_passive_time scan_nprobes      prb_resp_timeout  channel_qa
channel_qa_start  country           locale            join
ssid              mac               macmode           wds
lazywds           noise             fqacurcy          crsuprs
int               lbt               band              bands
phylist           shortslot         shortslot_override shortslot_restrict
ignore_bcns       pktcnt            upgrade           gmode
gmode_protection  gmode_protection_control gmode_protection_cts gmode_protection_override
legacy_erp        scb_timeout       assoclist         rssi
isup              fasttimer         slowtimer         glacialtimer
radar             rssidump          interference      aciargs
frameburst        pwr_percent       wet               dtim
wds_remote_mac    wds_wpa_role_old  wds_wpa_role      authe_sta_list
autho_sta_list    measure_req       quiet             csa
constraint        rm_req            rm_rep            wme
sta_info          cap
~ #

Dieses Programm beherrscht weit mehr Optionen als WRT überhaupt verarbeiten kann.
Einige Befehle können nur im Client-Modus und andere nur im AP-Modus verwendet werden.

Hier folgen ein paar kleine Client-Beispiele:

wl scan

Was machts? Das drahtlose Netzwerk wird im über alle Kanäle gescannt, nach eine Pause von 5 Sekunden wird der Bildschirm gelöscht, und das Ergebnis des Scanns ausgegeben.
Mit der Tastenkombination Strg-C kann das Skript beendet werden.

#!/bin/sh
while [ 1 ]; do
  wl scan
  sleep 5
  clear
  wl scanresults
done

Ausgabe:

Mode: Managed   RSSI: -76 dBm   noise: -93 dBm  Channel: 10
BSSID: 00:FB:DD:11:22:33        Capability: ESS
Supported Rates: [ 1(b) 2(b) 5.5 11 ]


SSID: "\x00G\x11ARBOP\x00\x01\xCD\x0A\x13\x90\x00\x02-PE\xFE"
Mode: Managed   RSSI: -85 dBm   noise: -91 dBm  Channel: 4
BSSID: 11:22:33:50:45:FE        Capability: ESS
Supported Rates: [ 1(b) 2(b) 5.5(b) 11(b) ]

Um auch die versteckten Netzwerke angezeigt zu bekommen, kann man den Scanner in den Monitor- und passiven Modus versetzen. Die zweite SSID ist übrigends eine Turbo-Cell

~ # wl monitor 1
~ # wl passive 1

Jetzt kann es natürlich unübersichtlich werden ... Das Programm "grep" hilft bei der Auswahl von Zeilen, die den gewünschen Informationsgehalt besitzen
Hier wird nach SSID: und Mode: gesucht

while [ 1 ]; do
  wl scan
  sleep 5
  clear
  wl scanresults | grep 'SSID: "\|Mode:'
done

Das Ergebnis sieht dann so aus:

SSID: "www.fbn-dd.de (HSS)"
Mode: Managed   RSSI: -76 dBm   noise: -88 dBm  Channel: 10
SSID: "WLAN"
Mode: Managed   RSSI: -94 dBm   noise: -88 dBm  Channel: 11
SSID: "WLAN"
Mode: Managed   RSSI: -96 dBm   noise: -88 dBm  Channel: 11
SSID: "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
Mode: Managed   RSSI: -75 dBm   noise: -88 dBm  Channel: 1
SSID: "\x00G\x11ARBOP\x00\x01\xCD\x0A\x13\x90\x00\x02-PE\xFE"
Mode: Managed   RSSI: -87 dBm   noise: -88 dBm  Channel: 4

Jetzt hat man also einen Überblick, was denn alles so auf den Kanälen gefunkt wird.
In meinem Falle bleibt mir nichts anderes übrig, als mich mit www.fbn-dd.de (HSS) zu verbinden.
Mich interessiert also nur dieser.

while [ 1 ]; do
  CHANNEL=$(wl channel | grep target | cut -c16- )
  MAC=$(wl assoclist|cut -d' ' -f2 )
  RATE=$(wl rate|cut -d' ' -f3 )
  RSSI=$(wl rssi|cut -d' ' -f3 )
  NOISE=$(wl noise|cut -d' ' -f3 )
  let SNR="$RSSI- $NOISE"
  clear
  echo "MAC=$MAC Kanal $CHANNEL: Rate=$RATE RSSI=$RSSI Noise=$NOISE SNR=$SNR"; sleep 5
done
#Ergibt:
MAC=00:FB:DD:11:22:33 Kanal : Rate=11 RSSI=-77 Noise=-91 SNR=14

Die Idee zum letzten Schnipsel stammt von hier

Welche IP-Adressen haben die Wireless-Clients?

Was machts? Der Befehl wl assoclist gibt die MAC-Adressen der verbundenen Funk-Clients zurück. cat /proc/net/arp liefert alle Clients mit MAC- und IP-Adresse, die in letzter Zeit aktiv waren. Sucht man in der ARP-Tabelle nach den MAC-Adressen der assoclist, dann kann man den drahtlosen (?Sinn?) IP-Adressen zuordnen.

wl assoclist | awk '{print$2}' > /tmp/assocLIST
while read assocLINE
  do
    awk '/'"$assocLINE"'/ {print$1}' /proc/net/arp
  done < /tmp/assocLIST

Erweitertes Skript mit Hostnamen

Um eine bessere Übersicht zu bekommen (mit Hostnamen, MAC und IP), empfiehlt sich dieses Skript.

Dieses funktioniert allerdings nur, wenn der Wireless-Client eine IP-Adresse vom DHCP-Server bekommen hat (daher dumpleases).

# mkdir -p /tmp/www
while [ 1 ]; do
  wl assoclist | awk '{print$2}' > /tmp/assocLIST
  # echo "<meta http-equiv="refresh" content="10"><b>Host names and IP addresses of WLAN clients</b> (last update: $(date))<p>" > /tmp/www/wlan.html
  while read assocLINE; do
    dumpleases | awk 'BEGIN IGNORECASE=1; /'"$assocLINE"'/ {print "Host name: " $1, "MAC: " $2, "IP: " $3}'
    # echo "<br>";
  done < /tmp/assocLIST     # >> /tmp/www/wlan.html
  sleep 10
done

Output:

Hostname: tp MAC: 01:81:18:3d:49:5e IP: 192.168.2.101

$1, $2, $3 lässt sich dabei in der Reihenfolge vertauschen oder teilweise weglassen:

....awk '{print $1,$3}'

Output:

tp 192.168.2.101

Wenn man es im Browser ausgeben möchte, lässt man die # im Skript weg und ruft die Seite http://Router/user/wlan.html auf.

Traffic-Schnipsel

ifconfig Traffic-Monitor

Was machts? ifconfig gibt die Konfiguration der Interfaces zurück.

~ # ifconfig
br0       Link encap:Ethernet  HWaddr 00:12:34:56:78:99
          inet addr:10.25.134.1  Bcast:10.25.134.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:86779 errors:0 dropped:0 overruns:0 frame:0
          TX packets:112449 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:7236365 (6.9 MiB)  TX bytes:111529135 (106.3 MiB)

usw. ...

... bastelt man sich ein wenig Code um diese Ausgabe, dann kann man sich damit einen sehr einfachen Traffic-Monitor bauen.

#!/bin/sh
while [ 1 ];  do
  curr_input_bytes=$(ifconfig $(route | awk '/default/ {print$8}') | awk -F' +|:' '/bytes/ {print $4}');
  curr_output_bytes=$(ifconfig $(route | awk '/default/ {print$8}') | awk -F' +|:' '/bytes/ {print $9}')
  if [ "$old_input_bytes" -eq '' ]; then
    old_input_bytes=0;
  fi
  if [ "$old_output_bytes" -eq '' ]; then
    old_output_bytes=0;
  fi
  let "delta_input_bytes = $curr_input_bytes - $old_input_bytes"
  let "delta_output_bytes = $curr_output_bytes - $old_output_bytes"
  let "input_speed = $delta_input_bytes / 60"
  let "output_speed = $delta_output_bytes / 60"
  old_input_bytes=$curr_input_bytes
  old_output_bytes=$curr_output_bytes
  clear
  echo -e "Input:\t\t$curr_input_bytes\tBytes "
  echo -e "Output:\t\t$curr_output_bytes\tBytes"
  echo -e "Input speed:\t$input_speed\tBytes/second"
  echo -e "Output speed:\t$output_speed\tBytes/second"
  sleep 60
done

Anstatt sich das Ganze auf der Konsole anzusehen, kann man es natürlich auch in eine HTML-Seite schicken.<pr> Man muss nur die Ausgabe umleiten und das Verzeichnis /tmp/www anlegen.

#!/bin/sh
mkdir /tmp/www
while [ 1 ]; do
  curr_input_bytes=$(ifconfig $(route | awk '/default/ {print$8}') | awk -F' +|:' '/bytes/ {print $4}');
  curr_output_bytes=$(ifconfig $(route | awk '/default/ {print$8}') | awk -F' +|:' '/bytes/ {print $9}')
  if [ "$old_input_bytes" -eq '' ]; then
    old_input_bytes=0;
  fi
  if [ "$old_output_bytes" -eq '' ]; then
    old_output_bytes=0;
  fi
  let "delta_input_bytes = $curr_input_bytes - $old_input_bytes"
  let "delta_output_bytes = $curr_output_bytes - $old_output_bytes"
  let "input_speed = $delta_input_bytes / 60"
  let "output_speed = $delta_output_bytes / 60"
  old_input_bytes=$curr_input_bytes
  old_output_bytes=$curr_output_bytes
  echo -e '
  <html><body>
  <head>
  <META HTTP-EQUIV='Refresh' CONTENT='60'>
  </head>
  <table>
    <tr bgcolor=#c1c1c1>
      <td></td>
      <td>Gesamt<br>[byte]</td>
      <td>Geschwindigkeit<br>[byte/sek]</td>
    </tr>
    <tr>
      <td bgcolor=#c1c1c1 >Eingehend</td>
      <td>'$curr_input_bytes'</td>
      <td>'$input_speed'</td>
    </tr>
    </tr>
      <td bgcolor=#c1c1c1>Ausgehend</td>
      <td>'$curr_output_bytes'</td>
      <td>'$output_speed'</td>
    <tr>
  </table>
  <body><html>' > /tmp/www/traffic.htm
  sleep 60
done


Das Ganze findet man dann unter http://routerIP/user/traffic.htm

Wie kann ich dieses Dokument schützen? Ich möchte, dass man es nur anschauen kann, wenn man im Web interface eingeloggt ist. Kann das hier jemand schreiben?


Wenn man dieses Schnipsel nicht traffic.htm sondern traffic.asp nennt, dann sollte der Schutz auch funktionieren.

Anzeige der maximalen Verbindungen

Mit folgendem Schnipsel kann man sich die Anzahl der aufgebauten Verbindungen anzeigen lassen: wc -l < /proc/net/ip_conntrack wenn man sich nur für einen Port oder einen Portrange interessiert, geht das wie folgt: Einzelner Port: grep 4661 /proc/net/ip_conntrack | wc -l

Portrange: grep 46[61-72] /proc/net/ip_conntrack | wc -l

Idle Time umgehen

Falls man vom Provider getrennt wird, wenn man keinen Traffic erzeugt:

#!/bin/sh
while [ 1 ]; do
  ping -c 5 www.example.com > /dev/null    # ping 5 packets
  sleep 300                                # wait 5 minutes
done

Falls dieses nicht funktioniert (der Provider ignoriert ICMP Pakete) dann benutze:

#!/bin/sh
while [ 1 ]; do
  wget http://www.example.com/ -O /tmp/index -q   # download index file
  sleep 300                                       # wait 5 minutes
done

Kleines Sendmail-Programm (ohne Fehlerabhandlung)

Falls man keine Lust hat, ein Sendmail-Programm zu installieren.

#!/bin/sh
while read a; do 
  echo $a >> body.$$
  done
while getopts s:r:m:h: name; do
  case $name in
       s) server="$OPTARG";;
       r) rec="$OPTARG";;
       m) mailer="$OPTARG";;
       h) subject="$OPTARG";;
  esac
done
#echo $server
#echo $rec
#echo $mailer

echo "EHLO mailer" >> mail.$$
echo "MAIL FROM: $mailer" >> mail.$$
echo $rec | tr ',' '\n' | while read x; do echo "RCPT TO: $x" >> mail.$$ ; done
echo "DATA" >> mail.$$
echo "Subject: $subject " >> mail.$$                                       
cat body.$$ >> mail.$$
echo "." >> mail.$$
echo "QUIT" >> mail.$$

cat mail.$$ | nc $server 25

rm mail.$$
rm body.$$

Links

Dieselbe Kategorie im englischen Wiki