<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://mars.merhot.dk/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tcj</id>
		<title>Teknologisk videncenter - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://mars.merhot.dk/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tcj"/>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php/Special:Contributions/Tcj"/>
		<updated>2026-04-23T12:37:20Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.29.0</generator>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=TDC_Juniper&amp;diff=20067</id>
		<title>TDC Juniper</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=TDC_Juniper&amp;diff=20067"/>
				<updated>2011-11-09T10:34:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Billag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Juniper=&lt;br /&gt;
==Mandag==&lt;br /&gt;
'''I gang med Juniper'''&lt;br /&gt;
*Software&lt;br /&gt;
*Hardware&lt;br /&gt;
*Konfiguration&lt;br /&gt;
*Hjælp&lt;br /&gt;
'''Basis konfiguration'''&lt;br /&gt;
*Log&lt;br /&gt;
*Tid&lt;br /&gt;
*Brugere&lt;br /&gt;
===Slides===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/f/f1/01.01_-_Juniper_Basics.pdf Juniper Basics]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/8/86/01.02_-_Generel_setup.pdf Generel setup]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/1/15/01.03_-_Generel_udvidet_setup.pdf Generel udvidet setup]&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/0/07/Opgave_1-Basis_config.pdf Opgave 1]&lt;br /&gt;
&lt;br /&gt;
===Bilag===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/d/dd/Login_plan.pdf Login Plan]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/3/37/Konsol_Setup.pdf Konsol Plan]&lt;br /&gt;
&lt;br /&gt;
==Tirsdag==&lt;br /&gt;
'''Routing'''&lt;br /&gt;
*Routing tabellen&lt;br /&gt;
*Statisk Routeing&lt;br /&gt;
*OSPF&lt;br /&gt;
===Slides===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/f/fa/02.01_-_Statisk_Routing.pdf Statisk Routing]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/7/70/02.02_-_Dynamisk_Routing.pdf Dynamisk Routing]&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/3/3c/Opgave_2-Routing.pdf Opgave 2]&lt;br /&gt;
&lt;br /&gt;
===Bilag===&lt;br /&gt;
&lt;br /&gt;
==Onsdag==&lt;br /&gt;
'''Routing'''&lt;br /&gt;
*BGP&lt;br /&gt;
'''Virtual Instances'''&lt;br /&gt;
*Unit interfaces&lt;br /&gt;
*Virtual Routers&lt;br /&gt;
===Slides===&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/e/e0/Opgave_3-Routing_BGP.pdf Opgave 3]&lt;br /&gt;
&lt;br /&gt;
===Bilag===&lt;br /&gt;
&lt;br /&gt;
=Goodies=&lt;br /&gt;
IS-IS opsætning&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[edit protocols isis]&lt;br /&gt;
rael@SRX240#show&lt;br /&gt;
interface ge-0/0/0 {&lt;br /&gt;
  level 2 disable; # Som default kører interfaces L1 og L2 så derfor slår vi L2 Hello's fra.&lt;br /&gt;
}&lt;br /&gt;
interface ge-0/0/1 {&lt;br /&gt;
  level 2 disable;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[edit interfaces]&lt;br /&gt;
rael@SRX240#show&lt;br /&gt;
interface ge-0/0/0 {&lt;br /&gt;
  unit 0 {&lt;br /&gt;
    family iso;&lt;br /&gt;
    family inet address 10.0.0.1/24;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
lo0 {&lt;br /&gt;
  unit 0 {&lt;br /&gt;
    family inet address 192.168.0.1/32;&lt;br /&gt;
    family iso address 49.0001.1921.6800.0001.00;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://www.wtcs.org/snmp4tpc/FILES/Tools/SNMP/getif/getif-2.3.1.zip GetIF version 2.3.1]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=TDC_Juniper&amp;diff=20066</id>
		<title>TDC Juniper</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=TDC_Juniper&amp;diff=20066"/>
				<updated>2011-11-09T10:34:21Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Billag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Juniper=&lt;br /&gt;
==Mandag==&lt;br /&gt;
'''I gang med Juniper'''&lt;br /&gt;
*Software&lt;br /&gt;
*Hardware&lt;br /&gt;
*Konfiguration&lt;br /&gt;
*Hjælp&lt;br /&gt;
'''Basis konfiguration'''&lt;br /&gt;
*Log&lt;br /&gt;
*Tid&lt;br /&gt;
*Brugere&lt;br /&gt;
===Slides===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/f/f1/01.01_-_Juniper_Basics.pdf Juniper Basics]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/8/86/01.02_-_Generel_setup.pdf Generel setup]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/1/15/01.03_-_Generel_udvidet_setup.pdf Generel udvidet setup]&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/0/07/Opgave_1-Basis_config.pdf Opgave 1]&lt;br /&gt;
&lt;br /&gt;
===Bilag===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/d/dd/Login_plan.pdf Login Plan]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/3/37/Konsol_Setup.pdf Konsol Plan]&lt;br /&gt;
&lt;br /&gt;
==Tirsdag==&lt;br /&gt;
'''Routing'''&lt;br /&gt;
*Routing tabellen&lt;br /&gt;
*Statisk Routeing&lt;br /&gt;
*OSPF&lt;br /&gt;
===Slides===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/f/fa/02.01_-_Statisk_Routing.pdf Statisk Routing]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/7/70/02.02_-_Dynamisk_Routing.pdf Dynamisk Routing]&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/3/3c/Opgave_2-Routing.pdf Opgave 2]&lt;br /&gt;
&lt;br /&gt;
===Bilag===&lt;br /&gt;
&lt;br /&gt;
==Onsdag==&lt;br /&gt;
'''Routing'''&lt;br /&gt;
*BGP&lt;br /&gt;
'''Virtual Instances'''&lt;br /&gt;
*Unit interfaces&lt;br /&gt;
*Virtual Routers&lt;br /&gt;
===Slides===&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/e/e0/Opgave_3-Routing_BGP.pdf Opgave 3]&lt;br /&gt;
&lt;br /&gt;
===Billag===&lt;br /&gt;
&lt;br /&gt;
=Goodies=&lt;br /&gt;
IS-IS opsætning&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[edit protocols isis]&lt;br /&gt;
rael@SRX240#show&lt;br /&gt;
interface ge-0/0/0 {&lt;br /&gt;
  level 2 disable; # Som default kører interfaces L1 og L2 så derfor slår vi L2 Hello's fra.&lt;br /&gt;
}&lt;br /&gt;
interface ge-0/0/1 {&lt;br /&gt;
  level 2 disable;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[edit interfaces]&lt;br /&gt;
rael@SRX240#show&lt;br /&gt;
interface ge-0/0/0 {&lt;br /&gt;
  unit 0 {&lt;br /&gt;
    family iso;&lt;br /&gt;
    family inet address 10.0.0.1/24;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
lo0 {&lt;br /&gt;
  unit 0 {&lt;br /&gt;
    family inet address 192.168.0.1/32;&lt;br /&gt;
    family iso address 49.0001.1921.6800.0001.00;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://www.wtcs.org/snmp4tpc/FILES/Tools/SNMP/getif/getif-2.3.1.zip GetIF version 2.3.1]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=TDC_Juniper&amp;diff=20065</id>
		<title>TDC Juniper</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=TDC_Juniper&amp;diff=20065"/>
				<updated>2011-11-09T10:33:59Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Billag */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Juniper=&lt;br /&gt;
==Mandag==&lt;br /&gt;
'''I gang med Juniper'''&lt;br /&gt;
*Software&lt;br /&gt;
*Hardware&lt;br /&gt;
*Konfiguration&lt;br /&gt;
*Hjælp&lt;br /&gt;
'''Basis konfiguration'''&lt;br /&gt;
*Log&lt;br /&gt;
*Tid&lt;br /&gt;
*Brugere&lt;br /&gt;
===Slides===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/f/f1/01.01_-_Juniper_Basics.pdf Juniper Basics]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/8/86/01.02_-_Generel_setup.pdf Generel setup]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/1/15/01.03_-_Generel_udvidet_setup.pdf Generel udvidet setup]&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/0/07/Opgave_1-Basis_config.pdf Opgave 1]&lt;br /&gt;
&lt;br /&gt;
===Bilag===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/d/dd/Login_plan.pdf Login Plan]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/3/37/Konsol_Setup.pdf Konsol Plan]&lt;br /&gt;
&lt;br /&gt;
==Tirsdag==&lt;br /&gt;
'''Routing'''&lt;br /&gt;
*Routing tabellen&lt;br /&gt;
*Statisk Routeing&lt;br /&gt;
*OSPF&lt;br /&gt;
===Slides===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/f/fa/02.01_-_Statisk_Routing.pdf Statisk Routing]&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/7/70/02.02_-_Dynamisk_Routing.pdf Dynamisk Routing]&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/3/3c/Opgave_2-Routing.pdf Opgave 2]&lt;br /&gt;
&lt;br /&gt;
===Billag===&lt;br /&gt;
==Onsdag==&lt;br /&gt;
'''Routing'''&lt;br /&gt;
*BGP&lt;br /&gt;
'''Virtual Instances'''&lt;br /&gt;
*Unit interfaces&lt;br /&gt;
*Virtual Routers&lt;br /&gt;
===Slides===&lt;br /&gt;
&lt;br /&gt;
===Opgaver===&lt;br /&gt;
*[http://mars.tekkom.dk/mediawiki/images/e/e0/Opgave_3-Routing_BGP.pdf Opgave 3]&lt;br /&gt;
&lt;br /&gt;
===Billag===&lt;br /&gt;
&lt;br /&gt;
=Goodies=&lt;br /&gt;
IS-IS opsætning&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[edit protocols isis]&lt;br /&gt;
rael@SRX240#show&lt;br /&gt;
interface ge-0/0/0 {&lt;br /&gt;
  level 2 disable; # Som default kører interfaces L1 og L2 så derfor slår vi L2 Hello's fra.&lt;br /&gt;
}&lt;br /&gt;
interface ge-0/0/1 {&lt;br /&gt;
  level 2 disable;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[edit interfaces]&lt;br /&gt;
rael@SRX240#show&lt;br /&gt;
interface ge-0/0/0 {&lt;br /&gt;
  unit 0 {&lt;br /&gt;
    family iso;&lt;br /&gt;
    family inet address 10.0.0.1/24;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
lo0 {&lt;br /&gt;
  unit 0 {&lt;br /&gt;
    family inet address 192.168.0.1/32;&lt;br /&gt;
    family iso address 49.0001.1921.6800.0001.00;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Links=&lt;br /&gt;
*[http://www.wtcs.org/snmp4tpc/FILES/Tools/SNMP/getif/getif-2.3.1.zip GetIF version 2.3.1]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Net::SNMP_vis_interface_med_request_get&amp;diff=9929</id>
		<title>Net::SNMP vis interface med request get</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Net::SNMP_vis_interface_med_request_get&amp;diff=9929"/>
				<updated>2009-11-12T10:54:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Hvad gør scriptet=&lt;br /&gt;
Scriptet finder alle interfaces i udstyret. Derefter beder det efter det interface der skal undersøges.&lt;br /&gt;
&lt;br /&gt;
Herefter vises diverse tællere og anden information for interfacet.&lt;br /&gt;
&lt;br /&gt;
==Output fra script==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Indtast ip eller host: localhost&lt;br /&gt;
Henter antal interfaces: &lt;br /&gt;
 - Der er 5 interfaces.&lt;br /&gt;
Følgende findes:&lt;br /&gt;
1 - lo&lt;br /&gt;
2 - eth0&lt;br /&gt;
3 - wmaster0&lt;br /&gt;
4 - wlan0&lt;br /&gt;
5 - pan0&lt;br /&gt;
Hvilket interface skal vises. Vælg mellem 1 og 5: 4&lt;br /&gt;
    InOctets --&amp;gt; 53325141&lt;br /&gt;
         MAC --&amp;gt; 0x001cbf53933c&lt;br /&gt;
    InErrors --&amp;gt; 0&lt;br /&gt;
   OutOctets --&amp;gt; 5236357&lt;br /&gt;
         MTU --&amp;gt; 1500&lt;br /&gt;
        Type --&amp;gt; 6&lt;br /&gt;
       Speed --&amp;gt; 10000000&lt;br /&gt;
 AdminStatus --&amp;gt; 1&lt;br /&gt;
   OutErrors --&amp;gt; 0&lt;br /&gt;
 Description --&amp;gt; wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Koden==&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#######################################&lt;br /&gt;
# Author: Tomas Jensen / TDC          #&lt;br /&gt;
# Email.: tcj@tdc.dk                  #&lt;br /&gt;
#######################################&lt;br /&gt;
#&lt;br /&gt;
### Pragma's&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
#use Socket;&lt;br /&gt;
use Net::SNMP qw(:snmp);&lt;br /&gt;
use snmpsubs;&lt;br /&gt;
&lt;br /&gt;
my $IfNumbers = '1.3.6.1.2.1.2.1.0';&lt;br /&gt;
my $IfListStart ='1.3.6.1.2.1.2.2.1.';&lt;br /&gt;
my %IfProp = (&amp;quot;Description&amp;quot;=&amp;gt;2,&lt;br /&gt;
			  &amp;quot;Type&amp;quot;=&amp;gt;3,&lt;br /&gt;
			  &amp;quot;MTU&amp;quot;=&amp;gt;4,&lt;br /&gt;
			  &amp;quot;Speed&amp;quot;=&amp;gt;5,&lt;br /&gt;
			  &amp;quot;MAC&amp;quot;=&amp;gt;6,&lt;br /&gt;
			  &amp;quot;AdminStatus&amp;quot;=&amp;gt;7,&lt;br /&gt;
			  &amp;quot;InOctets&amp;quot;=&amp;gt;10,&lt;br /&gt;
			  &amp;quot;OutOctets&amp;quot;=&amp;gt;16,&lt;br /&gt;
			  &amp;quot;InErrors&amp;quot;=&amp;gt;14,&lt;br /&gt;
			  &amp;quot;OutErrors&amp;quot;=&amp;gt;20&lt;br /&gt;
			  );&lt;br /&gt;
my $intnr;&lt;br /&gt;
my %interfaces;&lt;br /&gt;
my $interface;&lt;br /&gt;
my $key;&lt;br /&gt;
my $value;&lt;br /&gt;
my $ip;&lt;br /&gt;
my $addr;&lt;br /&gt;
my @result;&lt;br /&gt;
my $i;&lt;br /&gt;
&lt;br /&gt;
#################### SUBS ######################&lt;br /&gt;
# Alle subrutiner ligger i snmpsubs.pm&lt;br /&gt;
&lt;br /&gt;
##################### MAIN ######################&lt;br /&gt;
&lt;br /&gt;
foreach (@INC){&lt;br /&gt;
	print &amp;quot;&amp;gt;$_\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
print &amp;quot;Indtast ip eller host: &amp;quot;;&lt;br /&gt;
my $host = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $host;&lt;br /&gt;
&lt;br /&gt;
$ip = snmpsubs-&amp;gt;RealIp($host);&lt;br /&gt;
&lt;br /&gt;
## Sæt session op&lt;br /&gt;
my ($session, $error) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
			 -hostname =&amp;gt; $ip,&lt;br /&gt;
             -version  =&amp;gt; '2c', );&lt;br /&gt;
 &lt;br /&gt;
	if (!defined($session)) {&lt;br /&gt;
		printf(&amp;quot;Kan ikke åbne session til $host fejl: $error\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
## Hent interface antal&lt;br /&gt;
print &amp;quot;Henter antal interfaces: \n&amp;quot;;&lt;br /&gt;
printf &amp;quot; - Der er %s interfaces.\n&amp;quot;, ($intnr = snmpsubs-&amp;gt;GetIntNrs ($session));&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Følgende findes:\n&amp;quot;;&lt;br /&gt;
for ($i = 1; $i &amp;lt;= $intnr; $i++) {&lt;br /&gt;
	printf &amp;quot;%s - %s\n&amp;quot;, $i, (snmpsubs-&amp;gt;GetIntInfo ($session, &amp;quot;$IfListStart&amp;quot;.&amp;quot;$IfProp{'Description'}&amp;quot;.&amp;quot;.$i&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Hvilket interface skal vises&lt;br /&gt;
print &amp;quot;Hvilket interface skal vises. Vælg mellem 1 og $intnr: &amp;quot;;&lt;br /&gt;
$interface = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $interface;&lt;br /&gt;
&lt;br /&gt;
if ( $interface &amp;gt;= $intnr ) {&lt;br /&gt;
	print &amp;quot;Dette interface findes ikke...\n&amp;quot;;&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Præsenter interfacet&lt;br /&gt;
foreach $key ( keys %IfProp ){&lt;br /&gt;
	printf &amp;quot;%12s --&amp;gt; %s\n&amp;quot;, $key, (snmpsubs-&amp;gt;GetIntInfo ($session, &amp;quot;$IfListStart&amp;quot;.&amp;quot;$IfProp{$key}&amp;quot;.&amp;quot;.$interface&amp;quot;));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Snmpsubs.pm===&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
package snmpsubs;&lt;br /&gt;
&lt;br /&gt;
# Filename: snmpsubs.pm&lt;br /&gt;
&lt;br /&gt;
use base 'Exporter';&lt;br /&gt;
our @EXPORT_OK = qw(RealIp GetIntNrs GetIntInfo);&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
use Socket;&lt;br /&gt;
use Net::SNMP qw(:snmp);&lt;br /&gt;
&lt;br /&gt;
my $IfNumbers = '1.3.6.1.2.1.2.1.0';&lt;br /&gt;
my $IfListStart ='1.3.6.1.2.1.2.2.1.';&lt;br /&gt;
my %IfProp = (&amp;quot;Description&amp;quot;=&amp;gt;2,&lt;br /&gt;
			  &amp;quot;Type&amp;quot;=&amp;gt;3,&lt;br /&gt;
			  &amp;quot;MTU&amp;quot;=&amp;gt;4,&lt;br /&gt;
			  &amp;quot;Speed&amp;quot;=&amp;gt;5,&lt;br /&gt;
			  &amp;quot;MAC&amp;quot;=&amp;gt;6,&lt;br /&gt;
			  &amp;quot;AdminStatus&amp;quot;=&amp;gt;7,&lt;br /&gt;
			  &amp;quot;InOctets&amp;quot;=&amp;gt;10,&lt;br /&gt;
			  &amp;quot;OutOctets&amp;quot;=&amp;gt;16,&lt;br /&gt;
			  &amp;quot;InErrors&amp;quot;=&amp;gt;14,&lt;br /&gt;
			  &amp;quot;OutErrors&amp;quot;=&amp;gt;20&lt;br /&gt;
			  );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
sub RealIp {&lt;br /&gt;
	## Find real ip address&lt;br /&gt;
	shift;&lt;br /&gt;
	my $pip = shift;&lt;br /&gt;
	my $addr;&lt;br /&gt;
	print &amp;quot;RI $pip\n&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	if ( $pip =~ /^[1-9][0-9]*\.[0-9]+\.[0-9]+\.[0-9]+$/ ){&lt;br /&gt;
		# Vi har en aegte ip&lt;br /&gt;
		return $pip;&lt;br /&gt;
	} else {&lt;br /&gt;
		if ( $pip =~ /^0.*/ ) {&lt;br /&gt;
			# Fjern indledende 0'er&lt;br /&gt;
			$pip =~ s/^0+//;&lt;br /&gt;
			return $pip;&lt;br /&gt;
		} else {&lt;br /&gt;
			# lav get host by name&lt;br /&gt;
			$addr = inet_aton(&amp;quot;$pip&amp;quot;);&lt;br /&gt;
			$addr = inet_ntoa ($addr);&lt;br /&gt;
			if ( defined $addr ){&lt;br /&gt;
				return $addr;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetIntNrs {&lt;br /&gt;
	## Find og returner antal interfaces&lt;br /&gt;
	# Input  : session&lt;br /&gt;
	# OutPut : antal If&lt;br /&gt;
	&lt;br /&gt;
	shift;&lt;br /&gt;
	my $session = shift;&lt;br /&gt;
	my $OID;&lt;br /&gt;
	my $ifn;&lt;br /&gt;
&lt;br /&gt;
	my $result = $session-&amp;gt;get_request(&lt;br /&gt;
					-varbindlist =&amp;gt; [$IfNumbers]);&lt;br /&gt;
	&lt;br /&gt;
	if ( ! defined $result) {&lt;br /&gt;
		die &amp;quot;Arrrrr - Kiks i GetIntNrs!!!\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	($OID, $ifn) = each %{$result};&lt;br /&gt;
	&lt;br /&gt;
	return $ifn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetIntInfo {&lt;br /&gt;
	## Hent et interface&lt;br /&gt;
	# Input  : session&lt;br /&gt;
	# Input  : OID&lt;br /&gt;
	# Output : Tekstinfo&lt;br /&gt;
	&lt;br /&gt;
	shift;&lt;br /&gt;
	my $session = shift;&lt;br /&gt;
	my $OID = shift;&lt;br /&gt;
	my $info;&lt;br /&gt;
	my $result = $session-&amp;gt;get_request(&lt;br /&gt;
					-varbindlist =&amp;gt; [$OID]);&lt;br /&gt;
	&lt;br /&gt;
	if ( ! defined $result) {&lt;br /&gt;
		die &amp;quot;Arrrrr - Kiks i GetIntInfo!!!\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	($OID, $info) = each %{$result};&lt;br /&gt;
	return $info;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
1;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 09:45, 12 November 2009 (CET)&lt;br /&gt;
[[Category:Perl]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Net::SNMP_vis_interface_med_request_get&amp;diff=9925</id>
		<title>Net::SNMP vis interface med request get</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Net::SNMP_vis_interface_med_request_get&amp;diff=9925"/>
				<updated>2009-11-12T09:53:35Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
=Hvad gør scriptet=&lt;br /&gt;
Scriptet finder alle interfaces i udstyret. Derefter beder det efter det interface der skal undersøges.&lt;br /&gt;
&lt;br /&gt;
Herefter vises diverse tællere og anden information for interfacet.&lt;br /&gt;
&lt;br /&gt;
==Output fra script==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Indtast ip eller host: localhost&lt;br /&gt;
Henter antal interfaces: &lt;br /&gt;
 - Der er 5 interfaces.&lt;br /&gt;
Følgende findes:&lt;br /&gt;
1 - lo&lt;br /&gt;
2 - eth0&lt;br /&gt;
3 - wmaster0&lt;br /&gt;
4 - wlan0&lt;br /&gt;
5 - pan0&lt;br /&gt;
Hvilket interface skal vises. Vælg mellem 1 og 5: 4&lt;br /&gt;
    InOctets --&amp;gt; 53325141&lt;br /&gt;
         MAC --&amp;gt; 0x001cbf53933c&lt;br /&gt;
    InErrors --&amp;gt; 0&lt;br /&gt;
   OutOctets --&amp;gt; 5236357&lt;br /&gt;
         MTU --&amp;gt; 1500&lt;br /&gt;
        Type --&amp;gt; 6&lt;br /&gt;
       Speed --&amp;gt; 10000000&lt;br /&gt;
 AdminStatus --&amp;gt; 1&lt;br /&gt;
   OutErrors --&amp;gt; 0&lt;br /&gt;
 Description --&amp;gt; wlan0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Koden==&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#######################################&lt;br /&gt;
# Author: Tomas Jensen / TDC          #&lt;br /&gt;
# Email.: tcj@tdc.dk                  #&lt;br /&gt;
#######################################&lt;br /&gt;
#&lt;br /&gt;
### Pragma's&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use Socket;&lt;br /&gt;
use Net::SNMP qw(:snmp);&lt;br /&gt;
&lt;br /&gt;
my $IfNumbers = '1.3.6.1.2.1.2.1.0';&lt;br /&gt;
my $IfListStart ='1.3.6.1.2.1.2.2.1.';&lt;br /&gt;
my %IfProp = (&amp;quot;Description&amp;quot;=&amp;gt;2,&lt;br /&gt;
			  &amp;quot;Type&amp;quot;=&amp;gt;3,&lt;br /&gt;
			  &amp;quot;MTU&amp;quot;=&amp;gt;4,&lt;br /&gt;
			  &amp;quot;Speed&amp;quot;=&amp;gt;5,&lt;br /&gt;
			  &amp;quot;MAC&amp;quot;=&amp;gt;6,&lt;br /&gt;
			  &amp;quot;AdminStatus&amp;quot;=&amp;gt;7,&lt;br /&gt;
			  &amp;quot;InOctets&amp;quot;=&amp;gt;10,&lt;br /&gt;
			  &amp;quot;OutOctets&amp;quot;=&amp;gt;16,&lt;br /&gt;
			  &amp;quot;InErrors&amp;quot;=&amp;gt;14,&lt;br /&gt;
			  &amp;quot;OutErrors&amp;quot;=&amp;gt;20&lt;br /&gt;
			  );&lt;br /&gt;
my $intnr;&lt;br /&gt;
my %interfaces;&lt;br /&gt;
my $interface;&lt;br /&gt;
my $key;&lt;br /&gt;
my $value;&lt;br /&gt;
my $ip;&lt;br /&gt;
my $addr;&lt;br /&gt;
my @result;&lt;br /&gt;
my $i;&lt;br /&gt;
&lt;br /&gt;
#################### SUBS ######################&lt;br /&gt;
&lt;br /&gt;
sub RealIp {&lt;br /&gt;
	## Find real ip address&lt;br /&gt;
	my $pip = shift;&lt;br /&gt;
	&lt;br /&gt;
	if ( $pip =~ /^[1-9][0-9]*\.[0-9]+\.[0-9]+\.[0-9]+$/ ){&lt;br /&gt;
		# Vi har en aegte ip&lt;br /&gt;
		return $pip;&lt;br /&gt;
	} else {&lt;br /&gt;
		if ( $pip =~ /^0.*/ ) {&lt;br /&gt;
			# Fjern indledende 0'er&lt;br /&gt;
			$pip =~ s/^0+//;&lt;br /&gt;
			return $pip;&lt;br /&gt;
		} else {&lt;br /&gt;
			# lav get host by name&lt;br /&gt;
			$addr = inet_aton(&amp;quot;$pip&amp;quot;);&lt;br /&gt;
			$addr = inet_ntoa ($addr);&lt;br /&gt;
			if ( defined $addr ){&lt;br /&gt;
				return $addr;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetIntNrs {&lt;br /&gt;
	## Find og returner antal interfaces&lt;br /&gt;
	# Input  : session&lt;br /&gt;
	# OutPut : antal If&lt;br /&gt;
	&lt;br /&gt;
	my $session = shift;&lt;br /&gt;
	my $OID;&lt;br /&gt;
	my $ifn;&lt;br /&gt;
&lt;br /&gt;
	my $result = $session-&amp;gt;get_request(&lt;br /&gt;
					-varbindlist =&amp;gt; [$IfNumbers]);&lt;br /&gt;
	&lt;br /&gt;
	if ( ! defined $result) {&lt;br /&gt;
		print &amp;quot;Arrrrr - Kiks i GetIntNrs!!!\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	($OID, $ifn) = each %{$result};&lt;br /&gt;
	&lt;br /&gt;
	return $ifn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetIntInfo {&lt;br /&gt;
	## Hent et interface&lt;br /&gt;
	# Input  : session&lt;br /&gt;
	# Input  : OID&lt;br /&gt;
	# Output : Tekstinfo&lt;br /&gt;
	&lt;br /&gt;
	my $session = shift;&lt;br /&gt;
	my $OID = shift;&lt;br /&gt;
	my $info;&lt;br /&gt;
	my $result = $session-&amp;gt;get_request(&lt;br /&gt;
					-varbindlist =&amp;gt; [$OID]);&lt;br /&gt;
	&lt;br /&gt;
	if ( ! defined $result) {&lt;br /&gt;
		print &amp;quot;Arrrrr - Kiks i GetIntInfo!!!\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	($OID, $info) = each %{$result};&lt;br /&gt;
	return $info;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
##################### MAIN ######################&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Indtast ip eller host: &amp;quot;;&lt;br /&gt;
my $host = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $host;&lt;br /&gt;
&lt;br /&gt;
$ip = RealIp($host);&lt;br /&gt;
&lt;br /&gt;
## Sæt session op&lt;br /&gt;
my ($session, $error) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
			 -hostname =&amp;gt; $ip,&lt;br /&gt;
             -version  =&amp;gt; '2c', );&lt;br /&gt;
 &lt;br /&gt;
	if (!defined($session)) {&lt;br /&gt;
		printf(&amp;quot;Kan ikke åbne session til $host fejl: $error\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
## Hent interface antal&lt;br /&gt;
print &amp;quot;Henter antal interfaces: \n&amp;quot;;&lt;br /&gt;
printf &amp;quot; - Der er %s interfaces.\n&amp;quot;, ($intnr = GetIntNrs $session);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Følgende findes:\n&amp;quot;;&lt;br /&gt;
for ($i = 1; $i &amp;lt;= $intnr; $i++) {&lt;br /&gt;
	printf &amp;quot;%s - %s\n&amp;quot;, $i, (GetIntInfo $session, &amp;quot;$IfListStart&amp;quot;.&amp;quot;$IfProp{'Description'}&amp;quot;.&amp;quot;.$i&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Hvilket interface skal vises&lt;br /&gt;
print &amp;quot;Hvilket interface skal vises. Vælg mellem 1 og $intnr: &amp;quot;;&lt;br /&gt;
$interface = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $interface;&lt;br /&gt;
&lt;br /&gt;
if ( $interface &amp;gt;= $intnr ) {&lt;br /&gt;
	print &amp;quot;Dette interface findes ikke...\n&amp;quot;;&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Præsenter interfacet&lt;br /&gt;
foreach $key ( keys %IfProp ){&lt;br /&gt;
	printf &amp;quot;%12s --&amp;gt; %s\n&amp;quot;, $key, (GetIntInfo $session, &amp;quot;$IfListStart&amp;quot;.&amp;quot;$IfProp{$key}&amp;quot;.&amp;quot;.$interface&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 09:45, 12 November 2009 (CET)&lt;br /&gt;
[[Category:Perl]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9924</id>
		<title>TDC BB-TEL efterår 2009</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9924"/>
				<updated>2009-11-12T08:47:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Links til eksempler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
= UGE 35 - 2009 UNIX=&lt;br /&gt;
BBtel&lt;br /&gt;
== Få fat i maskinen udefra ==&lt;br /&gt;
I putty skriv '''mars.tekkom.dk''' i '''hostname'''&lt;br /&gt;
&lt;br /&gt;
== Kursustider ==&lt;br /&gt;
*Tirsdag 09:15 - 15:25&lt;br /&gt;
*Onsdag og torsdag: 08:15 - 15:25&lt;br /&gt;
*Frokost alle dage 12:00&lt;br /&gt;
=== Fjernundervisning ===&lt;br /&gt;
* Tirsdag den 1. september kl. 09:00 (Varighed cirka 2 timer)&lt;br /&gt;
* Tirsdag den 15. september kl. 09:00 (Varighed cirka 2 timer)&lt;br /&gt;
== Putty ==&lt;br /&gt;
*[http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe download Putty.exe]&lt;br /&gt;
== Opgaver i klassen ==&lt;br /&gt;
*[[media:Shell script opgave menu.pdf|Lav et menuprogram i bash opgave]]&lt;br /&gt;
*[[UNIX opgave Apache Access log]]&lt;br /&gt;
*[[UNIX opgaver]]&lt;br /&gt;
&lt;br /&gt;
== Valgfrie opgaver ==&lt;br /&gt;
*[[UNIX assignments]]&lt;br /&gt;
== Notater ==&lt;br /&gt;
=== Sende mail ===&lt;br /&gt;
At sende emails er nemt i UNIX&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[root@mars ~]#&amp;lt;input&amp;gt;echo &amp;quot;Buh&amp;quot; | mail -s &amp;quot;Vigtig&amp;quot; heth@mercantec.dk&amp;lt;/input&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At sende mange mail er  også nemt&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
LIST=&amp;quot;bent ole hans@hudj.dk kurt@smurt.dk&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for i in $LIST&lt;br /&gt;
do&lt;br /&gt;
  echo &amp;quot;Buy stuff for free&amp;quot; | mail -s &amp;quot;Important&amp;quot; $i&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ping og /dev/null ===&lt;br /&gt;
I eksemplet nedenunder sendes 1 pingpakke (-c 1) til IP adressen 192.168.22.22 og der ventes maksimalt 1 sekund på svaret (-t 1). STDOUT fra ping er omdirigeret til ''/dev/null'' som er skraldespanden. STDERR er omdirigeret til samme sted som STDOUT altså ''/dev/null''&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
if ping -t 1 -c 1 192.168.22.22 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 then echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 else echo &amp;quot;Fejl&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ting der har drillet ==&lt;br /&gt;
Kommandoen '''date +%m''' returner månedsnummeret feks '''08''' for august. imidlertidigt var tallet markeret som tekst og vi kunne ikke bruge det ved beregninger. Derfor skal tallet konverteres til Integer(heltal) og sortere det foranstillede 0 væk.&lt;br /&gt;
=== Perl løsning ===&lt;br /&gt;
En one-liner perl kan løse problemet&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
 #!/usr/bin/bash&lt;br /&gt;
 MONTHS=(Januar Februar Marts April Maj juni Juli August September Oktober November December)&lt;br /&gt;
&lt;br /&gt;
let MD=`date +%m | perl -ne '/0?(.*)/;print $1'`-1&lt;br /&gt;
echo &amp;quot;Det er maaned: ${MONTHS[$MD]}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sed løsning ===&lt;br /&gt;
En one liner sed (Serial Editor). En editor næsten som '''vi''', bare beregnet til at bruge i scripts.&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
 MONTHS=(Januar Februar Marts April Maj juni Juli August September Oktober November December)&lt;br /&gt;
&lt;br /&gt;
let MD=`date +%m | sed 's/0*//'`-1&lt;br /&gt;
echo &amp;quot;Det er maaned: ${MONTHS[$MD]}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
    &lt;br /&gt;
    pre {   font-family: Lucida Console; font-weight: bold; font-size: 10px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==  Links til UNIX ==&lt;br /&gt;
*[[UNIX commands|Grundlæggende UNIX kommandoer]]&lt;br /&gt;
*[[bash|bash kommandofortolker]]&lt;br /&gt;
*[[Mit første bash shellscript]]&lt;br /&gt;
*[http://www.retsforbundet.dk/politik/tema/software/vi-sheet.pdf vi editor oversigt skema]&lt;br /&gt;
*[http://www.retsforbundet.dk/politik/tema/software/software.htm software]&lt;br /&gt;
*[http://www.linuxbog.dk/?t=PDF En masse gode Linuxbøger på dansk]&lt;br /&gt;
*[http://www.freebsd.org FreeBSD's hjemmeside] og [ftp://ftp.freebsd.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/handbook/book.pdf.zip FreeBSD håndbogen (Engelsk PDF)]&lt;br /&gt;
*[http://www.freebsdwiki.net/index.php/Main_Page FreeBSD WIKI]&lt;br /&gt;
*[http://centos.org/ Linux distributionen CentOS]&lt;br /&gt;
*[[Bash examples]]&lt;br /&gt;
*[http://www.i-am-bored.com/bored_link.cfm?link_id=31365 The WEB server is down]&lt;br /&gt;
=== Virtualisering ===&lt;br /&gt;
*[http://www.virtualbox.org/wiki/Downloads Download Sun VirtualBox] (Anbefalet for begyndere)&lt;br /&gt;
*[http://downloads.vmware.com/d/info/datacenter_downloads/vmware_server/2_0 WMware Server]&lt;br /&gt;
&lt;br /&gt;
=== Distributioner ===&lt;br /&gt;
*[http://ftp.klid.dk/ftp/centos/5.3/isos/i386/CentOS-5.3-i386-bin-DVD.iso CentOS 5.3] Server installation (Anbefalet for begýndere)&lt;br /&gt;
**Se artiklen [[Sun VirtualBox installation af CentOS]]&lt;br /&gt;
*[http://www.ubuntu.com/getubuntu/download Ubuntu Linux download] klient installation (Anbefalet for begýndere)&lt;br /&gt;
*[ftp://ftp.dk.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/7.2/ FreeBSD 7.2 Download] (FreeBSD er sværere at installere end Ubuntu]&lt;br /&gt;
&lt;br /&gt;
= UGE 40 - 2009 Perl =&lt;br /&gt;
:Undervisningen er blandt andet baseret på bogen [http://oreilly.com/catalog/9780596520106/?CMP=AFC-ak_book&amp;amp;ATT=Learning+Perl,+Fifth+Edition, Learning perl], og det er netop formålet med kurset - at lære Perl. Bogen udleveres på kurset. Eksemplerne under kurset vil dreje sig om netværk og netværksovervågning.&lt;br /&gt;
*Udvikling på UNIX og Windows. På Windows anvendes [http://www.activestate.com/activeperl/ ActivePerl] med [http://www.perl-express.com/download.html Perl Express] som IDE.&lt;br /&gt;
** Hent [http://mars.tekkom.dk/sw/ActivePerl-5.8.9.826-MSWin32-x86-290470.msi ActivePerl] her.&lt;br /&gt;
** Hent [http://mars.tekkom.dk/sw/PeSetup25.exe Perl Express] her&lt;br /&gt;
== Kursustider ==&lt;br /&gt;
*Tirsdag den 29. september kl 09:15 - 15:25&lt;br /&gt;
*Onsdag den 30. september kl 08:15 - 15:25&lt;br /&gt;
*Torsdag den 1. oktober kl 08:15 - 15:25&lt;br /&gt;
=== Fjernundervisning ===&lt;br /&gt;
*Tirsdag den 6. oktober kl 09:00 - 11:00 (Uge 41)&lt;br /&gt;
*Fredag den 23. oktober kl 09:00 - 11:00 (Uge 43)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*Opkobling til Cisco udstyr med Telnet med modulet [[Net::Telnet::Cisco]]&lt;br /&gt;
== PI program ==&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
######################&lt;br /&gt;
# Program name: pi&lt;br /&gt;
#&lt;br /&gt;
# Abstract....: Beregen PI med en million udregninger&lt;br /&gt;
#               Anvender formlen: pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9....&lt;br /&gt;
#&lt;br /&gt;
# Auther......: Henrik Thomsen/Mercantec&lt;br /&gt;
# Email.......: heth@mercantec.dk&lt;br /&gt;
######################&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my $pi4=1;&lt;br /&gt;
&lt;br /&gt;
for (my $count=3; $count &amp;lt; 2*1000_000+3; $count+=4) {&lt;br /&gt;
	$pi4=$pi4-1/$count;&lt;br /&gt;
	$pi4=$pi4+1/($count+2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;PI = &amp;quot;,$pi4*4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Løsninger på Perlprogrammer==&lt;br /&gt;
[[Talk:TDC BB-TEL efterår 2009|Perl løsninger efterår 2009]]&lt;br /&gt;
&lt;br /&gt;
= UGE 46 - Network Management =&lt;br /&gt;
:Projektorienteret kursus hvor målet er at opnå erfaring med programmering af automatiseret netværksovervågning. Kurset er blandt andet baseret blandt andet på bogen [http://my.safaribooksonline.com/0596008406 Essential SNMP] som udleveres.&lt;br /&gt;
*Mandag den 9. november kl 09:15 - 15:25&lt;br /&gt;
*Tirsdag den 10. november kl 08:15 - 15:25&lt;br /&gt;
*Onsdag den 11. november kl 08:15 - 15:25&lt;br /&gt;
*Torsdag den 12. november kl 08:15 - 15:25&lt;br /&gt;
*Fredag den 13. november kl 08:15 - 12:00&lt;br /&gt;
&lt;br /&gt;
*Frokost alle dage kl 12:15&lt;br /&gt;
== Emner i ugen ==&lt;br /&gt;
=== Opgaver ===&lt;br /&gt;
*[[Perl check program oplæg |Check program]]&lt;br /&gt;
==== Nagios på CentOS 5.2 ====&lt;br /&gt;
= Install rpmforge-release =&lt;br /&gt;
Get newest [http://packages.sw.be/rpmforge-release/ rpmforge-release for your release]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cli&amp;quot;&amp;gt;&lt;br /&gt;
[root@fog1 ~]# &amp;lt;input&amp;gt;cd /tmp&amp;lt;/input&amp;gt;&lt;br /&gt;
[root@fog1 tmp]# &amp;lt;input&amp;gt;wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm&amp;lt;/input&amp;gt;&lt;br /&gt;
[root@fog1 tmp]# &amp;lt;input&amp;gt;rpm -i rpmforge-release-0.3.6-1.el5.rf.i386.rpm&amp;lt;/input&amp;gt;&lt;br /&gt;
[root@fog1 tmp]# &amp;lt;input&amp;gt;rpm -qi rpmforge-release&amp;lt;/input&amp;gt;&lt;br /&gt;
Description :&lt;br /&gt;
RPMforge.net release file. This package contains apt, yum and smart&lt;br /&gt;
configuration for the RPMforge RPM Repository, as well as the public&lt;br /&gt;
GPG keys used to sign them.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*[http://wiki.centos.org/HowTos/Nagios#head-40b5407234af158bb3663ff160c797a4b60ad02f Nagios på CentOS]&lt;br /&gt;
&lt;br /&gt;
=== Links til eksempler ===&lt;br /&gt;
*[[Perl module chkIPadr]]&lt;br /&gt;
*[[Net::SNMP eksempel]]&lt;br /&gt;
*[[Net::SNMP vis interface med request get]]&lt;br /&gt;
*[[Nagios check_weather]]&lt;br /&gt;
&lt;br /&gt;
=== Teknologier ===&lt;br /&gt;
*SNMP&lt;br /&gt;
*RMON&lt;br /&gt;
*NetFlow&lt;br /&gt;
*Nagios teori opsætning [http://mars.tekkom.dk/nagios/index.html http://mars.tekkom.dk/nagios/index.html]&lt;br /&gt;
**Perl plugins&lt;br /&gt;
*SNMP opsamling af OID&lt;br /&gt;
*Ericsson telnet&lt;br /&gt;
*[[TR-069]] afløser for SNMP DSL modemmer&lt;br /&gt;
&lt;br /&gt;
=== Software ===&lt;br /&gt;
*GetIF http://mars.tekkom.dk/sw/getif-2.3.1.zip&lt;br /&gt;
[[Category:OLC]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Net::SNMP_vis_interface_med_request_get&amp;diff=9923</id>
		<title>Net::SNMP vis interface med request get</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Net::SNMP_vis_interface_med_request_get&amp;diff=9923"/>
				<updated>2009-11-12T08:45:43Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: New page: &amp;lt;source lang=perl&amp;gt; #!/usr/bin/perl ####################################### # Author: Tomas Jensen / TDC          # # Email.: tcj@tdc.dk                  # #################################...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#######################################&lt;br /&gt;
# Author: Tomas Jensen / TDC          #&lt;br /&gt;
# Email.: tcj@tdc.dk                  #&lt;br /&gt;
#######################################&lt;br /&gt;
#&lt;br /&gt;
### Pragma's&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use Socket;&lt;br /&gt;
use Net::SNMP qw(:snmp);&lt;br /&gt;
&lt;br /&gt;
my $IfNumbers = '1.3.6.1.2.1.2.1.0';&lt;br /&gt;
my $IfListStart ='1.3.6.1.2.1.2.2.1.';&lt;br /&gt;
my %IfProp = (&amp;quot;Description&amp;quot;=&amp;gt;2,&lt;br /&gt;
			  &amp;quot;Type&amp;quot;=&amp;gt;3,&lt;br /&gt;
			  &amp;quot;MTU&amp;quot;=&amp;gt;4,&lt;br /&gt;
			  &amp;quot;Speed&amp;quot;=&amp;gt;5,&lt;br /&gt;
			  &amp;quot;MAC&amp;quot;=&amp;gt;6,&lt;br /&gt;
			  &amp;quot;AdminStatus&amp;quot;=&amp;gt;7,&lt;br /&gt;
			  &amp;quot;InOctets&amp;quot;=&amp;gt;10,&lt;br /&gt;
			  &amp;quot;OutOctets&amp;quot;=&amp;gt;16,&lt;br /&gt;
			  &amp;quot;InErrors&amp;quot;=&amp;gt;14,&lt;br /&gt;
			  &amp;quot;OutErrors&amp;quot;=&amp;gt;20&lt;br /&gt;
			  );&lt;br /&gt;
my $intnr;&lt;br /&gt;
my %interfaces;&lt;br /&gt;
my $interface;&lt;br /&gt;
my $key;&lt;br /&gt;
my $value;&lt;br /&gt;
my $ip;&lt;br /&gt;
my $addr;&lt;br /&gt;
my @result;&lt;br /&gt;
my $i;&lt;br /&gt;
&lt;br /&gt;
#################### SUBS ######################&lt;br /&gt;
&lt;br /&gt;
sub RealIp {&lt;br /&gt;
	## Find real ip address&lt;br /&gt;
	my $pip = shift;&lt;br /&gt;
	&lt;br /&gt;
	if ( $pip =~ /^[1-9][0-9]*\.[0-9]+\.[0-9]+\.[0-9]+$/ ){&lt;br /&gt;
		# Vi har en aegte ip&lt;br /&gt;
		return $pip;&lt;br /&gt;
	} else {&lt;br /&gt;
		if ( $pip =~ /^0.*/ ) {&lt;br /&gt;
			# Fjern indledende 0'er&lt;br /&gt;
			$pip =~ s/^0+//;&lt;br /&gt;
			return $pip;&lt;br /&gt;
		} else {&lt;br /&gt;
			# lav get host by name&lt;br /&gt;
			$addr = inet_aton(&amp;quot;$pip&amp;quot;);&lt;br /&gt;
			$addr = inet_ntoa ($addr);&lt;br /&gt;
			if ( defined $addr ){&lt;br /&gt;
				return $addr;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetIntNrs {&lt;br /&gt;
	## Find og returner antal interfaces&lt;br /&gt;
	# Input  : session&lt;br /&gt;
	# OutPut : antal If&lt;br /&gt;
	&lt;br /&gt;
	my $session = shift;&lt;br /&gt;
	my $OID;&lt;br /&gt;
	my $ifn;&lt;br /&gt;
&lt;br /&gt;
	my $result = $session-&amp;gt;get_request(&lt;br /&gt;
					-varbindlist =&amp;gt; [$IfNumbers]);&lt;br /&gt;
	&lt;br /&gt;
	if ( ! defined $result) {&lt;br /&gt;
		print &amp;quot;Arrrrr - Kiks i GetIntNrs!!!\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	($OID, $ifn) = each %{$result};&lt;br /&gt;
	&lt;br /&gt;
	return $ifn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub GetIntInfo {&lt;br /&gt;
	## Hent et interface&lt;br /&gt;
	# Input  : session&lt;br /&gt;
	# Input  : OID&lt;br /&gt;
	# Output : Tekstinfo&lt;br /&gt;
	&lt;br /&gt;
	my $session = shift;&lt;br /&gt;
	my $OID = shift;&lt;br /&gt;
	my $info;&lt;br /&gt;
	my $result = $session-&amp;gt;get_request(&lt;br /&gt;
					-varbindlist =&amp;gt; [$OID]);&lt;br /&gt;
	&lt;br /&gt;
	if ( ! defined $result) {&lt;br /&gt;
		print &amp;quot;Arrrrr - Kiks i GetIntInfo!!!\n&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	($OID, $info) = each %{$result};&lt;br /&gt;
	return $info;&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
##################### MAIN ######################&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Indtast ip eller host: &amp;quot;;&lt;br /&gt;
my $host = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $host;&lt;br /&gt;
&lt;br /&gt;
$ip = RealIp($host);&lt;br /&gt;
&lt;br /&gt;
## Sæt session op&lt;br /&gt;
my ($session, $error) = Net::SNMP-&amp;gt;session(&lt;br /&gt;
			 -hostname =&amp;gt; $ip,&lt;br /&gt;
             -version  =&amp;gt; '2c', );&lt;br /&gt;
 &lt;br /&gt;
	if (!defined($session)) {&lt;br /&gt;
		printf(&amp;quot;Kan ikke åbne session til $host fejl: $error\n&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
## Hent interface antal&lt;br /&gt;
print &amp;quot;Henter antal interfaces: \n&amp;quot;;&lt;br /&gt;
printf &amp;quot; - Der er %s interfaces.\n&amp;quot;, ($intnr = GetIntNrs $session);&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Følgende findes:\n&amp;quot;;&lt;br /&gt;
for ($i = 1; $i &amp;lt;= $intnr; $i++) {&lt;br /&gt;
	printf &amp;quot;%s - %s\n&amp;quot;, $i, (GetIntInfo $session, &amp;quot;$IfListStart&amp;quot;.&amp;quot;$IfProp{'Description'}&amp;quot;.&amp;quot;.$i&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Hvilket interface skal vises&lt;br /&gt;
print &amp;quot;Hvilket interface skal vises. Vælg mellem 1 og $intnr: &amp;quot;;&lt;br /&gt;
$interface = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $interface;&lt;br /&gt;
&lt;br /&gt;
if ( $interface &amp;gt;= $intnr ) {&lt;br /&gt;
	print &amp;quot;Dette interface findes ikke...\n&amp;quot;;&lt;br /&gt;
	exit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
## Præsenter interfacet&lt;br /&gt;
foreach $key ( keys %IfProp ){&lt;br /&gt;
	printf &amp;quot;%12s --&amp;gt; %s\n&amp;quot;, $key, (GetIntInfo $session, &amp;quot;$IfListStart&amp;quot;.&amp;quot;$IfProp{$key}&amp;quot;.&amp;quot;.$interface&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 09:45, 12 November 2009 (CET)&lt;br /&gt;
[[Category:Perl]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:Perl_check_program_opl%C3%A6g&amp;diff=9917</id>
		<title>Talk:Perl check program oplæg</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:Perl_check_program_opl%C3%A6g&amp;diff=9917"/>
				<updated>2009-11-10T14:10:10Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: Mulig løsning (noget rodet)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Mulig løsning (noget rodet) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl -w&lt;br /&gt;
#&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#program version&lt;br /&gt;
my $VERSION=&amp;quot;0,1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
my @e  = qw(en to tre fire fem seks syv otte ni ti);&lt;br /&gt;
my @pe = qw(et to tre fire fem seks syv otte ni ti);&lt;br /&gt;
my @teen = qw(eleve tolv tretten fjorten femten seksten sytten atten nitten);&lt;br /&gt;
my @postteen = qw(tyve tredive fyrre halvtres tres halvfjers firs halvfems);&lt;br /&gt;
my $tal;&lt;br /&gt;
my $rest;&lt;br /&gt;
my $check;&lt;br /&gt;
my $decimal = 0;&lt;br /&gt;
&lt;br /&gt;
my $MAKS=10000;&lt;br /&gt;
&lt;br /&gt;
sub hvormange {&lt;br /&gt;
	# Returnere en taltekst for tal over 99.&lt;br /&gt;
	# Input : base&lt;br /&gt;
	# Input : tal&lt;br /&gt;
	#Output : taltekst&lt;br /&gt;
	&lt;br /&gt;
	my $base = shift;&lt;br /&gt;
	my $tal = shift;&lt;br /&gt;
	&lt;br /&gt;
	my $retur;&lt;br /&gt;
	my @t_base = qw(hundrede tusinde);&lt;br /&gt;
	my $post;&lt;br /&gt;
	&lt;br /&gt;
	my $rest = $tal%$base;&lt;br /&gt;
	my $antal = ($tal-$rest)/$base;&lt;br /&gt;
	&lt;br /&gt;
	if ( $base == 100 ) {&lt;br /&gt;
		$post = $t_base[0];&lt;br /&gt;
	} else {&lt;br /&gt;
		$post = $t_base[1];&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ($antal &amp;lt; 10) {&lt;br /&gt;
		return &amp;quot;$pe[$antal-1]$post&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (($antal &amp;lt; 20) &amp;amp;&amp;amp; ($base == 1000)) {&lt;br /&gt;
		return &amp;quot;$teen[$antal-11][$post]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if (($antal &amp;lt; 100) &amp;amp;&amp;amp; ($base == 1000)) {&lt;br /&gt;
		return &amp;quot;$postteen[$antal-($antal%10)/10]&amp;quot;;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Indtast tal (under $MAKS): &amp;quot;;&lt;br /&gt;
$tal = &amp;lt;&amp;gt;;&lt;br /&gt;
chomp $tal;&lt;br /&gt;
&lt;br /&gt;
$decimal = $tal-int $tal;&lt;br /&gt;
if ($tal &amp;gt;= $MAKS) {&lt;br /&gt;
	print &amp;quot;Tallet skal være mindre end $MAKS\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( $tal &amp;gt; 999 ){&lt;br /&gt;
	$check .= hvormange(1000,$tal);&lt;br /&gt;
	$tal = $tal-($tal-$tal%1000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( $tal &amp;gt; 99 ) {&lt;br /&gt;
	$check .= hvormange(100,$tal);&lt;br /&gt;
	$tal = $tal-($tal-$tal%100);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
if ( $tal &amp;gt; 19 ) {&lt;br /&gt;
	if (($rest = $tal%10) &amp;gt; 0){&lt;br /&gt;
		$check .= $e[$rest-1]; &lt;br /&gt;
		#printf &amp;quot;Rest %d %d %d\n&amp;quot;, $rest, $tal, ($tal-$rest)/10-2;&lt;br /&gt;
		$check .= &amp;quot;og&amp;quot;.$postteen[($tal-$rest)/10-2];&lt;br /&gt;
		$tal = $tal-int $tal;&lt;br /&gt;
	} else {&lt;br /&gt;
		$check .= &amp;quot;og&amp;quot;.$postteen[($tal-$rest)/10-2];&lt;br /&gt;
		$tal -= int $tal;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( $tal &amp;gt; 9 ){&lt;br /&gt;
	$check .= $teen[($tal%10)-1];&lt;br /&gt;
	$tal -= int $tal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if ( $tal &amp;gt; 0 ) {&lt;br /&gt;
	$check .= $e[$tal-1];&lt;br /&gt;
	$tal -= int $tal;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
$check .= sprintf &amp;quot; %2d/100&amp;quot;, $decimal*100;&lt;br /&gt;
print &amp;quot;$check\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__END__&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9626</id>
		<title>TDC BB-TEL efterår 2009</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9626"/>
				<updated>2009-10-06T10:32:06Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Løsninger på Perlprogrammer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
= UGE 35 - 2009 UNIX=&lt;br /&gt;
BBtel&lt;br /&gt;
== Få fat i maskinen udefra ==&lt;br /&gt;
I putty skriv '''mars.tekkom.dk''' i '''hostname'''&lt;br /&gt;
&lt;br /&gt;
== Kursustider ==&lt;br /&gt;
*Tirsdag 09:15 - 15:25&lt;br /&gt;
*Onsdag og torsdag: 08:15 - 15:25&lt;br /&gt;
*Frokost alle dage 12:00&lt;br /&gt;
=== Fjernundervisning ===&lt;br /&gt;
* Tirsdag den 1. september kl. 09:00 (Varighed cirka 2 timer)&lt;br /&gt;
* Tirsdag den 15. september kl. 09:00 (Varighed cirka 2 timer)&lt;br /&gt;
== Putty ==&lt;br /&gt;
*[http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe download Putty.exe]&lt;br /&gt;
== Opgaver i klassen ==&lt;br /&gt;
*[[media:Shell script opgave menu.pdf|Lav et menuprogram i bash opgave]]&lt;br /&gt;
*[[UNIX opgave Apache Access log]]&lt;br /&gt;
*[[UNIX opgaver]]&lt;br /&gt;
&lt;br /&gt;
== Valgfrie opgaver ==&lt;br /&gt;
*[[UNIX assignments]]&lt;br /&gt;
== Notater ==&lt;br /&gt;
=== Sende mail ===&lt;br /&gt;
At sende emails er nemt i UNIX&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[root@mars ~]#&amp;lt;input&amp;gt;echo &amp;quot;Buh&amp;quot; | mail -s &amp;quot;Vigtig&amp;quot; heth@mercantec.dk&amp;lt;/input&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At sende mange mail er  også nemt&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
LIST=&amp;quot;bent ole hans@hudj.dk kurt@smurt.dk&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for i in $LIST&lt;br /&gt;
do&lt;br /&gt;
  echo &amp;quot;Buy stuff for free&amp;quot; | mail -s &amp;quot;Important&amp;quot; $i&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ping og /dev/null ===&lt;br /&gt;
I eksemplet nedenunder sendes 1 pingpakke (-c 1) til IP adressen 192.168.22.22 og der ventes maksimalt 1 sekund på svaret (-t 1). STDOUT fra ping er omdirigeret til ''/dev/null'' som er skraldespanden. STDERR er omdirigeret til samme sted som STDOUT altså ''/dev/null''&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
if ping -t 1 -c 1 192.168.22.22 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 then echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 else echo &amp;quot;Fejl&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ting der har drillet ==&lt;br /&gt;
Kommandoen '''date +%m''' returner månedsnummeret feks '''08''' for august. imidlertidigt var tallet markeret som tekst og vi kunne ikke bruge det ved beregninger. Derfor skal tallet konverteres til Integer(heltal) og sortere det foranstillede 0 væk.&lt;br /&gt;
=== Perl løsning ===&lt;br /&gt;
En one-liner perl kan løse problemet&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
 #!/usr/bin/bash&lt;br /&gt;
 MONTHS=(Januar Februar Marts April Maj juni Juli August September Oktober November December)&lt;br /&gt;
&lt;br /&gt;
let MD=`date +%m | perl -ne '/0?(.*)/;print $1'`-1&lt;br /&gt;
echo &amp;quot;Det er maaned: ${MONTHS[$MD]}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sed løsning ===&lt;br /&gt;
En one liner sed (Serial Editor). En editor næsten som '''vi''', bare beregnet til at bruge i scripts.&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
 MONTHS=(Januar Februar Marts April Maj juni Juli August September Oktober November December)&lt;br /&gt;
&lt;br /&gt;
let MD=`date +%m | sed 's/0*//'`-1&lt;br /&gt;
echo &amp;quot;Det er maaned: ${MONTHS[$MD]}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
    &lt;br /&gt;
    pre {   font-family: Lucida Console; font-weight: bold; font-size: 14px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==  Links til UNIX ==&lt;br /&gt;
*[[UNIX commands|Grundlæggende UNIX kommandoer]]&lt;br /&gt;
*[[bash|bash kommandofortolker]]&lt;br /&gt;
*[[Mit første bash shellscript]]&lt;br /&gt;
*[http://www.retsforbundet.dk/politik/tema/software/vi-sheet.pdf vi editor oversigt skema]&lt;br /&gt;
*[http://www.retsforbundet.dk/politik/tema/software/software.htm software]&lt;br /&gt;
*[http://www.linuxbog.dk/?t=PDF En masse gode Linuxbøger på dansk]&lt;br /&gt;
*[http://www.freebsd.org FreeBSD's hjemmeside] og [ftp://ftp.freebsd.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/handbook/book.pdf.zip FreeBSD håndbogen (Engelsk PDF)]&lt;br /&gt;
*[http://www.freebsdwiki.net/index.php/Main_Page FreeBSD WIKI]&lt;br /&gt;
*[http://centos.org/ Linux distributionen CentOS]&lt;br /&gt;
*[[Bash examples]]&lt;br /&gt;
*[http://www.i-am-bored.com/bored_link.cfm?link_id=31365 The WEB server is down]&lt;br /&gt;
=== Virtualisering ===&lt;br /&gt;
*[http://www.virtualbox.org/wiki/Downloads Download Sun VirtualBox] (Anbefalet for begyndere)&lt;br /&gt;
*[http://downloads.vmware.com/d/info/datacenter_downloads/vmware_server/2_0 WMware Server]&lt;br /&gt;
&lt;br /&gt;
=== Distributioner ===&lt;br /&gt;
*[http://ftp.klid.dk/ftp/centos/5.3/isos/i386/CentOS-5.3-i386-bin-DVD.iso CentOS 5.3] Server installation (Anbefalet for begýndere)&lt;br /&gt;
**Se artiklen [[Sun VirtualBox installation af CentOS]]&lt;br /&gt;
*[http://www.ubuntu.com/getubuntu/download Ubuntu Linux download] klient installation (Anbefalet for begýndere)&lt;br /&gt;
*[ftp://ftp.dk.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/7.2/ FreeBSD 7.2 Download] (FreeBSD er sværere at installere end Ubuntu]&lt;br /&gt;
&lt;br /&gt;
= UGE 40 - 2009 Perl =&lt;br /&gt;
:Undervisningen er blandt andet baseret på bogen [http://oreilly.com/catalog/9780596520106/?CMP=AFC-ak_book&amp;amp;ATT=Learning+Perl,+Fifth+Edition, Learning perl], og det er netop formålet med kurset - at lære Perl. Bogen udleveres på kurset. Eksemplerne under kurset vil dreje sig om netværk og netværksovervågning.&lt;br /&gt;
*Udvikling på UNIX og Windows. På Windows anvendes [http://www.activestate.com/activeperl/ ActivePerl] med [http://www.perl-express.com/download.html Perl Express] som IDE.&lt;br /&gt;
** Hent [http://mars.tekkom.dk/sw/ActivePerl-5.8.9.826-MSWin32-x86-290470.msi ActivePerl] her.&lt;br /&gt;
** Hent [http://mars.tekkom.dk/sw/PeSetup25.exe Perl Express] her&lt;br /&gt;
== Kursustider ==&lt;br /&gt;
*Tirsdag den 29. september kl 09:15 - 15:25&lt;br /&gt;
*Onsdag den 30. september kl 08:15 - 15:25&lt;br /&gt;
*Torsdag den 1. oktober kl 08:15 - 15:25&lt;br /&gt;
=== Fjernundervisning ===&lt;br /&gt;
*Tirsdag den 6. oktober kl 09:00 - 11:00 (Uge 41)&lt;br /&gt;
*Fredag den 23. oktober kl 09:00 - 11:00 (Uge 43)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*Opkobling til Cisco udstyr med Telnet med modulet [[Net::Telnet::Cisco]]&lt;br /&gt;
== PI program ==&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
######################&lt;br /&gt;
# Program name: pi&lt;br /&gt;
#&lt;br /&gt;
# Abstract....: Beregen PI med en million udregninger&lt;br /&gt;
#               Anvender formlen: pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9....&lt;br /&gt;
#&lt;br /&gt;
# Auther......: Henrik Thomsen/Mercantec&lt;br /&gt;
# Email.......: heth@mercantec.dk&lt;br /&gt;
######################&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my $pi4=1;&lt;br /&gt;
&lt;br /&gt;
for (my $count=3; $count &amp;lt; 2*1000_000+3; $count+=4) {&lt;br /&gt;
	$pi4=$pi4-1/$count;&lt;br /&gt;
	$pi4=$pi4+1/($count+2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;PI = &amp;quot;,$pi4*4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Løsninger på Perlprogrammer==&lt;br /&gt;
[[Talk:TDC BB-TEL efterår 2009|Perl løsninger efterår 2009]]&lt;br /&gt;
&lt;br /&gt;
= UGE 46 - Network Management =&lt;br /&gt;
:Projektorienteret kursus hvor målet er at opnå erfaring med programmering af automatiseret netværksovervågning. Kurset er blandt andet baseret blandt andet på bogen [http://my.safaribooksonline.com/0596008406 Essential SNMP] som udleveres.&lt;br /&gt;
*Mandag den 9. november kl 09:15 - 15:25&lt;br /&gt;
*Tirsdag den 10. november kl 08:15 - 15:25&lt;br /&gt;
*Onsdag den 11. november kl 08:15 - 15:25&lt;br /&gt;
*Torsdag den 12. november kl 08:15 - 15:25&lt;br /&gt;
*Fredag den 13. november kl 08:15 - 12:00&lt;br /&gt;
&lt;br /&gt;
*Frokost alle dage ''endnu ukendt''&lt;br /&gt;
&lt;br /&gt;
[[Category:OLC]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9625</id>
		<title>TDC BB-TEL efterår 2009</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9625"/>
				<updated>2009-10-06T10:31:12Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* PI program */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{TOCright}}&lt;br /&gt;
= UGE 35 - 2009 UNIX=&lt;br /&gt;
BBtel&lt;br /&gt;
== Få fat i maskinen udefra ==&lt;br /&gt;
I putty skriv '''mars.tekkom.dk''' i '''hostname'''&lt;br /&gt;
&lt;br /&gt;
== Kursustider ==&lt;br /&gt;
*Tirsdag 09:15 - 15:25&lt;br /&gt;
*Onsdag og torsdag: 08:15 - 15:25&lt;br /&gt;
*Frokost alle dage 12:00&lt;br /&gt;
=== Fjernundervisning ===&lt;br /&gt;
* Tirsdag den 1. september kl. 09:00 (Varighed cirka 2 timer)&lt;br /&gt;
* Tirsdag den 15. september kl. 09:00 (Varighed cirka 2 timer)&lt;br /&gt;
== Putty ==&lt;br /&gt;
*[http://the.earth.li/~sgtatham/putty/latest/x86/putty.exe download Putty.exe]&lt;br /&gt;
== Opgaver i klassen ==&lt;br /&gt;
*[[media:Shell script opgave menu.pdf|Lav et menuprogram i bash opgave]]&lt;br /&gt;
*[[UNIX opgave Apache Access log]]&lt;br /&gt;
*[[UNIX opgaver]]&lt;br /&gt;
&lt;br /&gt;
== Valgfrie opgaver ==&lt;br /&gt;
*[[UNIX assignments]]&lt;br /&gt;
== Notater ==&lt;br /&gt;
=== Sende mail ===&lt;br /&gt;
At sende emails er nemt i UNIX&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[root@mars ~]#&amp;lt;input&amp;gt;echo &amp;quot;Buh&amp;quot; | mail -s &amp;quot;Vigtig&amp;quot; heth@mercantec.dk&amp;lt;/input&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At sende mange mail er  også nemt&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
LIST=&amp;quot;bent ole hans@hudj.dk kurt@smurt.dk&amp;quot;&lt;br /&gt;
&lt;br /&gt;
for i in $LIST&lt;br /&gt;
do&lt;br /&gt;
  echo &amp;quot;Buy stuff for free&amp;quot; | mail -s &amp;quot;Important&amp;quot; $i&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ping og /dev/null ===&lt;br /&gt;
I eksemplet nedenunder sendes 1 pingpakke (-c 1) til IP adressen 192.168.22.22 og der ventes maksimalt 1 sekund på svaret (-t 1). STDOUT fra ping er omdirigeret til ''/dev/null'' som er skraldespanden. STDERR er omdirigeret til samme sted som STDOUT altså ''/dev/null''&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
if ping -t 1 -c 1 192.168.22.22 &amp;gt; /dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
 then echo &amp;quot;OK&amp;quot;&lt;br /&gt;
 else echo &amp;quot;Fejl&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ting der har drillet ==&lt;br /&gt;
Kommandoen '''date +%m''' returner månedsnummeret feks '''08''' for august. imidlertidigt var tallet markeret som tekst og vi kunne ikke bruge det ved beregninger. Derfor skal tallet konverteres til Integer(heltal) og sortere det foranstillede 0 væk.&lt;br /&gt;
=== Perl løsning ===&lt;br /&gt;
En one-liner perl kan løse problemet&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
 #!/usr/bin/bash&lt;br /&gt;
 MONTHS=(Januar Februar Marts April Maj juni Juli August September Oktober November December)&lt;br /&gt;
&lt;br /&gt;
let MD=`date +%m | perl -ne '/0?(.*)/;print $1'`-1&lt;br /&gt;
echo &amp;quot;Det er maaned: ${MONTHS[$MD]}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== sed løsning ===&lt;br /&gt;
En one liner sed (Serial Editor). En editor næsten som '''vi''', bare beregnet til at bruge i scripts.&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
 MONTHS=(Januar Februar Marts April Maj juni Juli August September Oktober November December)&lt;br /&gt;
&lt;br /&gt;
let MD=`date +%m | sed 's/0*//'`-1&lt;br /&gt;
echo &amp;quot;Det er maaned: ${MONTHS[$MD]}&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
    &lt;br /&gt;
    pre {   font-family: Lucida Console; font-weight: bold; font-size: 14px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==  Links til UNIX ==&lt;br /&gt;
*[[UNIX commands|Grundlæggende UNIX kommandoer]]&lt;br /&gt;
*[[bash|bash kommandofortolker]]&lt;br /&gt;
*[[Mit første bash shellscript]]&lt;br /&gt;
*[http://www.retsforbundet.dk/politik/tema/software/vi-sheet.pdf vi editor oversigt skema]&lt;br /&gt;
*[http://www.retsforbundet.dk/politik/tema/software/software.htm software]&lt;br /&gt;
*[http://www.linuxbog.dk/?t=PDF En masse gode Linuxbøger på dansk]&lt;br /&gt;
*[http://www.freebsd.org FreeBSD's hjemmeside] og [ftp://ftp.freebsd.org/pub/FreeBSD/doc/en_US.ISO8859-1/books/handbook/book.pdf.zip FreeBSD håndbogen (Engelsk PDF)]&lt;br /&gt;
*[http://www.freebsdwiki.net/index.php/Main_Page FreeBSD WIKI]&lt;br /&gt;
*[http://centos.org/ Linux distributionen CentOS]&lt;br /&gt;
*[[Bash examples]]&lt;br /&gt;
*[http://www.i-am-bored.com/bored_link.cfm?link_id=31365 The WEB server is down]&lt;br /&gt;
=== Virtualisering ===&lt;br /&gt;
*[http://www.virtualbox.org/wiki/Downloads Download Sun VirtualBox] (Anbefalet for begyndere)&lt;br /&gt;
*[http://downloads.vmware.com/d/info/datacenter_downloads/vmware_server/2_0 WMware Server]&lt;br /&gt;
&lt;br /&gt;
=== Distributioner ===&lt;br /&gt;
*[http://ftp.klid.dk/ftp/centos/5.3/isos/i386/CentOS-5.3-i386-bin-DVD.iso CentOS 5.3] Server installation (Anbefalet for begýndere)&lt;br /&gt;
**Se artiklen [[Sun VirtualBox installation af CentOS]]&lt;br /&gt;
*[http://www.ubuntu.com/getubuntu/download Ubuntu Linux download] klient installation (Anbefalet for begýndere)&lt;br /&gt;
*[ftp://ftp.dk.freebsd.org/pub/FreeBSD/ISO-IMAGES-i386/7.2/ FreeBSD 7.2 Download] (FreeBSD er sværere at installere end Ubuntu]&lt;br /&gt;
&lt;br /&gt;
= UGE 40 - 2009 Perl =&lt;br /&gt;
:Undervisningen er blandt andet baseret på bogen [http://oreilly.com/catalog/9780596520106/?CMP=AFC-ak_book&amp;amp;ATT=Learning+Perl,+Fifth+Edition, Learning perl], og det er netop formålet med kurset - at lære Perl. Bogen udleveres på kurset. Eksemplerne under kurset vil dreje sig om netværk og netværksovervågning.&lt;br /&gt;
*Udvikling på UNIX og Windows. På Windows anvendes [http://www.activestate.com/activeperl/ ActivePerl] med [http://www.perl-express.com/download.html Perl Express] som IDE.&lt;br /&gt;
** Hent [http://mars.tekkom.dk/sw/ActivePerl-5.8.9.826-MSWin32-x86-290470.msi ActivePerl] her.&lt;br /&gt;
** Hent [http://mars.tekkom.dk/sw/PeSetup25.exe Perl Express] her&lt;br /&gt;
== Kursustider ==&lt;br /&gt;
*Tirsdag den 29. september kl 09:15 - 15:25&lt;br /&gt;
*Onsdag den 30. september kl 08:15 - 15:25&lt;br /&gt;
*Torsdag den 1. oktober kl 08:15 - 15:25&lt;br /&gt;
=== Fjernundervisning ===&lt;br /&gt;
*Tirsdag den 6. oktober kl 09:00 - 11:00 (Uge 41)&lt;br /&gt;
*Fredag den 23. oktober kl 09:00 - 11:00 (Uge 43)&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
*Opkobling til Cisco udstyr med Telnet med modulet [[Net::Telnet::Cisco]]&lt;br /&gt;
== PI program ==&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
######################&lt;br /&gt;
# Program name: pi&lt;br /&gt;
#&lt;br /&gt;
# Abstract....: Beregen PI med en million udregninger&lt;br /&gt;
#               Anvender formlen: pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9....&lt;br /&gt;
#&lt;br /&gt;
# Auther......: Henrik Thomsen/Mercantec&lt;br /&gt;
# Email.......: heth@mercantec.dk&lt;br /&gt;
######################&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
my $pi4=1;&lt;br /&gt;
&lt;br /&gt;
for (my $count=3; $count &amp;lt; 2*1000_000+3; $count+=4) {&lt;br /&gt;
	$pi4=$pi4-1/$count;&lt;br /&gt;
	$pi4=$pi4+1/($count+2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;PI = &amp;quot;,$pi4*4;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Løsninger på Perlprogrammer==&lt;br /&gt;
[[Talk:TDC BB-TEL efterår 2009]]&lt;br /&gt;
&lt;br /&gt;
= UGE 46 - Network Management =&lt;br /&gt;
:Projektorienteret kursus hvor målet er at opnå erfaring med programmering af automatiseret netværksovervågning. Kurset er blandt andet baseret blandt andet på bogen [http://my.safaribooksonline.com/0596008406 Essential SNMP] som udleveres.&lt;br /&gt;
*Mandag den 9. november kl 09:15 - 15:25&lt;br /&gt;
*Tirsdag den 10. november kl 08:15 - 15:25&lt;br /&gt;
*Onsdag den 11. november kl 08:15 - 15:25&lt;br /&gt;
*Torsdag den 12. november kl 08:15 - 15:25&lt;br /&gt;
*Fredag den 13. november kl 08:15 - 12:00&lt;br /&gt;
&lt;br /&gt;
*Frokost alle dage ''endnu ukendt''&lt;br /&gt;
&lt;br /&gt;
[[Category:OLC]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9624</id>
		<title>Talk:TDC BB-TEL efterår 2009</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9624"/>
				<updated>2009-10-06T10:29:42Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Perl løsninger=&lt;br /&gt;
== Tomas Ping program ==&lt;br /&gt;
=== device fil ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Liste over hosts der skal pinges&lt;br /&gt;
# Tomme linier eller linier der starter med # ignoreres&lt;br /&gt;
# Felt 1 hostnavn eller ip adresse&lt;br /&gt;
# Felt 2 protocoltype&lt;br /&gt;
&lt;br /&gt;
www.mitsubishi.co.jp      tcp&lt;br /&gt;
83.90.47.30               udp&lt;br /&gt;
#80.80.12.112             icmp&lt;br /&gt;
www.cpan.org              syn&lt;br /&gt;
83.90.239.188             tcp&lt;br /&gt;
 vejr.tomas.dk            tcp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Crontab===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12 */2 * * * /home/tcj/bin/PingHosts.pl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===PingHosts.pl===&lt;br /&gt;
&amp;lt;source lang=perl line=0&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
### INITIERING ###&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use Net::Ping;&lt;br /&gt;
&lt;br /&gt;
my $HOSTS = &amp;quot;/home/tcj/devices&amp;quot;;        # Enheder der skal pinges&lt;br /&gt;
my $LOG   = &amp;quot;/home/tcj/devices.log&amp;quot;;    # Ping log&lt;br /&gt;
my $p;          # linie fra HOST fil&lt;br /&gt;
my $host;       # Host der skal pinges&lt;br /&gt;
my $proto;      # Hvilken protokol der benyttes&lt;br /&gt;
my $ts;         # Timestamp&lt;br /&gt;
&lt;br /&gt;
### SUBRUTINER ###&lt;br /&gt;
&lt;br /&gt;
sub TilLogFil {&lt;br /&gt;
## skriver tekst til logfil&lt;br /&gt;
# Input : Tekststreng&lt;br /&gt;
# Input : log fil&lt;br /&gt;
  my $log_tekst = shift;&lt;br /&gt;
  my $log_fil   = shift;&lt;br /&gt;
  my $logopen   = 0;&lt;br /&gt;
&lt;br /&gt;
  open LOGFIL, &amp;quot;&amp;gt;&amp;gt;$log_fil&amp;quot; or $logopen = 1;&lt;br /&gt;
  # Hvis $logopen = 0, kunne filen ikke &amp;lt;E5&amp;gt;bnes - IKKE kritisk!&lt;br /&gt;
  if ( $logopen == 0 ) {&lt;br /&gt;
        print LOGFIL &amp;quot;$log_tekst&amp;quot;;&lt;br /&gt;
        close LOGFIL;&lt;br /&gt;
  } else {&lt;br /&gt;
        warn &amp;quot;Logfil: $log_fil kunne ikke &amp;lt;E5&amp;gt;bnes\n&amp;quot;;&lt;br /&gt;
        warn &amp;quot;- Der er ikke skrevet i $log_fil\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub TimeStamp {&lt;br /&gt;
## Returnerer tidsstempel&lt;br /&gt;
# Output: Tidsstempel: YYYYMMDD TT:MM:SS&lt;br /&gt;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);&lt;br /&gt;
  my $tstamp;&lt;br /&gt;
&lt;br /&gt;
  $year += 1900;&lt;br /&gt;
&lt;br /&gt;
  $tstamp = sprintf&amp;quot;%d%02d%02d %02d:%02d:%02d&amp;quot;, $year, $mon+1, $mday, $hour, $min, $sec;&lt;br /&gt;
  return $tstamp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub PingDevice {&lt;br /&gt;
## Ping device med en given protokol&lt;br /&gt;
# Input: host&lt;br /&gt;
# Input: protocol&lt;br /&gt;
# Output: ok = 0; notok = 1&lt;br /&gt;
  my $host     = shift;&lt;br /&gt;
  my $protocol = shift;&lt;br /&gt;
  my $timeout  = 1;&lt;br /&gt;
  my $pr;       # Ping result: undef = no host; 0 = succes; 1 = no reply&lt;br /&gt;
&lt;br /&gt;
  my $po = Net::Ping-&amp;gt;new($protocol, $timeout);&lt;br /&gt;
&lt;br /&gt;
  $pr = $po-&amp;gt;ping($host);&lt;br /&gt;
  if ( (! defined $pr) or ( $pr == 1) ) {&lt;br /&gt;
        return 1;&lt;br /&gt;
  } else {&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### MAIN ###&lt;br /&gt;
&lt;br /&gt;
$ts = TimeStamp;&lt;br /&gt;
TilLogFil(&amp;quot;$ts ___ START PING HOSTS i $HOSTS ___\n&amp;quot;, $LOG);&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;C5&amp;gt;ben Host fil&lt;br /&gt;
open HOST, &amp;quot;&amp;lt;$HOSTS&amp;quot; or die &amp;quot;Kunne ikke &amp;lt;E5&amp;gt;bne $HOSTS\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
while ( $p = &amp;lt;HOST&amp;gt; ) {&lt;br /&gt;
        # Tomme og kommentar linier springes over&lt;br /&gt;
        if (  $p =~ /^\s*#|^\s+[^\S+]/ ) { next; }&lt;br /&gt;
        $p =~  /\s*(\S+)\s+(\S+).*/;&lt;br /&gt;
&lt;br /&gt;
        $host = $1;&lt;br /&gt;
        $proto = $2;&lt;br /&gt;
&lt;br /&gt;
        $ts = TimeStamp;&lt;br /&gt;
        TilLogFil(&amp;quot;$ts Ping: $host Protokol: $proto\t &amp;quot;,$LOG);&lt;br /&gt;
&lt;br /&gt;
        # Udf&amp;lt;F8&amp;gt;r ping&lt;br /&gt;
        if ( PingDevice($host, $proto) == 0 ) {&lt;br /&gt;
        # OK !!!&lt;br /&gt;
                TilLogFil(&amp;quot;OK\n&amp;quot;,$LOG);&lt;br /&gt;
        } else {&lt;br /&gt;
        # NOT OK !!!&lt;br /&gt;
                TilLogFil(&amp;quot;NOT OK\n&amp;quot;,$LOG);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
close HOST;&lt;br /&gt;
$ts = TimeStamp;&lt;br /&gt;
TilLogFil(&amp;quot;$ts ___ SLUT PING HOSTS i $HOSTS ___\n&amp;quot;, $LOG);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Logfil===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
20091006 12:21:10 ___ START PING HOSTS i /home/tcj/devices ___&lt;br /&gt;
20091006 12:21:10 Ping: www.mitsubishi.co.jp Protokol: tcp       OK&lt;br /&gt;
20091006 12:21:10 Ping: 83.90.47.30 Protokol: udp        NOT OK&lt;br /&gt;
20091006 12:21:10 Ping: www.cpan.org Protokol: syn       NOT OK&lt;br /&gt;
20091006 12:21:10 Ping: 83.90.239.188 Protokol: tcp      OK&lt;br /&gt;
20091006 12:21:11 Ping: vejr.tomas.dk Protokol: tcp      OK&lt;br /&gt;
20091006 12:21:12 ___ SLUT PING HOSTS i /home/tcj/devices ___&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 12:29, 6 October 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9623</id>
		<title>Talk:TDC BB-TEL efterår 2009</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9623"/>
				<updated>2009-10-06T10:28:51Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Perl løsninger= */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Perl løsninger=&lt;br /&gt;
== Tomas Ping program ==&lt;br /&gt;
=== device fil ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Liste over hosts der skal pinges&lt;br /&gt;
# Tomme linier eller linier der starter med # ignoreres&lt;br /&gt;
# Felt 1 hostnavn eller ip adresse&lt;br /&gt;
# Felt 2 protocoltype&lt;br /&gt;
&lt;br /&gt;
www.mitsubishi.co.jp      tcp&lt;br /&gt;
83.90.47.30               udp&lt;br /&gt;
#80.80.12.112             icmp&lt;br /&gt;
www.cpan.org              syn&lt;br /&gt;
83.90.239.188             tcp&lt;br /&gt;
 vejr.tomas.dk            tcp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Crontab===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12 */2 * * * /home/tcj/bin/PingHosts.pl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===PingHosts.pl===&lt;br /&gt;
&amp;lt;source lang=perl line=0&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
### INITIERING ###&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use Net::Ping;&lt;br /&gt;
&lt;br /&gt;
my $HOSTS = &amp;quot;/home/tcj/devices&amp;quot;;        # Enheder der skal pinges&lt;br /&gt;
my $LOG   = &amp;quot;/home/tcj/devices.log&amp;quot;;    # Ping log&lt;br /&gt;
my $p;          # linie fra HOST fil&lt;br /&gt;
my $host;       # Host der skal pinges&lt;br /&gt;
my $proto;      # Hvilken protokol der benyttes&lt;br /&gt;
my $ts;         # Timestamp&lt;br /&gt;
&lt;br /&gt;
### SUBRUTINER ###&lt;br /&gt;
&lt;br /&gt;
sub TilLogFil {&lt;br /&gt;
## skriver tekst til logfil&lt;br /&gt;
# Input : Tekststreng&lt;br /&gt;
# Input : log fil&lt;br /&gt;
  my $log_tekst = shift;&lt;br /&gt;
  my $log_fil   = shift;&lt;br /&gt;
  my $logopen   = 0;&lt;br /&gt;
&lt;br /&gt;
  open LOGFIL, &amp;quot;&amp;gt;&amp;gt;$log_fil&amp;quot; or $logopen = 1;&lt;br /&gt;
  # Hvis $logopen = 0, kunne filen ikke &amp;lt;E5&amp;gt;bnes - IKKE kritisk!&lt;br /&gt;
  if ( $logopen == 0 ) {&lt;br /&gt;
        print LOGFIL &amp;quot;$log_tekst&amp;quot;;&lt;br /&gt;
        close LOGFIL;&lt;br /&gt;
  } else {&lt;br /&gt;
        warn &amp;quot;Logfil: $log_fil kunne ikke &amp;lt;E5&amp;gt;bnes\n&amp;quot;;&lt;br /&gt;
        warn &amp;quot;- Der er ikke skrevet i $log_fil\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub TimeStamp {&lt;br /&gt;
## Returnerer tidsstempel&lt;br /&gt;
# Output: Tidsstempel: YYYYMMDD TT:MM:SS&lt;br /&gt;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);&lt;br /&gt;
  my $tstamp;&lt;br /&gt;
&lt;br /&gt;
  $year += 1900;&lt;br /&gt;
&lt;br /&gt;
  $tstamp = sprintf&amp;quot;%d%02d%02d %02d:%02d:%02d&amp;quot;, $year, $mon+1, $mday, $hour, $min, $sec;&lt;br /&gt;
  return $tstamp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub PingDevice {&lt;br /&gt;
## Ping device med en given protokol&lt;br /&gt;
# Input: host&lt;br /&gt;
# Input: protocol&lt;br /&gt;
# Output: ok = 0; notok = 1&lt;br /&gt;
  my $host     = shift;&lt;br /&gt;
  my $protocol = shift;&lt;br /&gt;
  my $timeout  = 1;&lt;br /&gt;
  my $pr;       # Ping result: undef = no host; 0 = succes; 1 = no reply&lt;br /&gt;
&lt;br /&gt;
  my $po = Net::Ping-&amp;gt;new($protocol, $timeout);&lt;br /&gt;
&lt;br /&gt;
  $pr = $po-&amp;gt;ping($host);&lt;br /&gt;
  if ( (! defined $pr) or ( $pr == 1) ) {&lt;br /&gt;
        return 1;&lt;br /&gt;
  } else {&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### MAIN ###&lt;br /&gt;
&lt;br /&gt;
$ts = TimeStamp;&lt;br /&gt;
TilLogFil(&amp;quot;$ts ___ START PING HOSTS i $HOSTS ___\n&amp;quot;, $LOG);&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;C5&amp;gt;ben Host fil&lt;br /&gt;
open HOST, &amp;quot;&amp;lt;$HOSTS&amp;quot; or die &amp;quot;Kunne ikke &amp;lt;E5&amp;gt;bne $HOSTS\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
while ( $p = &amp;lt;HOST&amp;gt; ) {&lt;br /&gt;
        # Tomme og kommentar linier springes over&lt;br /&gt;
        if (  $p =~ /^\s*#|^\s+[^\S+]/ ) { next; }&lt;br /&gt;
        $p =~  /\s*(\S+)\s+(\S+).*/;&lt;br /&gt;
&lt;br /&gt;
        $host = $1;&lt;br /&gt;
        $proto = $2;&lt;br /&gt;
&lt;br /&gt;
        $ts = TimeStamp;&lt;br /&gt;
        TilLogFil(&amp;quot;$ts Ping: $host Protokol: $proto\t &amp;quot;,$LOG);&lt;br /&gt;
&lt;br /&gt;
        # Udf&amp;lt;F8&amp;gt;r ping&lt;br /&gt;
        if ( PingDevice($host, $proto) == 0 ) {&lt;br /&gt;
        # OK !!!&lt;br /&gt;
                TilLogFil(&amp;quot;OK\n&amp;quot;,$LOG);&lt;br /&gt;
        } else {&lt;br /&gt;
        # NOT OK !!!&lt;br /&gt;
                TilLogFil(&amp;quot;NOT OK\n&amp;quot;,$LOG);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
close HOST;&lt;br /&gt;
$ts = TimeStamp;&lt;br /&gt;
TilLogFil(&amp;quot;$ts ___ SLUT PING HOSTS i $HOSTS ___\n&amp;quot;, $LOG);&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
===Logfil===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
20091006 12:21:10 ___ START PING HOSTS i /home/tcj/devices ___&lt;br /&gt;
20091006 12:21:10 Ping: www.mitsubishi.co.jp Protokol: tcp       OK&lt;br /&gt;
20091006 12:21:10 Ping: 83.90.47.30 Protokol: udp        NOT OK&lt;br /&gt;
20091006 12:21:10 Ping: www.cpan.org Protokol: syn       NOT OK&lt;br /&gt;
20091006 12:21:10 Ping: 83.90.239.188 Protokol: tcp      OK&lt;br /&gt;
20091006 12:21:11 Ping: vejr.tomas.dk Protokol: tcp      OK&lt;br /&gt;
20091006 12:21:12 ___ SLUT PING HOSTS i /home/tcj/devices ___&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--~~~~&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9622</id>
		<title>Talk:TDC BB-TEL efterår 2009</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:TDC_BB-TEL_efter%C3%A5r_2009&amp;diff=9622"/>
				<updated>2009-10-06T10:28:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: New page: =Perl løsninger== == Tomas Ping program == === device fil === &amp;lt;pre&amp;gt; # Liste over hosts der skal pinges # Tomme linier eller linier der starter med # ignoreres # Felt 1 hostnavn eller ip a...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Perl løsninger==&lt;br /&gt;
== Tomas Ping program ==&lt;br /&gt;
=== device fil ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Liste over hosts der skal pinges&lt;br /&gt;
# Tomme linier eller linier der starter med # ignoreres&lt;br /&gt;
# Felt 1 hostnavn eller ip adresse&lt;br /&gt;
# Felt 2 protocoltype&lt;br /&gt;
&lt;br /&gt;
www.mitsubishi.co.jp      tcp&lt;br /&gt;
83.90.47.30               udp&lt;br /&gt;
#80.80.12.112             icmp&lt;br /&gt;
www.cpan.org              syn&lt;br /&gt;
83.90.239.188             tcp&lt;br /&gt;
 vejr.tomas.dk            tcp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Crontab===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
12 */2 * * * /home/tcj/bin/PingHosts.pl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===PingHosts.pl===&lt;br /&gt;
&amp;lt;source lang=perl line=0&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
### INITIERING ###&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
use Net::Ping;&lt;br /&gt;
&lt;br /&gt;
my $HOSTS = &amp;quot;/home/tcj/devices&amp;quot;;        # Enheder der skal pinges&lt;br /&gt;
my $LOG   = &amp;quot;/home/tcj/devices.log&amp;quot;;    # Ping log&lt;br /&gt;
my $p;          # linie fra HOST fil&lt;br /&gt;
my $host;       # Host der skal pinges&lt;br /&gt;
my $proto;      # Hvilken protokol der benyttes&lt;br /&gt;
my $ts;         # Timestamp&lt;br /&gt;
&lt;br /&gt;
### SUBRUTINER ###&lt;br /&gt;
&lt;br /&gt;
sub TilLogFil {&lt;br /&gt;
## skriver tekst til logfil&lt;br /&gt;
# Input : Tekststreng&lt;br /&gt;
# Input : log fil&lt;br /&gt;
  my $log_tekst = shift;&lt;br /&gt;
  my $log_fil   = shift;&lt;br /&gt;
  my $logopen   = 0;&lt;br /&gt;
&lt;br /&gt;
  open LOGFIL, &amp;quot;&amp;gt;&amp;gt;$log_fil&amp;quot; or $logopen = 1;&lt;br /&gt;
  # Hvis $logopen = 0, kunne filen ikke &amp;lt;E5&amp;gt;bnes - IKKE kritisk!&lt;br /&gt;
  if ( $logopen == 0 ) {&lt;br /&gt;
        print LOGFIL &amp;quot;$log_tekst&amp;quot;;&lt;br /&gt;
        close LOGFIL;&lt;br /&gt;
  } else {&lt;br /&gt;
        warn &amp;quot;Logfil: $log_fil kunne ikke &amp;lt;E5&amp;gt;bnes\n&amp;quot;;&lt;br /&gt;
        warn &amp;quot;- Der er ikke skrevet i $log_fil\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub TimeStamp {&lt;br /&gt;
## Returnerer tidsstempel&lt;br /&gt;
# Output: Tidsstempel: YYYYMMDD TT:MM:SS&lt;br /&gt;
  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);&lt;br /&gt;
  my $tstamp;&lt;br /&gt;
&lt;br /&gt;
  $year += 1900;&lt;br /&gt;
&lt;br /&gt;
  $tstamp = sprintf&amp;quot;%d%02d%02d %02d:%02d:%02d&amp;quot;, $year, $mon+1, $mday, $hour, $min, $sec;&lt;br /&gt;
  return $tstamp;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub PingDevice {&lt;br /&gt;
## Ping device med en given protokol&lt;br /&gt;
# Input: host&lt;br /&gt;
# Input: protocol&lt;br /&gt;
# Output: ok = 0; notok = 1&lt;br /&gt;
  my $host     = shift;&lt;br /&gt;
  my $protocol = shift;&lt;br /&gt;
  my $timeout  = 1;&lt;br /&gt;
  my $pr;       # Ping result: undef = no host; 0 = succes; 1 = no reply&lt;br /&gt;
&lt;br /&gt;
  my $po = Net::Ping-&amp;gt;new($protocol, $timeout);&lt;br /&gt;
&lt;br /&gt;
  $pr = $po-&amp;gt;ping($host);&lt;br /&gt;
  if ( (! defined $pr) or ( $pr == 1) ) {&lt;br /&gt;
        return 1;&lt;br /&gt;
  } else {&lt;br /&gt;
        return 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### MAIN ###&lt;br /&gt;
&lt;br /&gt;
$ts = TimeStamp;&lt;br /&gt;
TilLogFil(&amp;quot;$ts ___ START PING HOSTS i $HOSTS ___\n&amp;quot;, $LOG);&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;C5&amp;gt;ben Host fil&lt;br /&gt;
open HOST, &amp;quot;&amp;lt;$HOSTS&amp;quot; or die &amp;quot;Kunne ikke &amp;lt;E5&amp;gt;bne $HOSTS\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
while ( $p = &amp;lt;HOST&amp;gt; ) {&lt;br /&gt;
        # Tomme og kommentar linier springes over&lt;br /&gt;
        if (  $p =~ /^\s*#|^\s+[^\S+]/ ) { next; }&lt;br /&gt;
        $p =~  /\s*(\S+)\s+(\S+).*/;&lt;br /&gt;
&lt;br /&gt;
        $host = $1;&lt;br /&gt;
        $proto = $2;&lt;br /&gt;
&lt;br /&gt;
        $ts = TimeStamp;&lt;br /&gt;
        TilLogFil(&amp;quot;$ts Ping: $host Protokol: $proto\t &amp;quot;,$LOG);&lt;br /&gt;
&lt;br /&gt;
        # Udf&amp;lt;F8&amp;gt;r ping&lt;br /&gt;
        if ( PingDevice($host, $proto) == 0 ) {&lt;br /&gt;
        # OK !!!&lt;br /&gt;
                TilLogFil(&amp;quot;OK\n&amp;quot;,$LOG);&lt;br /&gt;
        } else {&lt;br /&gt;
        # NOT OK !!!&lt;br /&gt;
                TilLogFil(&amp;quot;NOT OK\n&amp;quot;,$LOG);&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
close HOST;&lt;br /&gt;
$ts = TimeStamp;&lt;br /&gt;
TilLogFil(&amp;quot;$ts ___ SLUT PING HOSTS i $HOSTS ___\n&amp;quot;, $LOG);&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
===Logfil===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
20091006 12:21:10 ___ START PING HOSTS i /home/tcj/devices ___&lt;br /&gt;
20091006 12:21:10 Ping: www.mitsubishi.co.jp Protokol: tcp       OK&lt;br /&gt;
20091006 12:21:10 Ping: 83.90.47.30 Protokol: udp        NOT OK&lt;br /&gt;
20091006 12:21:10 Ping: www.cpan.org Protokol: syn       NOT OK&lt;br /&gt;
20091006 12:21:10 Ping: 83.90.239.188 Protokol: tcp      OK&lt;br /&gt;
20091006 12:21:11 Ping: vejr.tomas.dk Protokol: tcp      OK&lt;br /&gt;
20091006 12:21:12 ___ SLUT PING HOSTS i /home/tcj/devices ___&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:Arrays_perl&amp;diff=9561</id>
		<title>Talk:Arrays perl</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:Arrays_perl&amp;diff=9561"/>
				<updated>2009-10-01T09:07:26Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Hash of arrays==&lt;br /&gt;
Another problem we can run into is to have a hash each element of which is an array. In the other words, we would like to associate not just one scalar variable with a key ford, but a whole list of scalar values. The idea of the solution is exactly the same as in the previous section. Instead of keeping scalar values in our hash we will keep pointers to an array.&lt;br /&gt;
&lt;br /&gt;
For example, let we have a file like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bob: 89 76 89 90 100 101&lt;br /&gt;
Bill: 100 89 76 80 34 0&lt;br /&gt;
Sam: 102 99 87 78 90 69&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For each student mentioned in the file we would like to keep her or his grades. To do that we will write the following code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
%grades = ();    # create an empty hash&lt;br /&gt;
while( &amp;lt;&amp;gt; ){&lt;br /&gt;
   chomp;&lt;br /&gt;
   ($name, $grds) = split(/:\s*/, $_);&lt;br /&gt;
   $grades{$name} = [ split(/\s+/, $grds) ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for ( keys(%grades) ){&lt;br /&gt;
   printf &amp;quot;%8s : %.2f\n&amp;quot;, $_, avg( @{$grades{$_}} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub avg&lt;br /&gt;
{&lt;br /&gt;
  my @arr = @_;&lt;br /&gt;
  my $sum = 0;&lt;br /&gt;
  my $count = $#arr + 1;&lt;br /&gt;
  for(my $i=0;$i&amp;lt;$count;$i++){&lt;br /&gt;
     $sum += $arr[$i];&lt;br /&gt;
  }&lt;br /&gt;
  $sum/$count;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The very first loop just reads the file line by line and splits the line into name and grades, then it uses split function again to get an array of grades, then in the assignment $grades{$name} = [ split(/\s+/, $grds) ]; we initialize an element of the has with the key $name and the value is a pointer to an anonymous array that contains all the grades for the student. To create a pointer we use square brackets around the functions split. In the second loop we call function avg to compute the average grade for each student. Please notice that we use @ in front of the hash element to specify that we pass an array not a pointer to the function. &lt;br /&gt;
&lt;br /&gt;
* Kilde [http://ist.marshall.edu/ist334/perl_pointers.html http://ist.marshall.edu/ist334/perl_pointers.html]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:Arrays_perl&amp;diff=9560</id>
		<title>Talk:Arrays perl</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:Arrays_perl&amp;diff=9560"/>
				<updated>2009-10-01T09:06:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: New page: Hash of arrays Another problem we can run into is to have a hash each element of which is an array. In the other words, we would like to associate not just one scalar variable with a key f...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hash of arrays&lt;br /&gt;
Another problem we can run into is to have a hash each element of which is an array. In the other words, we would like to associate not just one scalar variable with a key ford, but a whole list of scalar values. The idea of the solution is exactly the same as in the previous section. Instead of keeping scalar values in our hash we will keep pointers to an array.&lt;br /&gt;
&lt;br /&gt;
For example, let we have a file like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Bob: 89 76 89 90 100 101&lt;br /&gt;
Bill: 100 89 76 80 34 0&lt;br /&gt;
Sam: 102 99 87 78 90 69&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
For each student mentioned in the file we would like to keep her or his grades. To do that we will write the following code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=perl&amp;gt;&lt;br /&gt;
%grades = ();    # create an empty hash&lt;br /&gt;
while( &amp;lt;&amp;gt; ){&lt;br /&gt;
   chomp;&lt;br /&gt;
   ($name, $grds) = split(/:\s*/, $_);&lt;br /&gt;
   $grades{$name} = [ split(/\s+/, $grds) ];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
for ( keys(%grades) ){&lt;br /&gt;
   printf &amp;quot;%8s : %.2f\n&amp;quot;, $_, avg( @{$grades{$_}} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub avg&lt;br /&gt;
{&lt;br /&gt;
  my @arr = @_;&lt;br /&gt;
  my $sum = 0;&lt;br /&gt;
  my $count = $#arr + 1;&lt;br /&gt;
  for(my $i=0;$i&amp;lt;$count;$i++){&lt;br /&gt;
     $sum += $arr[$i];&lt;br /&gt;
  }&lt;br /&gt;
  $sum/$count;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The very first loop just reads the file line by line and splits the line into name and grades, then it uses split function again to get an array of grades, then in the assignment $grades{$name} = [ split(/\s+/, $grds) ]; we initialize an element of the has with the key $name and the value is a pointer to an anonymous array that contains all the grades for the student. To create a pointer we use square brackets around the functions split. In the second loop we call function avg to compute the average grade for each student. Please notice that we use @ in front of the hash element to specify that we pass an array not a pointer to the function. &lt;br /&gt;
&lt;br /&gt;
* Kilde [http://ist.marshall.edu/ist334/perl_pointers.html http://ist.marshall.edu/ist334/perl_pointers.html]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9027</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9027"/>
				<updated>2009-09-15T08:16:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Besvarelse fra Tomas =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
==Tomas Løsning på SNMP2 ==&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Chech for 1 parameter&lt;br /&gt;
if ! [ $# -eq 1 ] ; then&lt;br /&gt;
  echo &amp;quot;Der mangler et linienr&amp;quot;&lt;br /&gt;
  echo &amp;quot;Brug: linie &amp;lt;linienr&amp;gt;&amp;quot;&lt;br /&gt;
  exit 255&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
function findlinie {&lt;br /&gt;
  # Find linie i /tmp/linienumre&lt;br /&gt;
  # Input : Linienummer&lt;br /&gt;
  # output: interface ip-aderesse&lt;br /&gt;
&lt;br /&gt;
  nummer=`grep -w ^$1 /tmp/linienumre | cut -d ' ' -f2,3`&lt;br /&gt;
  if [ &amp;quot;$nummer&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;$nummer&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;ikke fundet&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function portstatus {&lt;br /&gt;
  # input : $1 = ip&lt;br /&gt;
  # input : $2 = interface&lt;br /&gt;
  # output: Oppe/Nede Oppe/Nede&lt;br /&gt;
&lt;br /&gt;
  port=`echo $2 | cut -d'/' -f2`&lt;br /&gt;
&lt;br /&gt;
  # kald switch&lt;br /&gt;
  adminstatus=`snmpget -v 2c -c public $1 IF-MIB::ifAdminStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  operstatus=`snmpget -v 2c -c public $1 IF-MIB::ifOperStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$adminstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    adminstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    adminstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$operstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    operstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    operstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;$adminstatus $operstatus&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###### MAIN ######&lt;br /&gt;
&lt;br /&gt;
# Find Linie&lt;br /&gt;
l=`findlinie $1`&lt;br /&gt;
if [ &amp;quot;$l&amp;quot; == &amp;quot;ikke fundet&amp;quot; ] ; then&lt;br /&gt;
  echo &amp;quot;Linie $1 er ikke fundet!!!&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
else&lt;br /&gt;
  ps=`portstatus $l`&lt;br /&gt;
&lt;br /&gt;
  interface=`echo $l | cut -d' ' -f2`&lt;br /&gt;
  ip=`echo $l | cut -d' ' -f1`&lt;br /&gt;
&lt;br /&gt;
  as=`echo $ps | cut -d' ' -f1`&lt;br /&gt;
  os=`echo $ps | cut -d' ' -f2`&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Linie $1 er $interface paa $ip&amp;quot;&lt;br /&gt;
  echo &amp;quot;Administrativ status er: $as&amp;quot;&lt;br /&gt;
  echo &amp;quot;Operationel status er  : $os&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 10:10, 15 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
= Et eksempel på løsning af fotoopgaven =&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9026</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9026"/>
				<updated>2009-09-15T08:14:25Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Tomas løsning på SNMP1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Tomas løsning på SNMP1 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
===Tomas Løsning på SNMP2 ===&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Chech for 1 parameter&lt;br /&gt;
if ! [ $# -eq 1 ] ; then&lt;br /&gt;
  echo &amp;quot;Der mangler et linienr&amp;quot;&lt;br /&gt;
  echo &amp;quot;Brug: linie &amp;lt;linienr&amp;gt;&amp;quot;&lt;br /&gt;
  exit 255&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
function findlinie {&lt;br /&gt;
  # Find linie i /tmp/linienumre&lt;br /&gt;
  # Input : Linienummer&lt;br /&gt;
  # output: interface ip-aderesse&lt;br /&gt;
&lt;br /&gt;
  nummer=`grep -w ^$1 /tmp/linienumre | cut -d ' ' -f2,3`&lt;br /&gt;
  if [ &amp;quot;$nummer&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;$nummer&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;ikke fundet&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function portstatus {&lt;br /&gt;
  # input : $1 = ip&lt;br /&gt;
  # input : $2 = interface&lt;br /&gt;
  # output: Oppe/Nede Oppe/Nede&lt;br /&gt;
&lt;br /&gt;
  port=`echo $2 | cut -d'/' -f2`&lt;br /&gt;
&lt;br /&gt;
  # kald switch&lt;br /&gt;
  adminstatus=`snmpget -v 2c -c public $1 IF-MIB::ifAdminStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  operstatus=`snmpget -v 2c -c public $1 IF-MIB::ifOperStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$adminstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    adminstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    adminstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$operstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    operstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    operstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;$adminstatus $operstatus&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###### MAIN ######&lt;br /&gt;
&lt;br /&gt;
# Find Linie&lt;br /&gt;
l=`findlinie $1`&lt;br /&gt;
if [ &amp;quot;$l&amp;quot; == &amp;quot;ikke fundet&amp;quot; ] ; then&lt;br /&gt;
  echo &amp;quot;Linie $1 er ikke fundet!!!&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
else&lt;br /&gt;
  ps=`portstatus $l`&lt;br /&gt;
&lt;br /&gt;
  interface=`echo $l | cut -d' ' -f2`&lt;br /&gt;
  ip=`echo $l | cut -d' ' -f1`&lt;br /&gt;
&lt;br /&gt;
  as=`echo $ps | cut -d' ' -f1`&lt;br /&gt;
  os=`echo $ps | cut -d' ' -f2`&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Linie $1 er $interface paa $ip&amp;quot;&lt;br /&gt;
  echo &amp;quot;Administrativ status er: $as&amp;quot;&lt;br /&gt;
  echo &amp;quot;Operationel status er  : $os&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 10:10, 15 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Et eksempel på løsning af fotoopgaven ==&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9025</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9025"/>
				<updated>2009-09-15T08:10:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Tomas løsning på SNMP1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
===Tomas Løsning på SNMP2 ===&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Chech for 1 parameter&lt;br /&gt;
if ! [ $# -eq 1 ] ; then&lt;br /&gt;
  echo &amp;quot;Der mangler et linienr&amp;quot;&lt;br /&gt;
  echo &amp;quot;Brug: linie &amp;lt;linienr&amp;gt;&amp;quot;&lt;br /&gt;
  exit 255&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
function findlinie {&lt;br /&gt;
  # Find linie i /tmp/linienumre&lt;br /&gt;
  # Input : Linienummer&lt;br /&gt;
  # output: interface ip-aderesse&lt;br /&gt;
&lt;br /&gt;
  nummer=`grep -w ^$1 /tmp/linienumre | cut -d ' ' -f2,3`&lt;br /&gt;
  if [ &amp;quot;$nummer&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;$nummer&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;ikke fundet&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function portstatus {&lt;br /&gt;
  # input : $1 = ip&lt;br /&gt;
  # input : $2 = interface&lt;br /&gt;
  # output: Oppe/Nede Oppe/Nede&lt;br /&gt;
&lt;br /&gt;
  port=`echo $2 | cut -d'/' -f2`&lt;br /&gt;
&lt;br /&gt;
  # kald switch&lt;br /&gt;
  adminstatus=`snmpget -v 2c -c public $1 IF-MIB::ifAdminStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  operstatus=`snmpget -v 2c -c public $1 IF-MIB::ifOperStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$adminstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    adminstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    adminstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$operstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    operstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    operstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;$adminstatus $operstatus&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###### MAIN ######&lt;br /&gt;
&lt;br /&gt;
# Find Linie&lt;br /&gt;
l=`findlinie $1`&lt;br /&gt;
if [ &amp;quot;$l&amp;quot; == &amp;quot;ikke fundet&amp;quot; ] ; then&lt;br /&gt;
  echo &amp;quot;Linie $1 er ikke fundet!!!&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
else&lt;br /&gt;
  ps=`portstatus $l`&lt;br /&gt;
&lt;br /&gt;
  interface=`echo $l | cut -d' ' -f2`&lt;br /&gt;
  ip=`echo $l | cut -d' ' -f1`&lt;br /&gt;
&lt;br /&gt;
  as=`echo $ps | cut -d' ' -f1`&lt;br /&gt;
  os=`echo $ps | cut -d' ' -f2`&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Linie $1 er $interface paa $ip&amp;quot;&lt;br /&gt;
  echo &amp;quot;Administrativ status er: $as&amp;quot;&lt;br /&gt;
  echo &amp;quot;Operationel status er  : $os&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 10:10, 15 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Et eksempel på løsning af fotoopgaven ==&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9024</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9024"/>
				<updated>2009-09-15T08:09:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* SNMP 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Et eksempel på løsning af fotoopgaven ==&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9023</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=9023"/>
				<updated>2009-09-15T08:08:50Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Besvarelse fra Tomas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
=== SNMP 2 ===&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
# Chech for 1 parameter&lt;br /&gt;
if ! [ $# -eq 1 ] ; then&lt;br /&gt;
  echo &amp;quot;Der mangler et linienr&amp;quot;&lt;br /&gt;
  echo &amp;quot;Brug: linie &amp;lt;linienr&amp;gt;&amp;quot;&lt;br /&gt;
  exit 255&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
function findlinie {&lt;br /&gt;
  # Find linie i /tmp/linienumre&lt;br /&gt;
  # Input : Linienummer&lt;br /&gt;
  # output: interface ip-aderesse&lt;br /&gt;
&lt;br /&gt;
  nummer=`grep -w ^$1 /tmp/linienumre | cut -d ' ' -f2,3`&lt;br /&gt;
  if [ &amp;quot;$nummer&amp;quot; != &amp;quot;&amp;quot; ] ; then&lt;br /&gt;
    echo &amp;quot;$nummer&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    echo &amp;quot;ikke fundet&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function portstatus {&lt;br /&gt;
  # input : $1 = ip&lt;br /&gt;
  # input : $2 = interface&lt;br /&gt;
  # output: Oppe/Nede Oppe/Nede&lt;br /&gt;
&lt;br /&gt;
  port=`echo $2 | cut -d'/' -f2`&lt;br /&gt;
&lt;br /&gt;
  # kald switch&lt;br /&gt;
  adminstatus=`snmpget -v 2c -c public $1 IF-MIB::ifAdminStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  operstatus=`snmpget -v 2c -c public $1 IF-MIB::ifOperStatus.$port | cut -d' ' -f4`&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$adminstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    adminstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    adminstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$operstatus&amp;quot; == &amp;quot;up(1)&amp;quot; ] ; then&lt;br /&gt;
    operstatus=&amp;quot;Oppe&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    operstatus=&amp;quot;Nede&amp;quot;&lt;br /&gt;
  fi&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;$adminstatus $operstatus&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###### MAIN ######&lt;br /&gt;
&lt;br /&gt;
# Find Linie&lt;br /&gt;
l=`findlinie $1`&lt;br /&gt;
if [ &amp;quot;$l&amp;quot; == &amp;quot;ikke fundet&amp;quot; ] ; then&lt;br /&gt;
  echo &amp;quot;Linie $1 er ikke fundet!!!&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
else&lt;br /&gt;
  ps=`portstatus $l`&lt;br /&gt;
&lt;br /&gt;
  interface=`echo $l | cut -d' ' -f2`&lt;br /&gt;
  ip=`echo $l | cut -d' ' -f1`&lt;br /&gt;
&lt;br /&gt;
  as=`echo $ps | cut -d' ' -f1`&lt;br /&gt;
  os=`echo $ps | cut -d' ' -f2`&lt;br /&gt;
&lt;br /&gt;
  echo &amp;quot;Linie $1 er $interface paa $ip&amp;quot;&lt;br /&gt;
  echo &amp;quot;Administrativ status er: $as&amp;quot;&lt;br /&gt;
  echo &amp;quot;Operationel status er  : $os&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Et eksempel på løsning af fotoopgaven ==&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8574</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8574"/>
				<updated>2009-09-03T12:15:03Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Besvarelse fra Tomas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Et eksempel på løsning af fotoopgaven ==&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8573</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8573"/>
				<updated>2009-09-03T12:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Et eksempel på løsning af fotoopgaven */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Et eksempel på løsning af fotoopgaven ==&lt;br /&gt;
&lt;br /&gt;
Her er så min løsning.&lt;br /&gt;
&amp;lt;source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Programmet konverterer billeder i et eller flere kataloger, således at &lt;br /&gt;
## længste side på billedet er max 800px. Aspekt forholdet bibeholdes.&lt;br /&gt;
## Hvis længste side er &amp;lt; 800px, skal størrelsen ikke ændres.&lt;br /&gt;
## Billedet skal komprimeres til 75%.&lt;br /&gt;
## EXIF data må ikke ændres/fjernes (Kun info billedstørrelsen).&lt;br /&gt;
## Det konverterede billede flyttes til et andet katalog.&lt;br /&gt;
&lt;br /&gt;
## INITIAL&lt;br /&gt;
&lt;br /&gt;
## Original Billedrod&lt;br /&gt;
PICTROOT=/tmp/billeder&lt;br /&gt;
&lt;br /&gt;
## Behandlede Billeder rod&lt;br /&gt;
CONVROOT=/home/tcj/Billeder&lt;br /&gt;
&lt;br /&gt;
## Maximal sidelaengde&lt;br /&gt;
MAXLEN=800&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#   FUNCTIONER    #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
function dimension {&lt;br /&gt;
  ## Finder størrelse og aspekt forholdet paa et billede&lt;br /&gt;
  # input : $1 = filnavn paa billede&lt;br /&gt;
  # output: tekst: &amp;quot;X Y aspectforhold&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  # Find stoerrelsen&lt;br /&gt;
  pictinfo=`rdjpgcom -verbose $1 | grep &amp;quot;JPEG image&amp;quot; | cut -d' ' -f4,6| sed 's/[whh,]//g'`&lt;br /&gt;
  # Et lille regnestykke&lt;br /&gt;
  udtryk=`echo $pictinfo | sed 's/ /\//'`&lt;br /&gt;
  # Udregn aspekt forholdet ( et tal &amp;gt; 1 betyder laengden er stoerst )&lt;br /&gt;
  aspekt=`echo &amp;quot;scale=5;$udtryk&amp;quot; | bc`&lt;br /&gt;
  # Rturner vaerdier&lt;br /&gt;
  echo &amp;quot;$pictinfo $aspekt&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function nydimension {&lt;br /&gt;
  ## Finder ny størrelse på billede&lt;br /&gt;
  # input : $1 = X&lt;br /&gt;
  # input : $2 = Y&lt;br /&gt;
  # input : $3 = aspectforhold&lt;br /&gt;
  # output: tekst: &amp;quot;X Y&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  x=$1&lt;br /&gt;
  y=$2&lt;br /&gt;
&lt;br /&gt;
  if [ `echo &amp;quot;$3 &amp;gt;= 1&amp;quot; | bc` ] ; then&lt;br /&gt;
    # Hvis aspektet er &amp;gt;= 1 er X stoerst&lt;br /&gt;
    if [ $1 -gt $MAXLEN ] ; then&lt;br /&gt;
    # Hvis siden er stoerre end 800 skal billedet formindskes&lt;br /&gt;
      formindsk=`echo &amp;quot;scale=5;$1/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
      x=$MAXLEN&lt;br /&gt;
      y=`echo &amp;quot;$2/$formindsk&amp;quot; | bc`&lt;br /&gt;
    fi&lt;br /&gt;
  else&lt;br /&gt;
   # Y er størst&lt;br /&gt;
   if [ $2 -gt $MAXLEN ] ; then&lt;br /&gt;
   # Hvis siden er stoerre end $MAXLEN skal billedet formindskes&lt;br /&gt;
     formindsk=`echo &amp;quot;scale=5;$2/$MAXLEN&amp;quot; | bc`&lt;br /&gt;
     y=$MAXLEN&lt;br /&gt;
     x=`echo &amp;quot;$1/$formindsk&amp;quot; | bc`&lt;br /&gt;
   fi&lt;br /&gt;
 fi&lt;br /&gt;
 echo &amp;quot;${x}x${y}&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function billednavn {&lt;br /&gt;
  ## Laver et nyt billednavn&lt;br /&gt;
  # input : $1 loebenr&lt;br /&gt;
  # input : $2 fotografnavn&lt;br /&gt;
  # output: Tekst: Et filnavn&lt;br /&gt;
&lt;br /&gt;
  # Lav datodelen&lt;br /&gt;
  dd=`date &amp;quot;+_%y_%m_%d_&amp;quot;`&lt;br /&gt;
  echo &amp;quot;${2}${dd}$1.jpg&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
###################&lt;br /&gt;
#      MAIN       #&lt;br /&gt;
###################&lt;br /&gt;
&lt;br /&gt;
cd $PICTROOT&lt;br /&gt;
&lt;br /&gt;
# Start på gennemløb af træ&lt;br /&gt;
for dir in * ; do&lt;br /&gt;
  if ! [ -e $CONVROOT/${dir}beh ] ; then&lt;br /&gt;
    # Opret katalog for behandlede billeder&lt;br /&gt;
    mkdir $CONVROOT/${dir}beh&lt;br /&gt;
  fi&lt;br /&gt;
  # Rend billederne igennem&lt;br /&gt;
  cd $dir&lt;br /&gt;
  &lt;br /&gt;
  # Billedtæller&lt;br /&gt;
  i=1;&lt;br /&gt;
  for billed in *.jpg ; do&lt;br /&gt;
    d=`dimension $PICTROOT/$dir/$billed`&lt;br /&gt;
    nd=`nydimension $d`&lt;br /&gt;
&lt;br /&gt;
    # Lav det nye billede - start med et ny filnavn&lt;br /&gt;
    filnavn=`billednavn $i $dir`&lt;br /&gt;
    echo &amp;quot;Vent laver $billed om til $filnavn&amp;quot; &lt;br /&gt;
    convert $PICTROOT/$dir/$billed -quality 75 -resize $nd $CONVROOT/${dir}beh/$filnavn&lt;br /&gt;
    # Tæl billedtæller op&lt;br /&gt;
    i=$[i+1]&lt;br /&gt;
  done&lt;br /&gt;
  cd ..&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 14:00, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8572</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8572"/>
				<updated>2009-09-03T11:56:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Tomas løsning på SNMP1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|Tomas Christian Jensen]] 13:56, 3 September 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8571</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8571"/>
				<updated>2009-09-03T11:55:55Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Tomas løsning på SNMP1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash line&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#&lt;br /&gt;
# Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
#&lt;br /&gt;
 &lt;br /&gt;
## INITIAL&lt;br /&gt;
# Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## FUNKTIONER ##&lt;br /&gt;
#&lt;br /&gt;
function SNMPPortCnt {&lt;br /&gt;
  ## Aflaeser trafikken for en given port&lt;br /&gt;
  # input:  $1 = ip adresse på node&lt;br /&gt;
  # input:  $2 = portnr (1-24)&lt;br /&gt;
  # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
&lt;br /&gt;
  cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
  int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
  echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
####################&lt;br /&gt;
#     MAIN         #&lt;br /&gt;
####################&lt;br /&gt;
for node in $switch ; do&lt;br /&gt;
  # rend gennem alle switch&lt;br /&gt;
  for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
    # port 1 til 24&lt;br /&gt;
    SNMPPortCnt $node $port&lt;br /&gt;
  done&lt;br /&gt;
# Pipe over i while, som udskriver pænt&lt;br /&gt;
done | sort -rn | head -n10 | \&lt;br /&gt;
  while read max ; do&lt;br /&gt;
    c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
    p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
    i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
    # udskriv resultat&lt;br /&gt;
    printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
  done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8561</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8561"/>
				<updated>2009-09-02T12:13:31Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Tomas løsning på SNMP1 */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
::Hej Tomas - Som sædvanlig en rigtig god og let læselig løsning. [[User:Heth|Henrik Thomsen]] 12:13, 2 September 2009 (CEST)&lt;br /&gt;
:::Har du ikke et større projekt i skuffen vi kunne starte ud på&lt;br /&gt;
&lt;br /&gt;
== Tomas løsning på SNMP1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Source lang=bash&amp;gt;&lt;br /&gt;
  1 #!/usr/bin/bash&lt;br /&gt;
  2&lt;br /&gt;
  3 #&lt;br /&gt;
  4 # Programmet finder de 10 porte, hvor der er mest trafik.&lt;br /&gt;
  5 #&lt;br /&gt;
  6&lt;br /&gt;
  7 ## INITIAL&lt;br /&gt;
  8 # Noder der skal scannes. mellemrum sepereret&lt;br /&gt;
  9 switch=&amp;quot;192.168.22.201 192.168.22.202&amp;quot;&lt;br /&gt;
 10&lt;br /&gt;
 11 ## FUNKTIONER ##&lt;br /&gt;
 12 #&lt;br /&gt;
 13 function SNMPPortCnt {&lt;br /&gt;
 14   ## Aflaeser trafikken for en given port&lt;br /&gt;
 15   # input:  $1 = ip adresse på node&lt;br /&gt;
 16   # input:  $2 = portnr (1-24)&lt;br /&gt;
 17   # output: Tekst : &amp;quot;cnt:port:node&amp;quot; (port er i klartekst)&lt;br /&gt;
 18&lt;br /&gt;
 19   cnt=`snmpget -v 2c -c public $1 IF-MIB::ifInOctets.$2 | sed 's/.*:[ \t]*//'`&lt;br /&gt;
 20   int=`snmpget -v 2c -c public $1 IF-MIB::ifDescr.$2 | cut -d':' -f4 | sed 's/^ //'`&lt;br /&gt;
 21   echo &amp;quot;$cnt:$int:$1&amp;quot;&lt;br /&gt;
 22 }&lt;br /&gt;
 23&lt;br /&gt;
 24 ####################&lt;br /&gt;
 25 #     MAIN         #&lt;br /&gt;
 26 ####################&lt;br /&gt;
 27 for node in $switch ; do&lt;br /&gt;
 28   # rend gennem alle switch&lt;br /&gt;
 29   for (( port=1 ; port&amp;lt;=24; port+=1 )) ; do&lt;br /&gt;
 30     # port 1 til 24&lt;br /&gt;
 31     SNMPPortCnt $node $port&lt;br /&gt;
 32   done&lt;br /&gt;
 33 # Pipe over i while, som udskriver pænt&lt;br /&gt;
 34 done | sort -rn | head -n10 | \&lt;br /&gt;
 35   while read max ; do&lt;br /&gt;
 36     c=`echo $max | cut -d ':' -f1`&lt;br /&gt;
 37     p=`echo $max | cut -d ':' -f2`&lt;br /&gt;
 38     i=`echo $max | cut -d ':' -f3`&lt;br /&gt;
 39     # udskriv resultat&lt;br /&gt;
 40     printf &amp;quot;Bruger paa %-15s port %-16s har sent %s bytes\n&amp;quot; $i $p $c&lt;br /&gt;
 41   done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8557</id>
		<title>Talk:UNIX opgaver</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgaver&amp;diff=8557"/>
				<updated>2009-09-02T09:07:22Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Besvarelse fra Tomas */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= fra kbso =&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Roed opgave&lt;br /&gt;
## Lav et script der finder forsg p at logge ind p maskinen via kopi af logfilen /tmp/auth.log&lt;br /&gt;
## Jeg kunne tnke mig at vide hvor mange mislykkede login forsg der er&lt;br /&gt;
&lt;br /&gt;
# Log fil&lt;br /&gt;
LOG=&amp;quot;/tmp/auth.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# vis indhold af $log, find antal invalid logins, sorter i paa antal linjer&lt;br /&gt;
LINJER=`cat $LOG | grep Invalid | wc -l | tr -s &amp;quot;\t&amp;quot; ' '`&lt;br /&gt;
echo &amp;quot;Der var$LINJER invalide login forsoeg i alt.&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Gul opgave&lt;br /&gt;
## Hvor mange mislykkede forsg p at logge er der om dagen. En linie pr. dato i rapporten&lt;br /&gt;
&lt;br /&gt;
PERDAG=`cat $LOG | grep Invalid | tr -s ' ' | cut -d' ' -f1-2 | sort | uniq -c | sort -rn`&lt;br /&gt;
echo &amp;quot;Invalide login forsoeg per dag:&lt;br /&gt;
$PERDAG&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Groen opgave&lt;br /&gt;
&lt;br /&gt;
NAVNE=`cat $LOG | grep 'Invalid' |rev | cut -d ' ' -f 3| rev | sort | uniq -c | sort -r -n`&lt;br /&gt;
echo &amp;quot;Anvendte brugernavne ved invalide logins:&lt;br /&gt;
$NAVNE&amp;quot; | less&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Besvarelse fra Tomas ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
&lt;br /&gt;
## Scriptet læser antal fejlede logins&lt;br /&gt;
## De fejlede er: Hacking forsøg (reverse mapping)&lt;br /&gt;
##			&amp;quot;        (Did not recieve ident)&lt;br /&gt;
##                Forkert bruger (Invalid user)&lt;br /&gt;
##		  Forkert password men rigtig bruger (Failed keybord)&lt;br /&gt;
##		  Anden fejl (error: PAM)&lt;br /&gt;
&lt;br /&gt;
##### INITIAL VÆRDIER #####&lt;br /&gt;
LOGFIL=/tmp/auth.log&lt;br /&gt;
DD=`date`&lt;br /&gt;
&lt;br /&gt;
##### FUNKTIONER #####&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function overskrift {&lt;br /&gt;
## Header&lt;br /&gt;
# Udskriv en header&lt;br /&gt;
# input: $1 = dagsdato&lt;br /&gt;
# input: $2 = logstart&lt;br /&gt;
# input: $3 = logslut&lt;br /&gt;
&lt;br /&gt;
cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
Fejlede SSH logins på mars.tekkom.dk&lt;br /&gt;
====================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: $1&lt;br /&gt;
&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
 Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 ------------------------------------------------------------------------------------&lt;br /&gt;
HEADER&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function startdato {&lt;br /&gt;
  ## Find start dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
&lt;br /&gt;
  head -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3 &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function slutdato {&lt;br /&gt;
  ## Find slut dato i logfil&lt;br /&gt;
  #  input: $1 = filnavn&lt;br /&gt;
  #  output: dato som tekst&lt;br /&gt;
  tail -n 1 $1 | sed 's/  / /g' | cut -d' ' -f1-3&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function loginfejl {&lt;br /&gt;
  ## Find alle linier, hvor en given tekst findes. &lt;br /&gt;
  # input: $1 = filnavn&lt;br /&gt;
  # input: $2 = søgetekst&lt;br /&gt;
  # output: antal fundet&lt;br /&gt;
&lt;br /&gt;
  ## Forklaring:&lt;br /&gt;
  # grep &amp;quot;$2&amp;quot; $1    : Find linier med en given tekst&lt;br /&gt;
  # cut -d':' -f4-  : Fjern tidsstempel og andet junk&lt;br /&gt;
  # sed 's/^ *//'   : Fjern eventuelle  indledende mellemrum&lt;br /&gt;
  # wc -l           : Tæl linier&lt;br /&gt;
  # sed 's/^ *//'   : Fjern indledende mellemrum&lt;br /&gt;
  grep &amp;quot;$2&amp;quot; $1 | cut -d':' -f4- |  sed 's/^ *//' |  wc -l | sed 's/^ *//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function dage {&lt;br /&gt;
  ## Find dage i logfilen&lt;br /&gt;
  # input : $1 = filnavn&lt;br /&gt;
  # output: liste over dage i filen&lt;br /&gt;
  #         listen er newline sepereret. Hver linie indeholder en blanktegnsepereret&lt;br /&gt;
  #         dato: &amp;quot;mnd dato&amp;quot;&lt;br /&gt;
  cut -b1-6 $1 | sort | uniq&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function invalidusr {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 invalid user&lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
&lt;br /&gt;
grep Invalid $1 | sed 's/  / /' | cut -d' ' -f10|sort|uniq -c| while read c i ; do \&lt;br /&gt;
                                                                 if [ $c -gt 10 ] ; then&lt;br /&gt;
								   echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
								 fi&lt;br /&gt;
							       done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function reversemap {&lt;br /&gt;
## Find de ip adresser, der laver mere end 10 reverse mapping checking &lt;br /&gt;
# input: $1 = filnavn&lt;br /&gt;
# output: liste med antal og adresser&lt;br /&gt;
grep reverse $1 | sed 's/  / /' | cut -d' ' -f 12 | sort | sed -e 's/\[//g' -e 's/\]//g' | \&lt;br /&gt;
  uniq -c | while read c i ; do&lt;br /&gt;
    if [ $c -gt 10 ] ; then&lt;br /&gt;
      echo &amp;quot;$c $i&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
  done&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#######################&lt;br /&gt;
######## MAIN #########&lt;br /&gt;
#######################&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nROED OPGAVE ==========\n&amp;quot;&lt;br /&gt;
## Find loginfejl: Did not receive identification string from xxx&lt;br /&gt;
DIDNOT=`loginfejl $LOGFIL &amp;quot;Did not&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Did not receive identification string from xxxx    : $DIDNOT&amp;quot;&lt;br /&gt;
## Find loginfejl: Failed keyboard-interactive/pam for invalid user&lt;br /&gt;
FAILKEYB=`loginfejl $LOGFIL &amp;quot;Failed keyboard-interactive&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Failed keyboard-interactive/pam for invalid user   : $FAILKEYB&amp;quot;&lt;br /&gt;
## Find loginfejl: Invalid user xxx from yyyy&lt;br /&gt;
INVALUSR=`loginfejl $LOGFIL &amp;quot;Invalid user&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: Invalid user                                       : $INVALUSR&amp;quot;&lt;br /&gt;
## Find loginfejl: error: PAM: authentication error for xxx from yyyy&lt;br /&gt;
ERRPAM=`loginfejl $LOGFIL &amp;quot;error: PAM:&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: error: PAM: authentication error for xxx from yyyy : $ERRPAM&amp;quot;&lt;br /&gt;
## Find loginfejl: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!&lt;br /&gt;
REVMAP=`loginfejl $LOGFIL &amp;quot;reverse mapping&amp;quot;`&lt;br /&gt;
echo &amp;quot;Antal: reverse mapping checking POSSIBLE BREAK-IN ATTEMPT!: $REVMAP&amp;quot;&lt;br /&gt;
&lt;br /&gt;
IALT=`expr $DIDNOT + $FAILKEYB + $INVALUSR + $ERRPAM + $REVMAP`&lt;br /&gt;
echo &amp;quot;Ialt fejlede dette antal loginforsøg                      : $IALT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGUL OPGAVE ========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Fejlede logins fordeler sig således over dage:&amp;quot;&lt;br /&gt;
# mnd = måned&lt;br /&gt;
# dag = dag&lt;br /&gt;
dage $LOGFIL| while read mnd dag ; do&lt;br /&gt;
   &lt;br /&gt;
   cnt=`grep &amp;quot;$mnd *$dag&amp;quot; $LOGFIL | \&lt;br /&gt;
   grep -E 'Did not|Failed keyboard-interactive|Invalid user|error: PAM:|reverse mapping'| \&lt;br /&gt;
   wc -l | sed 's/^ *//'`&lt;br /&gt;
&lt;br /&gt;
   printf &amp;quot;D. %2s. %3s er der afvist %s ssh login\n&amp;quot; $dag $mnd $cnt&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
echo -e &amp;quot;\nGROEN OPGAVE =========\n&amp;quot;&lt;br /&gt;
echo &amp;quot;Følgende sikkerhedsproblemer er fundet:&amp;quot;&lt;br /&gt;
## Her er lidt quick and dirty programmering.&lt;br /&gt;
# -Reverse mapping antyder at den der logger på ikke er den vedkommende påstår den er.&lt;br /&gt;
#  Det kan også være at vedkommende ikke har en A-record i dns'en.&lt;br /&gt;
# -Invalid user er 95% bruteforce hacking forsøg!Hvis det kun er en enkeltstående, er&lt;br /&gt;
#  det en slåfejl (fejl 40).&lt;br /&gt;
# -Failed keyboard-interactive/pam er, når det er enkeltstående fejl tastefejl hos &lt;br /&gt;
#  bruger.&lt;br /&gt;
#&lt;br /&gt;
## Jeg sætter følgende grænser:&lt;br /&gt;
#  reverse og invalid: Samme ip mere end 10 gange er et angreb på ssh servicen.&lt;br /&gt;
## Aktion:&lt;br /&gt;
#  Der sendes en mail med advarsel og løsningsforslag.&lt;br /&gt;
&lt;br /&gt;
invalidusr $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; BREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
==========================&lt;br /&gt;
&lt;br /&gt;
$ip har forsøgt $cnt gange atlogge ind via ssh med brute force.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
BREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
reversemap $LOGFIL | while read cnt ip ; do&lt;br /&gt;
cat &amp;lt;&amp;lt; ANDETBREV&lt;br /&gt;
to: ttt@infected.com&lt;br /&gt;
from: warning@infected.com&lt;br /&gt;
==========================&lt;br /&gt;
#     WARNING HACKED???  #&lt;br /&gt;
$ip har forsøgt $cnt gange at logge ind via ssh med en ipadresse der ikke har&lt;br /&gt;
en A-Record i DNSen.&lt;br /&gt;
- Enten luk for $ip i firewallen&lt;br /&gt;
- Eller indsæt $ip i /etc/host.deny&lt;br /&gt;
ANDETBREV&lt;br /&gt;
echo -e &amp;quot;\n&amp;quot;&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8541</id>
		<title>Talk:UNIX opgave Apache Access log</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8541"/>
				<updated>2009-09-01T06:47:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Her er så mit udkast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Her er så mit udkast ==&lt;br /&gt;
Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet.&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
  1 #!/usr/bin/bash&lt;br /&gt;
  2 &lt;br /&gt;
  3 ## Initial værdier&lt;br /&gt;
  4 #&lt;br /&gt;
  5 # Logfil&lt;br /&gt;
  6 LOGFIL=/tmp/httpd-access.log&lt;br /&gt;
  7 &lt;br /&gt;
  8 # Dato&lt;br /&gt;
  9 DD=`date`&lt;br /&gt;
 10 &lt;br /&gt;
 11 &lt;br /&gt;
 12 ## Programmet udskriver en rapport over de 50 mest aktive adresser&lt;br /&gt;
 13 ## Adresserne sorteres faldende.&lt;br /&gt;
 14 &lt;br /&gt;
 15 function dnslookup {&lt;br /&gt;
 16   ## Lav DNS lookup.&lt;br /&gt;
 17   #  input:  $1 = ipdresse&lt;br /&gt;
 18   #  output: dnsopslag&lt;br /&gt;
 19 &lt;br /&gt;
 20   dig -x $1 | grep PTR | grep -v -E '^;' | tr ' \t' ' '|cut -d' ' -f5&lt;br /&gt;
 21 }&lt;br /&gt;
 22 &lt;br /&gt;
 23 function overskrift {&lt;br /&gt;
 24   ## Udskriv sidetop&lt;br /&gt;
 25   #  input: $1 = dagsdato&lt;br /&gt;
 26   #  input: $2 = logfil start&lt;br /&gt;
 27   #  input: $3 = logfil slut&lt;br /&gt;
 28   #  output: tekst&lt;br /&gt;
 29   cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
 30 HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
 31 ======================================&lt;br /&gt;
 32  &lt;br /&gt;
 33  Rapporten genereret: $1&lt;br /&gt;
 34   &lt;br /&gt;
 35   ------------------------------------------------------------------------------------&lt;br /&gt;
 36   Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 37   ------------------------------------------------------------------------------------&lt;br /&gt;
 38 HEADER&lt;br /&gt;
 39 &lt;br /&gt;
 40 }&lt;br /&gt;
 41 &lt;br /&gt;
 42 function startdato {&lt;br /&gt;
 43   ## Find start dato i logfil&lt;br /&gt;
 44   #  input: $1 = filnavn&lt;br /&gt;
 45   #  output: dato som tekst&lt;br /&gt;
 46 &lt;br /&gt;
 47   head -n 1 $LOGFIL | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 48 }&lt;br /&gt;
 49 &lt;br /&gt;
 50 function slutdato {&lt;br /&gt;
 51   ## Find slut dato i logfil&lt;br /&gt;
 52   #  input: $1 = filnavn&lt;br /&gt;
 53   #  output: dato som tekst&lt;br /&gt;
 54   tail -n 1 $LOGFIL | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 55 &lt;br /&gt;
 56 }&lt;br /&gt;
 57 &lt;br /&gt;
 58 #######################&lt;br /&gt;
 59 ######## MAIN #########&lt;br /&gt;
 60 #######################&lt;br /&gt;
 61 &lt;br /&gt;
 62 # Findes logfilen så kører vi&lt;br /&gt;
 63 if ! [ -e $LOGFIL ] ; then&lt;br /&gt;
 64   echo &amp;quot;$LOGIL kunne ikke findes.&amp;quot; ; exit 255&lt;br /&gt;
 65 fi&lt;br /&gt;
 66 &lt;br /&gt;
 67 # Lav en overskrift&lt;br /&gt;
 68 overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
 69 &lt;br /&gt;
 70 # Udskriv statistikken&lt;br /&gt;
 71 # forklaring paa oneliner:&lt;br /&gt;
 72 # cut -d' ' -f1 $LOGFIL : felt 1 er ipadressen på webclientn.&lt;br /&gt;
 73 # sort                  : før ipadresserne skal taelles skal de sorteres. uniq kræv&lt;br /&gt;
 74 #                         at listen er sorteret.&lt;br /&gt;
 75 # uniq -c               : sammentæl forkomster af unikke ip adresser&lt;br /&gt;
 76 # sort -rn              : sorter i omvendt rækkefølge og numerisk. sort sorterer default alfabeti&lt;br /&gt;
 77 # head -n 50            : ikke flere end 50&lt;br /&gt;
 78 # while read ...        : laver output og dnsopslag&lt;br /&gt;
 79 cut -d' ' -f1 $LOGFIL | sort | uniq -c | sort -nr | head -n 50 | \&lt;br /&gt;
 80                                                       while read cnt ip ; do \&lt;br /&gt;
 81                                                         echo -e &amp;quot;$cnt $ip \t(`dnslookup $ip`)&amp;quot;; \&lt;br /&gt;
 82                                                       done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output fra scriptet ===&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[tcj@mars ~/bin]$ HttpReport &lt;br /&gt;
HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
======================================&lt;br /&gt;
 &lt;br /&gt;
 Rapporten genereret: Fri Aug 28 23:55:13 CEST 2009&lt;br /&gt;
  &lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
  Data opsamlet er fra perioden den  26 Aug 2009 22:21:13 til den  28 Aug 2009 06:40:07&lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
806 192.168.146.155     ()&lt;br /&gt;
508 87.56.15.130        (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.)&lt;br /&gt;
306 77.212.13.52        (0x4dd40d34.adsl.cybercity.dk.)&lt;br /&gt;
301 195.181.54.128      (pixuv.eucmidt.dk.)&lt;br /&gt;
294 89.249.4.2  ()&lt;br /&gt;
283 192.168.146.156     ()&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST)&lt;br /&gt;
::Hej Tomas. Rigtig flot og god løsning. :-) [[User:Heth|Henrik Thomsen]] 09:07, 30 August 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=User:Tcj&amp;diff=8427</id>
		<title>User:Tcj</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=User:Tcj&amp;diff=8427"/>
				<updated>2009-08-28T22:20:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: New page: == Tomas Jensen == * Beskæftiget med: ** Ip-specialist hos TDC. ** DHCP (Nominum DCS) servere ** Juniper routere ** Cisco routere ** Linux servere ** Linux arbejdsstaioner ** Scripting i:...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Tomas Jensen ==&lt;br /&gt;
* Beskæftiget med:&lt;br /&gt;
** Ip-specialist hos TDC.&lt;br /&gt;
** DHCP (Nominum DCS) servere&lt;br /&gt;
** Juniper routere&lt;br /&gt;
** Cisco routere&lt;br /&gt;
** Linux servere&lt;br /&gt;
** Linux arbejdsstaioner&lt;br /&gt;
** Scripting i:&lt;br /&gt;
*** Perl&lt;br /&gt;
*** Bash&lt;br /&gt;
*** awk&lt;br /&gt;
* Hobby dims&lt;br /&gt;
** Digital fotografering [http://fotoklub.tomas.dk Skanderborg fotoklub]&lt;br /&gt;
** Computere. [http://opensuse.org OpenSuSE], XP og Vista&lt;br /&gt;
** Spejderleder i [http://dds-skanderborg.dk DDS Skanderborg]&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|tcj]] 00:20, 29 August 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8426</id>
		<title>Talk:UNIX opgave Apache Access log</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8426"/>
				<updated>2009-08-28T22:12:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Output fra scriptet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Her er så mit udkast ==&lt;br /&gt;
Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet.&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
  1 #!/usr/bin/bash&lt;br /&gt;
  2 &lt;br /&gt;
  3 ## Initial værdier&lt;br /&gt;
  4 #&lt;br /&gt;
  5 # Logfil&lt;br /&gt;
  6 LOGFIL=/tmp/httpd-access.log&lt;br /&gt;
  7 &lt;br /&gt;
  8 # Dato&lt;br /&gt;
  9 DD=`date`&lt;br /&gt;
 10 &lt;br /&gt;
 11 &lt;br /&gt;
 12 ## Programmet udskriver en rapport over de 50 mest aktive adresser&lt;br /&gt;
 13 ## Adresserne sorteres faldende.&lt;br /&gt;
 14 &lt;br /&gt;
 15 function dnslookup {&lt;br /&gt;
 16   ## Lav DNS lookup.&lt;br /&gt;
 17   #  input:  $1 = ipdresse&lt;br /&gt;
 18   #  output: dnsopslag&lt;br /&gt;
 19 &lt;br /&gt;
 20   dig -x $1 | grep PTR | grep -v -E '^;' | tr ' \t' ' '|cut -d' ' -f5&lt;br /&gt;
 21 }&lt;br /&gt;
 22 &lt;br /&gt;
 23 function overskrift {&lt;br /&gt;
 24   ## Udskriv sidetop&lt;br /&gt;
 25   #  input: $1 = dagsdato&lt;br /&gt;
 26   #  input: $2 = logfil start&lt;br /&gt;
 27   #  input: $3 = logfil slut&lt;br /&gt;
 28   #  output: tekst&lt;br /&gt;
 29   cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
 30 HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
 31 ======================================&lt;br /&gt;
 32  &lt;br /&gt;
 33  Rapporten genereret: $1&lt;br /&gt;
 34   &lt;br /&gt;
 35   ------------------------------------------------------------------------------------&lt;br /&gt;
 36   Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 37   ------------------------------------------------------------------------------------&lt;br /&gt;
 38 HEADER&lt;br /&gt;
 39 &lt;br /&gt;
 40 }&lt;br /&gt;
 41 &lt;br /&gt;
 42 function startdato {&lt;br /&gt;
 43   ## Find start dato i logfil&lt;br /&gt;
 44   #  input: $1 = filnavn&lt;br /&gt;
 45   #  output: dato som tekst&lt;br /&gt;
 46 &lt;br /&gt;
 47   head -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 48 }&lt;br /&gt;
 49 &lt;br /&gt;
 50 function slutdato {&lt;br /&gt;
 51   ## Find slut dato i logfil&lt;br /&gt;
 52   #  input: $1 = filnavn&lt;br /&gt;
 53   #  output: dato som tekst&lt;br /&gt;
 54   tail -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 55 &lt;br /&gt;
 56 }&lt;br /&gt;
 57 &lt;br /&gt;
 58 #######################&lt;br /&gt;
 59 ######## MAIN #########&lt;br /&gt;
 60 #######################&lt;br /&gt;
 61 &lt;br /&gt;
 62 # Findes logfilen så kører vi&lt;br /&gt;
 63 if ! [ -e $LOGFIL ] ; then&lt;br /&gt;
 64   exit 255&lt;br /&gt;
 65 fi&lt;br /&gt;
 66 &lt;br /&gt;
 67 # Lav en overskrift&lt;br /&gt;
 68 overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
 69 &lt;br /&gt;
 70 # Udskriv statistikken&lt;br /&gt;
 71 # forklaring paa oneliner:&lt;br /&gt;
 72 # cut -d' ' -f1 $LOGFIL : felt 1 er ipadressen på webclientn.&lt;br /&gt;
 73 # sort                  : før ipadresserne skal taelles skal de sorteres. uniq kræv&lt;br /&gt;
 74 #                         at listen er sorteret.&lt;br /&gt;
 75 # uniq -c               : sammentæl forkomster af unikke ip adresser&lt;br /&gt;
 76 # sort -rn              : sorter i omvendt rækkefølge og numerisk. sort sorterer default alfabeti&lt;br /&gt;
 77 # head -n 50            : ikke flere end 50&lt;br /&gt;
 78 # while read ...        : laver output og dnsopslag&lt;br /&gt;
 79 cut -d' ' -f1 $LOGFIL | sort | uniq -c | sort -nr | head -n 50 | \&lt;br /&gt;
 80                                                       while read cnt ip ; do \&lt;br /&gt;
 81                                                         echo -e &amp;quot;$cnt $ip \t(`dnslookup $ip`)&amp;quot;; \&lt;br /&gt;
 82                                                       done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output fra scriptet ===&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[tcj@mars ~/bin]$ HttpReport &lt;br /&gt;
HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
======================================&lt;br /&gt;
 &lt;br /&gt;
 Rapporten genereret: Fri Aug 28 23:55:13 CEST 2009&lt;br /&gt;
  &lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
  Data opsamlet er fra perioden den  26 Aug 2009 22:21:13 til den  28 Aug 2009 06:40:07&lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
806 192.168.146.155     ()&lt;br /&gt;
508 87.56.15.130        (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.)&lt;br /&gt;
306 77.212.13.52        (0x4dd40d34.adsl.cybercity.dk.)&lt;br /&gt;
301 195.181.54.128      (pixuv.eucmidt.dk.)&lt;br /&gt;
294 89.249.4.2  ()&lt;br /&gt;
283 192.168.146.156     ()&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8425</id>
		<title>Talk:UNIX opgave Apache Access log</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8425"/>
				<updated>2009-08-28T22:11:21Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Output fra scriptet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Her er så mit udkast ==&lt;br /&gt;
Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet.&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
  1 #!/usr/bin/bash&lt;br /&gt;
  2 &lt;br /&gt;
  3 ## Initial værdier&lt;br /&gt;
  4 #&lt;br /&gt;
  5 # Logfil&lt;br /&gt;
  6 LOGFIL=/tmp/httpd-access.log&lt;br /&gt;
  7 &lt;br /&gt;
  8 # Dato&lt;br /&gt;
  9 DD=`date`&lt;br /&gt;
 10 &lt;br /&gt;
 11 &lt;br /&gt;
 12 ## Programmet udskriver en rapport over de 50 mest aktive adresser&lt;br /&gt;
 13 ## Adresserne sorteres faldende.&lt;br /&gt;
 14 &lt;br /&gt;
 15 function dnslookup {&lt;br /&gt;
 16   ## Lav DNS lookup.&lt;br /&gt;
 17   #  input:  $1 = ipdresse&lt;br /&gt;
 18   #  output: dnsopslag&lt;br /&gt;
 19 &lt;br /&gt;
 20   dig -x $1 | grep PTR | grep -v -E '^;' | tr ' \t' ' '|cut -d' ' -f5&lt;br /&gt;
 21 }&lt;br /&gt;
 22 &lt;br /&gt;
 23 function overskrift {&lt;br /&gt;
 24   ## Udskriv sidetop&lt;br /&gt;
 25   #  input: $1 = dagsdato&lt;br /&gt;
 26   #  input: $2 = logfil start&lt;br /&gt;
 27   #  input: $3 = logfil slut&lt;br /&gt;
 28   #  output: tekst&lt;br /&gt;
 29   cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
 30 HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
 31 ======================================&lt;br /&gt;
 32  &lt;br /&gt;
 33  Rapporten genereret: $1&lt;br /&gt;
 34   &lt;br /&gt;
 35   ------------------------------------------------------------------------------------&lt;br /&gt;
 36   Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 37   ------------------------------------------------------------------------------------&lt;br /&gt;
 38 HEADER&lt;br /&gt;
 39 &lt;br /&gt;
 40 }&lt;br /&gt;
 41 &lt;br /&gt;
 42 function startdato {&lt;br /&gt;
 43   ## Find start dato i logfil&lt;br /&gt;
 44   #  input: $1 = filnavn&lt;br /&gt;
 45   #  output: dato som tekst&lt;br /&gt;
 46 &lt;br /&gt;
 47   head -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 48 }&lt;br /&gt;
 49 &lt;br /&gt;
 50 function slutdato {&lt;br /&gt;
 51   ## Find slut dato i logfil&lt;br /&gt;
 52   #  input: $1 = filnavn&lt;br /&gt;
 53   #  output: dato som tekst&lt;br /&gt;
 54   tail -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 55 &lt;br /&gt;
 56 }&lt;br /&gt;
 57 &lt;br /&gt;
 58 #######################&lt;br /&gt;
 59 ######## MAIN #########&lt;br /&gt;
 60 #######################&lt;br /&gt;
 61 &lt;br /&gt;
 62 # Findes logfilen så kører vi&lt;br /&gt;
 63 if ! [ -e $LOGFIL ] ; then&lt;br /&gt;
 64   exit 255&lt;br /&gt;
 65 fi&lt;br /&gt;
 66 &lt;br /&gt;
 67 # Lav en overskrift&lt;br /&gt;
 68 overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
 69 &lt;br /&gt;
 70 # Udskriv statistikken&lt;br /&gt;
 71 # forklaring paa oneliner:&lt;br /&gt;
 72 # cut -d' ' -f1 $LOGFIL : felt 1 er ipadressen på webclientn.&lt;br /&gt;
 73 # sort                  : før ipadresserne skal taelles skal de sorteres. uniq kræv&lt;br /&gt;
 74 #                         at listen er sorteret.&lt;br /&gt;
 75 # uniq -c               : sammentæl forkomster af unikke ip adresser&lt;br /&gt;
 76 # sort -rn              : sorter i omvendt rækkefølge og numerisk. sort sorterer default alfabeti&lt;br /&gt;
 77 # head -n 50            : ikke flere end 50&lt;br /&gt;
 78 # while read ...        : laver output og dnsopslag&lt;br /&gt;
 79 cut -d' ' -f1 $LOGFIL | sort | uniq -c | sort -nr | head -n 50 | \&lt;br /&gt;
 80                                                       while read cnt ip ; do \&lt;br /&gt;
 81                                                         echo -e &amp;quot;$cnt $ip \t(`dnslookup $ip`)&amp;quot;; \&lt;br /&gt;
 82                                                       done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output fra scriptet ===&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[tcj@mars ~/bin]$ HttpReport &lt;br /&gt;
HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
======================================&lt;br /&gt;
 &lt;br /&gt;
 Rapporten genereret: Fri Aug 28 23:55:13 CEST 2009&lt;br /&gt;
  &lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
  Data opsamlet er fra perioden den  26 Aug 2009 22:21:13 til den  28 Aug 2009 06:40:07&lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
806 192.168.146.155     ()&lt;br /&gt;
508 87.56.15.130        (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.)&lt;br /&gt;
306 77.212.13.52        (0x4dd40d34.adsl.cybercity.dk.)&lt;br /&gt;
301 195.181.54.128      (pixuv.eucmidt.dk.)&lt;br /&gt;
294 89.249.4.2  ()&lt;br /&gt;
283 192.168.146.156     ()&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
    &lt;br /&gt;
    pre {   font-family: Lucida Console; font-weight: bold; font-size: 14px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}&lt;br /&gt;
}}&lt;br /&gt;
--[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8424</id>
		<title>Talk:UNIX opgave Apache Access log</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8424"/>
				<updated>2009-08-28T22:09:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Her er så mit udkast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Her er så mit udkast ==&lt;br /&gt;
Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet.&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
  1 #!/usr/bin/bash&lt;br /&gt;
  2 &lt;br /&gt;
  3 ## Initial værdier&lt;br /&gt;
  4 #&lt;br /&gt;
  5 # Logfil&lt;br /&gt;
  6 LOGFIL=/tmp/httpd-access.log&lt;br /&gt;
  7 &lt;br /&gt;
  8 # Dato&lt;br /&gt;
  9 DD=`date`&lt;br /&gt;
 10 &lt;br /&gt;
 11 &lt;br /&gt;
 12 ## Programmet udskriver en rapport over de 50 mest aktive adresser&lt;br /&gt;
 13 ## Adresserne sorteres faldende.&lt;br /&gt;
 14 &lt;br /&gt;
 15 function dnslookup {&lt;br /&gt;
 16   ## Lav DNS lookup.&lt;br /&gt;
 17   #  input:  $1 = ipdresse&lt;br /&gt;
 18   #  output: dnsopslag&lt;br /&gt;
 19 &lt;br /&gt;
 20   dig -x $1 | grep PTR | grep -v -E '^;' | tr ' \t' ' '|cut -d' ' -f5&lt;br /&gt;
 21 }&lt;br /&gt;
 22 &lt;br /&gt;
 23 function overskrift {&lt;br /&gt;
 24   ## Udskriv sidetop&lt;br /&gt;
 25   #  input: $1 = dagsdato&lt;br /&gt;
 26   #  input: $2 = logfil start&lt;br /&gt;
 27   #  input: $3 = logfil slut&lt;br /&gt;
 28   #  output: tekst&lt;br /&gt;
 29   cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
 30 HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
 31 ======================================&lt;br /&gt;
 32  &lt;br /&gt;
 33  Rapporten genereret: $1&lt;br /&gt;
 34   &lt;br /&gt;
 35   ------------------------------------------------------------------------------------&lt;br /&gt;
 36   Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 37   ------------------------------------------------------------------------------------&lt;br /&gt;
 38 HEADER&lt;br /&gt;
 39 &lt;br /&gt;
 40 }&lt;br /&gt;
 41 &lt;br /&gt;
 42 function startdato {&lt;br /&gt;
 43   ## Find start dato i logfil&lt;br /&gt;
 44   #  input: $1 = filnavn&lt;br /&gt;
 45   #  output: dato som tekst&lt;br /&gt;
 46 &lt;br /&gt;
 47   head -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 48 }&lt;br /&gt;
 49 &lt;br /&gt;
 50 function slutdato {&lt;br /&gt;
 51   ## Find slut dato i logfil&lt;br /&gt;
 52   #  input: $1 = filnavn&lt;br /&gt;
 53   #  output: dato som tekst&lt;br /&gt;
 54   tail -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 55 &lt;br /&gt;
 56 }&lt;br /&gt;
 57 &lt;br /&gt;
 58 #######################&lt;br /&gt;
 59 ######## MAIN #########&lt;br /&gt;
 60 #######################&lt;br /&gt;
 61 &lt;br /&gt;
 62 # Findes logfilen så kører vi&lt;br /&gt;
 63 if ! [ -e $LOGFIL ] ; then&lt;br /&gt;
 64   exit 255&lt;br /&gt;
 65 fi&lt;br /&gt;
 66 &lt;br /&gt;
 67 # Lav en overskrift&lt;br /&gt;
 68 overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
 69 &lt;br /&gt;
 70 # Udskriv statistikken&lt;br /&gt;
 71 # forklaring paa oneliner:&lt;br /&gt;
 72 # cut -d' ' -f1 $LOGFIL : felt 1 er ipadressen på webclientn.&lt;br /&gt;
 73 # sort                  : før ipadresserne skal taelles skal de sorteres. uniq kræv&lt;br /&gt;
 74 #                         at listen er sorteret.&lt;br /&gt;
 75 # uniq -c               : sammentæl forkomster af unikke ip adresser&lt;br /&gt;
 76 # sort -rn              : sorter i omvendt rækkefølge og numerisk. sort sorterer default alfabeti&lt;br /&gt;
 77 # head -n 50            : ikke flere end 50&lt;br /&gt;
 78 # while read ...        : laver output og dnsopslag&lt;br /&gt;
 79 cut -d' ' -f1 $LOGFIL | sort | uniq -c | sort -nr | head -n 50 | \&lt;br /&gt;
 80                                                       while read cnt ip ; do \&lt;br /&gt;
 81                                                         echo -e &amp;quot;$cnt $ip \t(`dnslookup $ip`)&amp;quot;; \&lt;br /&gt;
 82                                                       done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Output fra scriptet ===&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[tcj@mars ~/bin]$ HttpReport &lt;br /&gt;
HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
======================================&lt;br /&gt;
 &lt;br /&gt;
 Rapporten genereret: Fri Aug 28 23:55:13 CEST 2009&lt;br /&gt;
  &lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
  Data opsamlet er fra perioden den  26 Aug 2009 22:21:13 til den  28 Aug 2009 06:40:07&lt;br /&gt;
  ------------------------------------------------------------------------------------&lt;br /&gt;
806 192.168.146.155     ()&lt;br /&gt;
508 87.56.15.130        (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.)&lt;br /&gt;
306 77.212.13.52        (0x4dd40d34.adsl.cybercity.dk.)&lt;br /&gt;
301 195.181.54.128      (pixuv.eucmidt.dk.)&lt;br /&gt;
294 89.249.4.2  ()&lt;br /&gt;
283 192.168.146.156     ()&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=UNIX_opgave_Apache_Access_log&amp;diff=8423</id>
		<title>UNIX opgave Apache Access log</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=UNIX_opgave_Apache_Access_log&amp;diff=8423"/>
				<updated>2009-08-28T22:07:13Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Hjælp hinanden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der ønskes oversigter over hvem der anvender/misbruger adgangen til en Apache WEB-server. Log filen vi anvender under udvikling af opgaven er en lille kopi af den rigtige logfil og hedder '''/tmp/httpd-access.log'''&lt;br /&gt;
&lt;br /&gt;
Rapporten skal ende med at indeholde&lt;br /&gt;
*En liste over de 50 mest anvendte IP adresser (Hvor mange gange IP adressen optræder i filen) - Sorteret med mest flittige IP adresser øverst. Så er rapporten nemmere at læse. &lt;br /&gt;
*Domænenavnet til IP adressen.&lt;br /&gt;
= Eksempel på Rapport =&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
======================================&lt;br /&gt;
&lt;br /&gt;
Rapporten genereret: Fri Aug 28 07:09:13 CEST 2009&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
Data opsamlet er fra perioden den 26 Aug 2009 22:21:13 til den 28 Aug 2009 06:40:07&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
 806 192.168.146.155 ()&lt;br /&gt;
 508 87.56.15.130 (0x57380f82.vgnqu2.dynamic.dsl.tele.dk.)&lt;br /&gt;
 306 77.212.13.52 (0x4dd40d34.adsl.cybercity.dk.)&lt;br /&gt;
 301 195.181.54.128 (pixuv.eucmidt.dk.)&lt;br /&gt;
 .......&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
    &lt;br /&gt;
    pre {   font-family: Lucida Console; font-weight: bold; font-size: 14px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}&lt;br /&gt;
}}&lt;br /&gt;
== At komme igang ==&lt;br /&gt;
Det drejer sig om at tænke projektet igennem og bryde det ned til mange små overskuelige opgaver. Se på rapportens oplysninger og arbejd med en lille del af gangen. Lav et kommentarområde i dit script hvor du skriver de fejl og mangler der er. Brug ikke for meget tid på at løse et lille problem. For eksempel fjernelse af mellemrum, karakterer i rapporten. Det kan man altid gøre senere.&lt;br /&gt;
=== interessante utilities ===&lt;br /&gt;
* [[dig]] DNS opslag. Her er flaget '''-x''' interessant da det laver reverse DNS opslag.&lt;br /&gt;
** Prøv evt '''dig -x 195.181.54.128 | grep PTR | grep -v -E '^;' | tr ' \t' '  '|cut -d' ' -f5'''&lt;br /&gt;
* sort - sortere linier&lt;br /&gt;
* uniq - finde ens linier efter hinanden. Se evt flaget '''-c'''&lt;br /&gt;
* head - Se første linier en fil fx. '''head -n 1 FILNAVN''' viser den første linie i en fil&lt;br /&gt;
* tail - Se sidste linier i en fil fx. '''tail -n 1 FILNAVN''' viser sidste linie i en fil&lt;br /&gt;
&lt;br /&gt;
=== Hjælp hinanden ===&lt;br /&gt;
At programmere er meget nemmere hvis man arbejder sammen. Så skriv dine spørgsmål, forslag og ideer her i artiklen.&lt;br /&gt;
&lt;br /&gt;
* Program forslag fra Tomas her [[Talk:UNIX opgave Apache Access log#Her er så mit udkast|HttpReport]]&lt;br /&gt;
&lt;br /&gt;
Good Luck&lt;br /&gt;
[[User:Heth|Henrik Thomsen]] 07:33, 28 August 2009 (CEST)&lt;br /&gt;
Mail evt [mailto:heth@mercantec.dk Henrik Thomsen]&lt;br /&gt;
[[category:UNIX]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8422</id>
		<title>Talk:UNIX opgave Apache Access log</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Talk:UNIX_opgave_Apache_Access_log&amp;diff=8422"/>
				<updated>2009-08-28T22:04:34Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: New page: == Her er så mit udkast == Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet. &amp;lt;source lang=bash&amp;gt;   1 #!/usr/bin/...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Her er så mit udkast ==&lt;br /&gt;
Jeg har forsøgt at strukturere scriptet mest muligt i små funktioner, så det er tydeligt, hvordan jeg har løst problemet.&lt;br /&gt;
&amp;lt;source lang=bash&amp;gt;&lt;br /&gt;
  1 #!/usr/bin/bash&lt;br /&gt;
  2 &lt;br /&gt;
  3 ## Initial værdier&lt;br /&gt;
  4 #&lt;br /&gt;
  5 # Logfil&lt;br /&gt;
  6 LOGFIL=/tmp/httpd-access.log&lt;br /&gt;
  7 &lt;br /&gt;
  8 # Dato&lt;br /&gt;
  9 DD=`date`&lt;br /&gt;
 10 &lt;br /&gt;
 11 &lt;br /&gt;
 12 ## Programmet udskriver en rapport over de 50 mest aktive adresser&lt;br /&gt;
 13 ## Adresserne sorteres faldende.&lt;br /&gt;
 14 &lt;br /&gt;
 15 function dnslookup {&lt;br /&gt;
 16   ## Lav DNS lookup.&lt;br /&gt;
 17   #  input:  $1 = ipdresse&lt;br /&gt;
 18   #  output: dnsopslag&lt;br /&gt;
 19 &lt;br /&gt;
 20   dig -x $1 | grep PTR | grep -v -E '^;' | tr ' \t' ' '|cut -d' ' -f5&lt;br /&gt;
 21 }&lt;br /&gt;
 22 &lt;br /&gt;
 23 function overskrift {&lt;br /&gt;
 24   ## Udskriv sidetop&lt;br /&gt;
 25   #  input: $1 = dagsdato&lt;br /&gt;
 26   #  input: $2 = logfil start&lt;br /&gt;
 27   #  input: $3 = logfil slut&lt;br /&gt;
 28   #  output: tekst&lt;br /&gt;
 29   cat &amp;lt;&amp;lt; HEADER&lt;br /&gt;
 30 HTTP Access rapport fra mars.tekkom.dk&lt;br /&gt;
 31 ======================================&lt;br /&gt;
 32  &lt;br /&gt;
 33  Rapporten genereret: $1&lt;br /&gt;
 34   &lt;br /&gt;
 35   ------------------------------------------------------------------------------------&lt;br /&gt;
 36   Data opsamlet er fra perioden den $2 til den $3&lt;br /&gt;
 37   ------------------------------------------------------------------------------------&lt;br /&gt;
 38 HEADER&lt;br /&gt;
 39 &lt;br /&gt;
 40 }&lt;br /&gt;
 41 &lt;br /&gt;
 42 function startdato {&lt;br /&gt;
 43   ## Find start dato i logfil&lt;br /&gt;
 44   #  input: $1 = filnavn&lt;br /&gt;
 45   #  output: dato som tekst&lt;br /&gt;
 46 &lt;br /&gt;
 47   head -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 48 }&lt;br /&gt;
 49 &lt;br /&gt;
 50 function slutdato {&lt;br /&gt;
 51   ## Find slut dato i logfil&lt;br /&gt;
 52   #  input: $1 = filnavn&lt;br /&gt;
 53   #  output: dato som tekst&lt;br /&gt;
 54   tail -n 1 /tmp/httpd-access.log | cut -d' ' -f4 | sed 's/[\[\/]/ /g' | sed 's/:/ /'&lt;br /&gt;
 55 &lt;br /&gt;
 56 }&lt;br /&gt;
 57 &lt;br /&gt;
 58 #######################&lt;br /&gt;
 59 ######## MAIN #########&lt;br /&gt;
 60 #######################&lt;br /&gt;
 61 &lt;br /&gt;
 62 # Findes logfilen så kører vi&lt;br /&gt;
 63 if ! [ -e $LOGFIL ] ; then&lt;br /&gt;
 64   exit 255&lt;br /&gt;
 65 fi&lt;br /&gt;
 66 &lt;br /&gt;
 67 # Lav en overskrift&lt;br /&gt;
 68 overskrift &amp;quot;$DD&amp;quot; &amp;quot;`startdato $LOGFIL`&amp;quot; &amp;quot;`slutdato $LOGFIL`&amp;quot;&lt;br /&gt;
 69 &lt;br /&gt;
 70 # Udskriv statistikken&lt;br /&gt;
 71 # forklaring paa oneliner:&lt;br /&gt;
 72 # cut -d' ' -f1 $LOGFIL : felt 1 er ipadressen på webclientn.&lt;br /&gt;
 73 # sort                  : før ipadresserne skal taelles skal de sorteres. uniq kræv&lt;br /&gt;
 74 #                         at listen er sorteret.&lt;br /&gt;
 75 # uniq -c               : sammentæl forkomster af unikke ip adresser&lt;br /&gt;
 76 # sort -rn              : sorter i omvendt rækkefølge og numerisk. sort sorterer default alfabeti&lt;br /&gt;
 77 # head -n 50            : ikke flere end 50&lt;br /&gt;
 78 # while read ...        : laver output og dnsopslag&lt;br /&gt;
 79 cut -d' ' -f1 $LOGFIL | sort | uniq -c | sort -nr | head -n 50 | \&lt;br /&gt;
 80                                                       while read cnt ip ; do \&lt;br /&gt;
 81                                                         echo -e &amp;quot;$cnt $ip \t(`dnslookup $ip`)&amp;quot;; \&lt;br /&gt;
 82                                                       done&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
--[[User:Tcj|tcj]] 00:04, 29 August 2009 (CEST)&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	<entry>
		<id>http://mars.merhot.dk/w/index.php?title=Bash&amp;diff=8389</id>
		<title>Bash</title>
		<link rel="alternate" type="text/html" href="http://mars.merhot.dk/w/index.php?title=Bash&amp;diff=8389"/>
				<updated>2009-08-27T09:12:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tcj: /* Eksterne henvisninger */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;bash - eller Bourne Again Shell - er den mest benyttede shell eller kommandofortolker til Unix og Linux systemer i dag. Der findes andre shells end '''bash'''. For eksempel [[csh]] (C-Shell), [[ksh]] (Korn-Shell) og [[bsh]] (Bourne-Shell). &lt;br /&gt;
&lt;br /&gt;
Bash kaldes ofte i engelsk litteratur for en CLI - Command Line Interpreter eller kommandofortolker på dansk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Der findes flere artikler om [[bash]] indelt efter emner:&lt;br /&gt;
*[[Bash processer]] - Processer, omdirigeringer, Pipe tegnet&lt;br /&gt;
*[[Bash scripts]] - Om at lave bash scripts (while, if, do, test)&lt;br /&gt;
*[[Bash scripts II]] Mere avancerede funktioner&lt;br /&gt;
*[[Bash examples]] - forskellige bash shell script eksempler&lt;br /&gt;
&lt;br /&gt;
= Filer =&lt;br /&gt;
Selve programmet '''bash''' kan være installeret i forskellige biblioteker på forskellige systemer men findes oftest i /usr/bin biblioteket. På BSD Unix varianter findes '''bash''' ofte i /usr/local/bin. Hvis du ikke ved hvor din lokale '''bash''' findes kan den findes med ''whereis bash'' kommandoen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|valign=top|'''/etc/profile'''&lt;br /&gt;
|Opstartsfil som '''bash''' udfører for alle brugere på maskinen. Udføres før den personlige opstartsfil. &lt;br /&gt;
|-&lt;br /&gt;
|valign=top|'''$HOME/.bash_profile'''&lt;br /&gt;
|Denne fil er din personlige opstartsfil og vil blive udført når du logger ind på systemet, og indeholder typisk opstartskommandoer, velkomst... Hvis '''.bash_profile''' ikke eksister i dit hjemmebibliotek vil '''bash''' kigge efter filen '''.bash_login''' og udføre den. Hvis denne heller ikke eksister kigger '''bash''' efter filen '''.profile''' og udfører kommandoerne i den. Bemærk kun en af disse filer vil blive udført i rækkefølgen: 1: '''.bash_profile''' 2: '''.bash_login''' eller 3: '''.profile'''&lt;br /&gt;
|-&lt;br /&gt;
|valign=top|'''$HOME/.bashrc''' &lt;br /&gt;
|Denne fil er personlig og vil blive udført hvergang der startes en '''sub-shell''', det vil sige hvergang '''bash''' starter en ny &lt;br /&gt;
'''bash'''&lt;br /&gt;
|-&lt;br /&gt;
|valign=top|'''$HOME/.bash_logout'''&lt;br /&gt;
|Denne fil er din personlig afslutningsfil og udføres når der logges ud.&lt;br /&gt;
|-&lt;br /&gt;
|valign=top|'''$HOME/.inputrc'''&lt;br /&gt;
|Denne fil indeholder opstartskommandoer til '''bash'''. Anvendes til for eksempel at ændre tastatur genveje.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Online bash hjælp =&lt;br /&gt;
*On line manualen: '''man bash'''&lt;br /&gt;
*indbygget bash hjælp: '''help''' &lt;br /&gt;
*hjælp til bash indbyggede kommandoer: '''help while''' (eksempel)&lt;br /&gt;
= bash tilpasning med set kommandoen =&lt;br /&gt;
Hvis du ønsker at ændre bash måde at fungere på kan '''set''' kommandoen anvendes. Dette er normalt ikke nødvendigt.&lt;br /&gt;
*Kommandoer&lt;br /&gt;
**help set&lt;br /&gt;
== Debugging scripts ==&lt;br /&gt;
Det kan være svært at debugge scripts og se hvor problemet er. Her kan bash sættes i enten ''verbose'' eller '''trace''' mode. '''Verbose''' eller '''trace''' mode kan slås til og fra efter behag i dit script.&lt;br /&gt;
&lt;br /&gt;
*verbose mode. (Viser kommandoer som de '''læses''' fra scriptet. Som de er skrevet) &lt;br /&gt;
**Brug enten '''set -v''' eller '''set -o verbose''' for at aktivere verbose mode&lt;br /&gt;
**Brug enten '''set +v''' eller '''set +o verbose''' for at de-aktivere verbose mode&lt;br /&gt;
*trace mode.  (Viser kommandoer som de '''udføres''' i scriptet. Fx. indholdet af variablerne.&lt;br /&gt;
**Brug enten '''set -x''' eller '''set -o xtrace''' for at aktivere trace mode&lt;br /&gt;
**Brug enten '''set +x''' eller '''set +o xtrace''' for at de-aktivere trace mode&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=pre&amp;gt;&lt;br /&gt;
#!/usr/bin/bash&lt;br /&gt;
#Kode her er OK&lt;br /&gt;
...&lt;br /&gt;
set -x    #bash trace mode slået til og alle kommandoer udført vises på skærmen&lt;br /&gt;
#mistænkelig kode her&lt;br /&gt;
...&lt;br /&gt;
set +x   #bash trace mode slået fra og bash fungerer normalt&lt;br /&gt;
#kode her er ok&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Variable =&lt;br /&gt;
Der er&lt;br /&gt;
== Arrays ==&lt;br /&gt;
Bash understøtter primitive Arrays.&lt;br /&gt;
&amp;lt;source lang=cli&amp;gt;&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;MYARRAY=(Banan Agurk Gulerod Radisse Kartoffel)&amp;lt;/input&amp;gt;&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e &amp;quot;En ${MYARRAY[3]} smager godt&amp;quot;&amp;lt;/input&amp;gt;&lt;br /&gt;
En Radisse smager godt&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e ${MYARRAY[*]}&amp;lt;/input&amp;gt;&lt;br /&gt;
Banan Agurk Gulerod Radisse Kartoffel&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;MYARRAY[3]=Citron&amp;lt;/input&amp;gt;&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e &amp;quot;En ${MYARRAY[3]} smager godt&amp;quot;&amp;lt;/input&amp;gt;&lt;br /&gt;
En Citron smager godt&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e ${MYARRAY[*]}&amp;lt;/input&amp;gt;&lt;br /&gt;
Banan Agurk Gulerod Citron Kartoffel&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e &amp;quot;Der er ${#MYARRAY[*]} elementer i arrayet &amp;quot;&amp;lt;/input&amp;gt;&lt;br /&gt;
Der er 6 elementer i arrayet&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e &amp;quot;Element 1 fylder ${#MYARRAY[1]} tegn&amp;quot;&amp;lt;/input&amp;gt;&lt;br /&gt;
Element 1 fylder 5 tegn&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e &amp;quot;${MYARRAY[*]}&amp;quot;&amp;lt;/input&amp;gt;&lt;br /&gt;
Banan Agurk Gulerod Citron Kartoffel&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;unset MYARRAY[1]&amp;lt;/input&amp;gt;&lt;br /&gt;
[heth@mars ~]$ &amp;lt;input&amp;gt;echo -e &amp;quot;${MYARRAY[*]}&amp;quot;&amp;lt;/input&amp;gt;&lt;br /&gt;
Banan Gulerod Citron Kartoffel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{#css:&lt;br /&gt;
    &lt;br /&gt;
    pre {   font-family: Lucida Console; font-weight: bold; font-size: 14px; color: #00FF00; background: black; margin: 10px 50px; width: 800px; line-height: 200%; overflow: auto;}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Eksterne henvisninger =&lt;br /&gt;
*[http://www.gnu.org/software/bash/ Bash projektets hjemmeside] &lt;br /&gt;
*[http://www.gnu.org/software/bash/manual/bashref.pdf Bash reference manual]&lt;br /&gt;
*[http://www.tldp.org/LDP/Bash-Beginners-Guide/Bash-Beginners-Guide.pdf Bash Beginners Guide]&lt;br /&gt;
*[http://www.tldp.org/LDP/abs/abs-guide.pdf Advanced Bash-Scripting Guide]&lt;br /&gt;
*[http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html Bash programming HOWTO Intro]&lt;br /&gt;
[[Category:Linux]][[Category:Bash]][[Category:UNIX]]&lt;/div&gt;</summary>
		<author><name>Tcj</name></author>	</entry>

	</feed>