PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl Skript als Bash?



Bennymon
26.01.15, 10:38
Guten Morgen zusammen,

ich habe ein kleines Problem, leider bin ich in Perl noch nicht soweit fortgeschritten, deswegen ersuche ich hier um Hilfe.

Ich habe folgendes Perl-Skript:


sub deaggregate
{
my $start = shift;
my $end = shift;
my $base = $start;
my $step;
while ($base <= $end)
{
$step = 0;
while (($base | (1 << $step)) != $base) {
if (($base | (((~0) & $thirtytwobits) >> (31-$step))) > $end) {
last;
}
$step++;
}
print ntoa($base)."/" .(32-$step);
print "\n";
$base += 1 << $step;
#und: THIRTYTWOBITS=4294967295
* Released under the GNU General Public License
** Source: IPCALC

Kann mir da jemand helfen?

Beste Grüße
Bennymon

ThorstenHirsch
26.01.15, 11:53
Willst du das Skript von Perl nach Bash übersetzen oder verstehen, was es tut?

Bennymon
26.01.15, 12:10
Ich möchte es von Perl nach Bash umsetzen, was es tut ist mir bekannt.

ThorstenHirsch
26.01.15, 12:25
Oh, dann erzähl doch mal. Ich blicke bei den ganzen bitshift-Operatoren nicht durch. Beispielsweise erscheint mir (~0 & $thirtytwobits) ziemlich sinnlos.

ThorstenHirsch
26.01.15, 13:06
Also es müsste ungefähr so aussehen:


#!/bin/sh

thirtytwobits=4294967295

deaggregate()
{
start=$1
end=$2

base=$start
while [ $base -le $end ]; do
step=0
while [ $(( (base | (1 << step)) != base )) ]; do
if [ $(( (base | (thirtytwobits >> (31-step))) > end )) ]; then
break
fi
step=$((step + 1))
done
echo -n "$base/"
echo $(( 32 - step ))
base=$(( base + (1 << step) ))
done

echo $base
}

deaggregate $*

exit 0

Aber da kommt noch nichts vernünftiges raus - was aber nicht daran liegt, dass ich (~0) raus genommen habe; mit dem AND auf (~0) kommt das gleiche raus.

Bennymon
26.01.15, 14:49
Sry, dass das so lange gedauert hat mit der Antwort.
Also:
Das Skript ist eigentlich ein Code-Schnipsel von IPCALC und soll ganz nach dem Prinzip des größten gemeinsamen Teilers anhand einer Start- und End-IP die Range in Netze aufteilen.
Heißt wenn du jetzt ein Netz hast mit 0.0.10.0 bis 0.0.11.255 soll der ausgeben, dass das 2 /24er Netzwerke sind.

Und das soll eigentlich so realisiert werden, dass es in der Command-Line, mit Linux-Standard-Programmen, funktioniert. Also IPCALC soll nicht installiert werden müssen.

Ich hoffe das ist einigermaßen verständlich.. :D

ThorstenHirsch
26.01.15, 15:17
Oh... dann meinst du wohl dieses Skript (http://jodies.de/ipcalc-archive/ipcalc-0.41/ipcalc). Nun, darin ist - wie auch in dem von dir geposteten Schnipsel - deaggregate eine Subfunktion, die im Skript irgendwo benutzt wird. Diese Subfunktion bekommt nicht die IP-Adressen in der Form "aaa.bbb.ccc.ddd" als Parameter übergeben, sondern eine Zahl, die sich aus der IP-Adresse errechnet (zahl = argton($ip)).

Damit das Skript funktionieren kann, musst du also nicht nur deaggregate() implementieren, sondern ebenfalls noch argton() ...und die Subfunktion für die Umwandlung zurück: ntoa(). Und somit wird die ganze Sache so langsam sinnlos: warum willst du ein perfekt funktionierendes (Perl-) Skript in ein Bash-Skript umwandeln? Perl ist nicht nur in (wahrscheinlich allen) Linux-Distributionen installierbar, sondern sogar bei den meisten in der Standardinstallation inbegriffen. Selbst auf vielen embedded Systemen ist es installiert. Und ob nun ein Perl- oder ein Bash-Skript benutzt wird, wenn du "ipcalc" in der Kommandozeile aufrufst, ist doch wurscht.

Und noch eine Anmerkung: du solltest keine Code-Schnipsel ohne Quellenangabe posten, wenn es nicht deine eigenen sind. Das ist ein Verstoß gegen das UrhG.Nur deinen eigenen Code darfst du ohne Quellenangabe posten, weil man automatisch davon ausgehen kann, dass der Code in deinen Postings dein eigener ist. Da das Skript unter der GPL steht, hast du zusätzlich noch gegen die GPL verstoßen und darfst das Skript nun nicht mehr nutzen ...streng genommen. Also, gib doch bitte noch die Quelle an und schreib dazu, dass das Skript unter der GPL steht.

Bennymon
26.01.15, 16:53
Okay, vielen Dank für die Hilfe Thorsten.
Und bezüglich der GPL etc. ist das so in Ordnung?

ThorstenHirsch
26.01.15, 17:09
Ja, das ist ganz gut. Die Referenz "IPCALC" ist zwar nicht eindeutig (ich hab' neben dem Perl-Skript noch eine Python-Bibliothek mit diesem Namen gefunden), ich hätte da an deiner Stelle eine URL und/oder die Namen des Entwicklers hinterlegt (falls bekannt), aber du hast dich eindeutig von der Urheberschaft distanziert und bist somit fein raus.

Bennymon
26.01.15, 19:06
Okay, ich glaube das reicht mir :D

Vielen Dank nochmal für deine Hilfe :)

Nunja ich habe vor, es in diverse Automatismen zu implementieren. Dafür ist das mit Bash nicht nur einfacher sondern auch ggf. schneller.

marce
28.01.15, 08:29
Solange Du nicht auf schmaler Hardware de das Script "ein paar hundert mal pro Sekunde" abfeuern willst sollte Perfomance und Overhead nicht relevant sein

Newbie314
28.01.15, 20:12
Perl ist -sau-schnell. Mach mal lieber nen Test bevor du übersetzst.

karl-heinz-lnx
29.01.15, 18:16
Ob es in der Bash schneller ist, das weiß ich nicht. Aber wo bitte schön soll das einfacher sein?
Den Vorteil sehe ich überhaupt nicht. Wo ist da der Unterschied zwischen Bash und Perl in der Syntax. Ich sehe da keinen wirklich großen.

Was für Perl spricht und gegen die ein Commandline Interface Skript, ist die Tatsache der Portierung.
Schon mal daran gedacht, dass es nicht nur die Bash sondern auch noch KSH, ZSH und etc. pp. gibt. Und was ist mit Windows?
Ein Perlskript kann auf allen Systemen laufen (wenn man gewisse Dinge beachtet), ein Bash-Only Skript nicht!

nopes
29.01.15, 19:50
Also nun sag ich auch mal was dazu, auch wenn es vermutlich ohnehin keinen mehr interessiert:

Perl rockt zwar und pimpen kann man auch noch ziemlich viel (das meine ich durchaus ernst), aber ist irgendwie auch ziemlich gefährlich. Daher hieß es nicht zu unrecht auf dem letzten ccc (http://media.ccc.de/browse/congress/2014/31c3_-_6243_-_en_-_saal_1_-_201412292200_-_the_perl_jam_exploiting_a_20_year-old_vulnerability_-_netanel_rubin.html) "stop using it".

Also wenn du Portierst, dann nehme lieber eine Sprache die nicht so viele "Sonderlocken" hat (siehe das verlinkte Video, ist wirklich unterhaltsam) und nicht so limitiert wie Bash ist (da stimme ich karl-heinz-lnx vollkommen zu), Python ist zB so eine.

karl-heinz-lnx
30.01.15, 13:11
Das Video schaue ich mir heute mal an. Danke für den Link.
Phython wäre als Alternative m. E. ebenfalls besser als ein Bash Skript (aus den schon genannten Gründen).

ThorstenHirsch
30.01.15, 16:34
Off-Topic sind wir ja eh schon ...okay, reden wir über den merkwürdigen Vortrag. Ich finde ja, dass Netanel Rubin sehr überheblich rüberkam. Fefe fand den Vortrag "großartig" (https://blog.fefe.de/?ts=aa5f0cce), das könnte aber auch ironisch gemeint sein, weil er nach Popcorn ruft. In der Perl-Community kam er erwartungsgemäß weniger gut an (http://www.perlmonks.org/?node_id=1111750).

Die Bugs, die Netanel in den Web-Anwendungen gefunden hat, sind natürlich krass. Und sie hängen direkt mit Perl zusammen, damit hat er auch recht. Man kann also sagen, dass Perl nicht gut für Web-Anwendungen geeignet ist und - wenn man von einer richtigen OO-Sprache wie Python/Ruby/Java kommt - nicht intuitiv reagiert. Netanel zieht daraus den Schluss, dass Perl sch*** ist und nicht mehr verwendet werden sollte. Damit könnte er kaum falscher liegen. Wenn sich Perl immer genau so verhalten würde wie Python, hätte man Python nicht gebraucht. Eine bessere Gegenüberstellung Perl vs. Python gibt's hier (https://coosoft.wordpress.com/2013/02/24/the-perl-vs-python-debate/).

Übrigens ist Perl keine "write-only language". Nur weil man Perl-Code gut "obfuscaten" kann, würde heute kein Perl-Entwickler für vernünftige Projekte etwas anderes verwenden als "modern perl" (use strict und so). Die von Netanel angesprochenen Probleme umgeht man hierbei ganz automatisch, da man OO-like arbeitet, also bspw. bei größeren Datenstrukturen Referenzen auf Arrays und Referenzen auf Hashs benutzt anstatt Arrays und Hashs. Die Referenzen sind Skalare, weshalb sich die Frage gar nicht stellt, ob Arrays/Hashs im Code aufgelöst werden oder nicht. Und man hat zudem die schöne, objektorientierte Pointer-Schreibweise im Code.

Ich frage mich eher, warum er Perl ausgerechnet mit Python vergleicht. Da es keinen Migrationspfad von Python2 zu Python3 zu geben scheint, wird dieses Problem die Python-Entwicklung/-Community noch sehr viele Jahre hemmen. Ruby (besser lesbare Syntax und besseres OO als Python) oder JS/node.js (viel schneller als Python) sind daher meiner Meinung nach viel attraktivere Ziele, wenn man unbedingt von Perl weg will.

nopes
30.01.15, 18:26
Da stimme ich zu, bin halt leider etwas weg getrieben von diesen groß artigen Skript Sprachen, mit Ruby hatte ich zB noch gar nichts zu tun. Ich muss auch sagen, dass ich es genauso empfunden habe, was das überhebliche angeht und auch finde ich viele der Beispiel Weltfremd, wer so Coded (Funktions Argumente zB) hat sie nicht mehr alle ;)

Tja und für die kleinen aber dennoch wichtigen Dinge im Leben, da bleibe ich Perl treu, einfach weil ich es kann und es kann alles :D. Ich wollte nur darauf hinweise, dass es Sprachen die angeblich "sicherer" sind gibt, den diese Listen sind die Pest und da hat er leider einfach recht, denn so ist es wirklich extrem einfach einen Fehler zu coden, ohne das man das überhaupt bemerkt - nicht umsonst sind die Sachen die gezeigt worden sind, alt, sehr alt.

Ich denke er hat es mit Python verglichen, weil Python eine Zeit lang ziemlich gepusht worden ist und sehr viele Leute da schon ein bisschen Erfahrung mit haben, bei JS ist es wie bei PHP, fast keiner mag es, fast keiner will es, aber fast jeder nutzt es...

karl-heinz-lnx
30.01.15, 18:31
Ich habe mir das Video angeschaut und er macht Dinge die man eigentlich nicht macht, aber machen kann, weil Perl sie nicht verbietet. Man kann die Probleme aber alle umgehen,das sagt er auch, zumindestens ganz zum Schluss. Ob man Perl nutzt oder nicht, bleibt jedem selber überlassen.