PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Scriptsprachen FAQ



ponzellus
21-10-2002, 12:01
Ich habe die Anfrage auf einen FAQ-Beitrag fuer dieses Forum bekommen und find das ist ne gute Idee :)
also - dies ist er

jeder der moechte, kann einen Beitrag hierzu schreiben, nur bitte auch nur Fragen & Antworten die auch wirklich oefter vorkommen, danke :)

ps.: ich hab grad net soviel Zeit, ich werd bei Gelegenheit auch mal was dazu schreiben...

fork
21-10-2002, 17:35
Wie bekomme ich die IP-Adresse(IPv4) des Rechners(und nur diese) in eine Variable?
DEVICE="eth0"
IP_ADRESSE=$(/sbin/ifconfig $DEVICE| grep "inet Adresse"| awk '{ print $2}' |awk -F: '{print $2}')
Wie kann ich die Anzahl der gesendeteten/empfangen Bytes aus ifconfig herausfiltern?

Aus der Shell heraus mit etwas Hilfe von Perl.

DEVICE="ppp0"
RX_BYTES=$(ifconfig $DEVICE| perl -e 'for(<>) { /RX bytes:([0-9]+).*TX bytes:([0-9]+)/ and \
$RX+=$1} print "$RX" ')
TX_BYTES=$(ifconfig $DEVICE| perl -e 'for(<>) { /RX bytes:([0-9]+).*TX bytes:([0-9]+)/ and \
$TX+=$2;} print "$TX" ')

Wie kann ich ein Passwort verschlüsseln?

Wie kann ich ein Passwort verschlüsseln(mit crypt) das der Benutzer eingibt? Danach soll es in die Systemdateien eingetragen werden können.

http://www.mrunix.de/forums/showthread.php?s=&threadid=29834
http://www.mrunix.de/forums/showthread.php?threadid=13774

Hinweis: Das Passwort in /etc/shadow oder /etc/passwd ist 13-stellig, das verschlüsselte Passwort aber nur 11-stellig. Der 2-stellige Salt-Key der beim verschlüsseln verwendet wird vor das Passwort gesetzt!

tomes
23-10-2002, 12:48
In einer mysql- Datenbank eine Datensatz updaten oder neu Datensatz schreiben

#!/bin/usr/perl -w
#
use DBI;
use DBD::mysql;
###########
my $DB = "Datenbankname";
my $user = "Username";
my $passwd = "Password";
my $table = "Name der Tabelle";
my $HILFE = "1";
# Variablen wo nach gesucht werden soll
my $DATUM = "23 Okt 2002";
my $NAME = "Hugo";

# connecten der Datenbank
my $dbh=DBI->connect("dbi:mysql:$DB:", "$user", "$passwd") or die "kann nicht auf datenbank zugreifen\n";

# Abfrage stellen
my $sth=$dbh->prepare("select * from $table where datum='$DATUM' and name='$NAME'");
$sth->execute();

# die gefundenen Datensaetze Zeile fuer Zeile auslesen
while(my $href=$sth->fetchrow_hashref())
{
# pruefen ob es den Datensatz so schon gibt
if($href->{"datum"} eq $DATUM && $href->{"name"} eq $NAME)
{
# wenn ja Hilfs-Variable auf 0 setzen und Datensatz updaten
$HILFE = "0";
$dbh->do("update $table SET anzahl=anzahl+1 where name='$NAME' and datum='$DATUM'");
}
}
# Abfrage beenden
$sth->finish();

# Wenn nicht kein update erfolgte, steht die Hilfs-Variable noch auf 1 und somit wird ein neuer Datensatz geschrieben
if($HILFE == "1") { $dbh->do("insert into $table (datum,anzahl,name) values ('$DATUM','1','$NAME')"); }

}
$dbh->disconnect();

--------------------------------------------

Eine einfache Abfrage der Datenbank

#!/bin/usr/perl -w
#
use DBI;
use DBD::mysql;
###########
my $DB = "Datenbankname";
my $user = "Username";
my $passwd = "Password";
my $table = "Name der Tabelle";
########

# connecten der Datenbank
my $dbh=DBI->connect("dbi:mysql:$DB:", "$user", "$passwd") or die "kann nicht auf datenbank zugreifen\n";

# Abfrage
my $sth=$dbh->prepare("select * from $table");
$sth->execute();

# Alles Zeile fuer Zeile ausgeben
while(my $href=$sth->fetchrow_hashref())
{
foreach my $k (keys %$href) { print $href->{"$k"}," "; }
print "\n";
}
# Abfrage beenden
$sth->finish();
# Verbindung beenden
$dbh->disconnect();

------------------------------------------
Brauchte das Ganze fuer die Statistik unseres Online Virenscanner.

T;o)Mes

querus
27-11-2002, 23:00
Summierung des Down- und Uploadvolumens

Na, da mach ich doch auch mit. Ich hatte von meinem Provider ein Mail bekommen, dass ich auf mein Downloadverhalten acht geben soll. Bei der Rückfrage wie, hat man mir gesagt, dass Linux von ihnen nicht unterstützt wird. Deshalb mußte ich mir notgedrungen, mit einer super Hilfe von Hans-Georg Normann, selbst ein Script basteln.

Es liegt bei mir in /etc/init.d, und ich führe es beim Starten und Beenden aus. Es handelt sich bei mir um Gentoo-Linux (#!/sbin/runscript).



#!/sbin/runscript

depend() {
need net
}

start() {
ebegin "Starting SumTraffic "
datum=$(date +%d.%m.%Y)
monat=$(date +%m%Y)

#Überprüfung, ob die datei /var/log/updown existiert, falls nicht = anlegen
if [ ! -f /var/log/updown ] ; then
echo 0 > /var/log/updown
echo die datei /var/log/updown wurde angelegt
fi

#Überprüfung, ob die datei /var/log/monatupdo existiert, falls nicht = anlegen
if [ ! -f /var/log/monatupdo ] ; then
echo $monat > /var/log/monatupdo
echo die datei /var/log/monatupdo wurde angelegt
fi

#Überprüfung des monats
if [ `cat /var/log/monatupdo` != $monat ] ; then
sum=0; for i in `cat /var/log/updown`; do ((sum+=i));done;
mv /var/log/updown /var/log/$datum.UPDOWN
echo 0 > /var/log/updown
echo Die Datei wurde unter dem Namen $datum.UPDOWN weggesichert
echo $datum: Transfervolumen des vergangenen Monats: $sum MB ';)'

#standard
else
sum=0; for i in `cat /var/log/updown`; do ((sum+=i));done;
echo $datum: bisher heruntergeladen: $sum MB. verbleibend: $[10240-$sum] MB
fi
eend $? "Failed to start SumTraffic"
}
stop() {
ebegin "Stopping SumTraffic "

#generelle variablen definieren

datum=$(date +%d.%m.%Y)
monat=$(date +%m%Y)

#Wert für die monatsüberprüfung in textdatei schreiben
echo $monat > /var/log/monatupdo

#up und downloadvolumen ermitteln
up=$(/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $6}' | gawk -F':' '{print $2}');up=$[$up/1048576]
down=$(/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $2}' | gawk -F':' '{print $2}');down=$[$down/1048576]

#prüfen, ob eventuell die summe von up und download > 0
summe=$[$up+$down]
if [ $summe = 0 ] ; then
up=$(/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $6}' | gawk -F':' '{print $2}')
down=$(/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $2}' | gawk -F':' '{print $2}')
summe=$[$up+$down];summe=$[$summe / 1048576]
echo $summe >> /var/log/updown
up=0;down=$summe

#falls summe von up und download immer noch < 0 dann 1 mb annehmen
if [ $summe = 0 ] ; then
up=0;down=1
echo $down >> /var/log/updown
fi

#ansonsten die tatsächlichen werte übernehmen
else
echo $down >> /var/log/updown
echo $up >> /var/log/updown
fi

sum=0; for i in `cat /var/log/updown`; do ((sum+=i));done;

#zusammenfassung ausgeben
echo $datum: heute: $[$up+$down] MB insgesamt: $sum MB verbleibend: $[10240-$sum] MB
eend $?


Analog dazu habe ich mir noch ein kleines ausführbares Script gebastelt, welches ich mit fcron im 15 Minuten Takt ausführen lasse. Die Daten werden mittels Root-Tail am Desktop angezeigt:


datum=$(date +%d.%m.%Y)

up=$(/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $6}' | gawk -F':' '{print $2}');up=$[$up/1048576]
down=$(/sbin/ifconfig eth0 | grep "RX bytes" | gawk '{print $2}' | gawk -F':' '{print $2}');down=$[$down/1048576]

sum=0; for i in `cat /var/log/updown`; do ((sum+=i));done;
echo $datum: down: $down MB up: $up MB heute: $[$up+$down] MB >> /var/log/kern.log
echo $datum: insgesamt: $[$sum+$down+$up] MB verbleibend: $[10240-$sum-$down-$up] MB >> /var/log/kern.log

Mir ist klar, dass man die Scripte noch mit Variablen usw. ausschmücken könnte, doch für mich und meinem normalen Hausgebrauch, reichen sie, wie sie sind :).. btw, mein Downloadlimit ist 10 GB, deshalb 1048576.

Ich habe noch eine Überschrift gesetzt und die quotes mit code ersetzt

tomes
07-01-2003, 21:36
mit lesenden oeffnen und schreiben in Files, suchen und ersetzen usw.
Nur zur Anregung und natuerlich zum Gebrauch ;)
Ausserdem als "Schmackerle" --> wie installiere ich schnell mal benoetigte Perl-Pakete von der Konsole aus nach ;) ;) ;)



#!/usr/bin/perl -w
#
use strict;
use File::Find;
use File::Basename;
use Net:: DNS; #<-- Achtung Leerstelle zwischen den Doppelpunkt und DNS enfernen
###############
# Bitte hier den Path anpassen,
# wo das Firewall Script liegt
my $firewall = "/home/tom/firewall.sh";
###############
my $host = $ARGV[0];
my $search = "Kernelip=";
my ($alte_ip,$neue_ip);
###############
# alte IP auslesen aus der "firewall.sh"
open(AIP,"<$firewall");
foreach(<AIP>){
if($_ =~ /$search.*/){
$_ =~ s/^Kernelip\=\"//g;
$_ =~ s/\"\s$//g;
$alte_ip = $_;
}
}
close(AIP);

# "neue" IP holen
my $res = Net:: DNS::Resolver->new; # siehe oben
my $query = $res->search($host);
if ($query) {
foreach my $rr ($query->answer) {
next unless $rr->type eq "A";
$neue_ip = $rr->address;
}
}
# Falls keine IP, Fehlermeldung und Beenden
else {
print "query failed: ", $res->errorstring, "\n";
exit;
}
# Nachschauen ob sich IP geaendert hat
# wenn ja alte IP gegen die neue IP in "Firewall-Script" tauschen
# und Firewall neustarten
if($alte_ip eq $neue_ip){
print "IP ist die selbe \n";
}
else{
print "IP hat sich geaendert \n";
open(FW,"<$firewall");
open(TFW,">/tmp/firewall");
foreach(<FW>){
if($_ =~ /$search/){ print TFW "Kernelip=\"".$neue_ip."\"\n"; }
else { print TFW $_; }
}
close(TFW);
close(FW);
# Verschiebe tmp-File, mache sie ausfuehrbar und starte sie
`mv /tmp/firewall $firewall`;
system("chmod 700 $firewall");
system("$firewall");
}

exit 0;



Damit dieses Script leauft, muessen sich die Pakete Net:: DNS, File::Find und File::Basename auf dem Rechner befinden.
Falls sie nicht da sind (Fehlermeldung beim starten des Scripts), kann man sich diese "ganz" einfach installieren.
Und zwar machen ich das wie folgt:
# perl -MCPAN -e shell
Falls das erste mal Aufgerufen, einfach bei der ersten Frage no eingeben.
Die CPAN-Shell wird dann automatisch inizialisiert ! Man kann auch yes eingeben und ein paar Fragen beantworten, dies sollte aber nur jemand machen der sich ein wenig mit Linux und Perl auskennt.
Danach bekommt man eine CPAN-Shell
cpan>
jetzte nur noch ein -->
cpan> install File::Find
und das Pakete wird installiert.
Viel Spass ;)

T;o)Mes
P.S.: Falls jemand einen Fehler oder eine Verbesserung sieht, bitte melden ;)