commandline-fu

bAndie91 küldte be v, 2011-04-10 16:17 időpontban

Ez lesz itten az én commandline-fu rovatom.
...vagy ez:
http://www.commandlinefu.com/commands/by/bandie91

Ez a oneliner kilistázza a subnet-ünkben található és NetBIOS névfeloldásra válaszoló gépeket, NetBIOS nevükkel. Ami Windowzok esetében egybeesik a hosztnévvel.

arp-scan -I eth0 -l | perl -ne '/((\d{1,3}\.){3}\d{1,3})/ and $ip=$1 and $_=`nmblookup -A $ip` and /([[:alnum:]-]+)\s+<00>[^<]+<ACTIVE>/m and printf "%15s  %s\n",$ip,$1'

szükségünk lesz hozzá arp-scan utility-re. ARP csomagok olyan alacsony szintũek, hogy root jogokkal lehet csak generálni, ezért én tettem rá egy ragadós bitet:
chmod u+s /usr/bin/arp-scan

az nmblookup a samba-common-bin csomag része.

A következõ oneliner elkezdi keresni a jelenlegi könyvtártól számítva a legfrisebb állományt.

find . -printf "%T@ %p\n" | sed -e 1d | while read ts fn; do ts=${ts%.*}; if [ $ts -ge ${gts:-0} ]; then gts=$ts; echo `date -d @$gts` $fn; fi; done

Az alapértelmezett átjáró kiírása. Már ppp kapcsolatoknál is mũködik. Én a .bash_profile-omba írtam.

route -n | perl -ne '$ANY="0.0.0.0"; /^$ANY/ and split /\s+/ and print "Gateway to the World: ",($_[1]!=$ANY)?$_[1]:(`ip address show $_[$#_]`=~/peer ([0-9\.]+)/ and $1),", via $_[$#_].\n"'

Minap kaptam egy egyszerũ informatikai számítási feladatot, amit automatizálandó egy szkriptet kellett készítenem. Most Ti találjátok ki, mit számol ez a Perl egysoros!
(a stdin-rõl vár bemenetet, de ha helyettesíted a <>-t "szöveg"-re, akkor arra végzi el a mũveletet)
($_,$m)=split/\//,<>;print join".",map{$_&eval"0b".1x$m.$-x(32-$m)."<<8*".$i++.">>24"}split/\./

Hát ezért ezen dolgozni kéne egy keveset h megrághatóvá váljék számomra.
Kicsit szokatlan a formátum nekem. Nem szoktam a map-et használni foreach helyett.
Próbálkoztam pár perc alatt megérteni de nem igazán sikerült.

<br />
0[46.][kecsi@aws]:~/bin> echo "123//izebbb230bcxxx/123545ize0bbbb" | ./ize.pl<br />
1:<br />
2: 1x<br />
3: 04: 00000000000000000000000000000000<br />
5: <<8*<br />
0[47.][kecsi@aws]:~/bin>echo "1/2/3/b0/nemtom/cxxx/123545ize0bbbb" | ./ize.pl<br />
1: 2<br />
2: 1x2<br />
3: 04: 000000000000000000000000000000<br />
5: <<8*<br />
0[48.][kecsi@aws]:~/bin> cat ize.pl<br />
#!/usr/bin/perl<br />
($_,$m)=split/\//,<>;<br />
print "1: $m\n";<br />
print "2: 1x$m\n";<br />
print "3: ".eval"0b"."\n";<br />
print "4: ".$-x(32-$m)."\n";<br />
print "5: "."<<8*"."\n";<br />
print join".",map{$_&eval"0b".1x$m.$-x(32-$m)."<<8*".$i++.">>24"}split/\./<br />
<code><br />
de nem értem még a darabjait a foreach/map dolognak sem... át kéne alakítsam, ki kéne bontsam és nem akartam vele sok időt elszöszölni....</p>
<p>$i++ ismerős de nem használod sehol... avagy itt egyszerre ki is irja?</p>
<p>ugyanakkor találtam olyan teszt sztringet amitol elfekszik :)<br />
<code><br />
[50.][kecsi@aws]:~/bin> echo "10b/123/izebbb230bcxxx/123545ize0bbbb" | ./ize.pl<br />
1: 123<br />
2: 1x123<br />
3: 04:<br />
5: <<8*<br />
Integer overflow in binary number at (eval 2) line 1, <> line 1.<br />
<code>

bAndie91

cs, 2012-03-29 20:40

Válasz kecsi üzenetére

map-ot használok az egyszerũbb ciklusmagokra (mint ez :-)) mert az egybõl vissza is adja a tömböt, nem kell köztes változót használni.
$i csak arra kell hogy legyen egy 0-tól számláló változóm.
a bemenet 2 tagú kell h legyen (egy / jel van benne).
$- -t át lehet írni 0-ra.
sokat segít az obfuszkálásban a perl gyenge tipusossága.
"m" a kezdõbetũje a beadott string $m -ben tárolt része nevének.
& << >> operátorok bitmũveletekrõl árulkodnak.

további jó dekriptelést!