How-to Properly Destroy Dead Hard Drives — Degausser — or Destruction?

October 20, 2009

One method is definitely wiping the drive forwards and backwards 7 times. etc… By wiping I mean writing ones/zeros/randomly to the drive. The NSA suggests that you use a degausser (magnet)

I have found a different method to be more effective.Destroyed HDD I prefer to shoot them with my gun. A friend and I took a box of ~30 hard drives from work. They were all failed drives that could not be wiped using our normal process due to physical failures. There are a number of manufacturers: IBM Deskstar (aka Deathstar), Seagate, Western Digital, etc. The sizes ranged from 20GB to 250GB drives. Most of the drives used glass platters, but some were metal. The metal ones were more fun to show off afterward due to the fact that the glass ones just shattered and disintegrated. Needless to say, no one is getting the information off the glass platters. For reference — I was using my assault rifle: Bushmaster XM15. At first, I was shooting some Wolf Silver, but I ended up shooting tracer rounds as the evening turned into dusk. It made for a fun visual effect. Here are a few of my favorites:

00023
00022
00009
00010
00011
00012
00018

Now as you can see, my 5.56 did some pretty decent piercing of the metal platters. My friend Chris was using his Colt 1911 shooting .45. His bullet was obviously bigger, and would hurt more when it hit, but it did not pierce the platters. Take a look. Here’s how I found one of the drives this morning.
00001
00002
00004
00005
00006
00008

The platter stopped it cold. It definitely did damage to the frame of the drive, but the platters were still in tact.

Lesson learned: For destroying hard drives, use a higher FPS round from a smaller caliber gun. Your best bet is to use either rifle or a high-power pistol. (please don’t make me face-palm by suggesting a shotgun)


My Qik Videos

October 16, 2009

New Monitor setup @Home Desk and Living Room Setup

October 7, 2009

OFFICE:

New Monitor Setup

New Monitor Setup


This is a really fuzzy picture from my iPhone. I will get a better one soon. I just recently got the 2×26″ monitors (on bottom). They have built-in HDTV tuners. The top two are 24″.

I run my gaming system running WinXP on the right two. The bottom left runs my Linux box (and will soon switch to TV also). Top left is my XBox360. Which I have modded and is now in this awesome looking LianLi Xbox360 Case. I use a G15 keyboard awesome for custom macros, turning off windows buttons during in-game play, all-around great response from keys, lcd informational display … etc. I use a 7.1-capable Logitech G35 headset and a Logitech G7 mouse. I love these mice so much, I bought one for every computer I own — and one for work!! The speakers are a set of Klipsch 2.1 ProMedia. They sound really really nice. Invinxible The mousepad is custom and from func.net. I have used these mousepads for over 5 years and there is simply nothing better. I have about 8 or 9 right now. This one is a 1030 Archetype. I customized it by getting both sides “smooth” and opting not to get the rough texture (I prefer the smooth and never use the rough side). I then overlayed it with the following picture (thanks Samuele Storari and Fedora Themes) and my gamertag (MAESTRO).

LIVING ROOM:
I also recently got a Samsung 58″ LED for the living room It does 1920×1200 native … and its oh-so-pretty. I have a computer in the basement that comes up through the floor with an HDMI cable to the new receiver which feeds the TV. I use this remote/mouse on an extended USB cable to navigate the computer. It works out great! I now have all of the signals to the TV coming in over a single HDMI cable. I have an Onkyo TX-SR607 running as the receiver and all of the peripherals in via HDMI. The computer doesn’t support sending the digital audio out the video card (via the hdmi cable), so I opted to purchase a new up-scaling HT Omega Striker 7.1 audio card for the TV-computer. Basically it automatically up-scales any signal to a full 7.1 signal before it goes out the TOSLink cable. It has a few different modes that it can handle. I chose to up-scale everything to Dolby DTS. I run a TOSLink cable from the audio card (on the computer in the basement) up to the receiver (at the TV). I got all of my long HDMI and TOSLink cables from mycablemart.com. They were crazy cheap.

1 HDMI Cable, 25ft Category 2/1.3a Certified 22AWG Gold Plated IN WALL $52.10
1 Speaker Wire, 100ft, 12AWG Copper Enhanced Loud Oxygen Free $38.52
1 35ft Toslink Digital/SPDIF Optical Audio Cable High Performance $17.23
1 25ft Toslink Digital/SPDIF Optical Audio Cable High Performance $14.63

I also got some new Polk speakers. I got them at an extremely discounted price ($159/each). They sound REALLY nice with the 7.1 mix. The intro scene of the movie Death Race — in HD .. and full 7.1 sounds SPECTACULAR. The machine guns basically rattle your britches as if you were standing there next to a real machine gun like an innocent without ear protection.
Living Room Setup


PHP and Perl

October 6, 2009

I have been doing a LOT of php lately. It has been a while, but its just like riding a bike. Once you learn, you never forget, you just get rusty. It took me a little while, but I’m back into the swing of things. I’ve started breaking things off and making them more dynamic. I have much more versatile code that I can adapt to many different situations. In fact, I took a couple of key display/listing php pages and some key processing pages and I have plugged them right into a project that I’m working on at work.

At home — I have a web-based tracking system for tracking stats on characters in a table-top board game. At work, I have developed a way to track and notify me of inventory needs and pre-buying (sale) opportunities. Both of these are written using PHP. More recently, I have started using Perl.

Yesterday, I discovered the complexity that is Perl. It is definitely a much more refined way of coding. Anyone who has ever looked at my code will realize that it is entirely piece-meal. I make it work, but it is not always elaborate. I also make sure it works 90% of the way … and leave the last 10% for another time (mostly because the last 10% of the work always takes 90% of the time). So, Perl has this wonderful Tainted mode. It quite literally means anal. It basically assumes every string variable is tainted. You are required to run every one through a filter (regex) before it will allow it to be used. I admit that this is a much safer way to handle strings, however, it makes things a bit hairy to code (from my inexperienced perspective).

I will say, I have enjoyed learning Perl. It is object oriented, which I love, but it is definitely a bunch of new syntax. It also forces me to learn better habits. I’ve taken a peek at our (@work) developers’ perl scripts and gotten a little jump-start from some of them. So far, so good. I have my first real program about half done. This means I’ve spent about 10% of the required amount of time.. and about 200% of the allotted time. I will likely have to find some after-work time to finish it up.

In summary, I recommend both Perl and PHP. Both are very well-suited to their respective applications.


Postgresql install

August 28, 2009

Everyone has their way of installing Postgresql … this is how I do it: (I assume you already have apache and php running)

[root@vmhost ~]#  yum install postgresql{,-libs,-server} phpPgAdmin
[root@vmhost ~]#  cd /var/lib/pgsql/data

Next I change the following files to the given information:

Temporary settings for /var/lib/pgsql/data/pg_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
local   all         all                               trust

After making the above change, then any user has access to the database (directly). The thing is, there aren’t any users other than the default users. Let’s make our ‘apache’ database user and give him a password.

[root@vmhost ~]#  su - postgres
-bash-3.2$ psql
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit
postgres=# SELECT 'md5' || md5('apachepassword') as md5pass;
               md5pass
-------------------------------------
 md5d02d0b1c1cd641fb73d765cfdeda0535
(1 row)

postgres=# alter role apache with encrypted password 'md5d02d0b1c1cd641fb73d765cfdeda0535';
postgres=#  \q
-bash-3.2$ logout

Ok. So now we have the user ‘apache’ with the password ‘password’ in the database. Lets go ahead and lock down the logins to restrict to just authorized users with appropriate passwords.

Final settings for /var/lib/pgsql/data/pg_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32            md5
# IPv6 local connections:
host    all         all         ::1/128               md5

Final settings for /var/lib/pgsql/data/pg_ident.conf

# MAPNAME     IDENT-USERNAME    PG-USERNAME
jday    jday    apache
jday    root    apache
jday    root    apache
apache  apache  apache

With the above settings, only the linux users apache, jday and root can login to the database using the apache database user.

Final settings for /var/lib/pgsql/data/postgresql.conf (only changes noted):

listen_addresses = 'localhost'

After everything is finished run the following command:

[root@vmhost ~]#  service postgresql restart

Finally, I setup phpPgAdmin. I like using it to admin my Postgresql database. I also like to be able to access the admin from anywhere on my local network (but not beyond). Here’s my solution:
Final settings for /etc/httpd/conf.d/phpPgAdmin.conf

Alias /phpPgAdmin /usr/share/phpPgAdmin

<Location /phpPgAdmin>
    Order deny,allow
#    Deny from all
    Allow from 127.0.0.1
    Allow from hostname.domain.local
    Allow from hostname
#    Allow from ::1
#   Allow from .example.com
</Location>

This allows anyone on my local network to reach the phpPgAdmin portion of the apache server.

One last config file to update:
Final settings for /etc/phpPgAdmin/config.inc.php (I only note the lines that I changed):

        $conf['servers'][0]['desc'] = 'hostname PostgreSQL';
        $conf['servers'][0]['host'] = 'localhost';
        $conf['servers'][0]['sslmode'] = 'disable';

Now that everything is configured … you should be able to browse to http://hostname/phpPgAdmin/ and login with username ‘apache’ and password ‘password’


Failed Software Raid partitions

August 28, 2009

For Asus M3N78 Motherboard with 2GB DDR2-800 w/ ECC and two 500 GB SATA HDDs on sata ports 1 and 2. The CPU is an AMD Athlon X2 6000+. I’m running Fedora 9 fully up-to-date (now that support has ended).
So, I got to work today and my mdadm monitoring had emailed me last night. It informed me of the following:


This is an automatically generated mail message from mdadm
running on #deleted#.local

A Fail event had been detected on md device /dev/md3.

It could be related to component device /dev/sdb4.

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0] sdb1[1]
1003904 blocks [2/2] [UU]

md3 : active raid1 sda4[0] sdb4[2](F)
418766272 blocks [2/1] [U_]

md1 : active raid1 sda2[0] sdb2[1]
10008384 blocks [2/2] [UU]

md2 : active raid1 sda3[0] sdb3[1]
58605056 blocks [2/2] [UU]

unused devices:

So I researched and found the following:

[root@#deleted# ~]# dmesg | tail -n 39
ata3.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen
ata3.00: cmd ea/00:00:00:00:00/00:00:00:00:00/a0 tag 0
         res 40/00:00:00:4f:c2/00:00:00:00:00/40 Emask 0x4 (timeout)
ata3.00: status: { DRDY }
ata3: hard resetting link
ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata3.00: qc timeout (cmd 0xec)
ata3.00: failed to IDENTIFY (I/O error, err_mask=0x4)
ata3.00: revalidation failed (errno=-5)
ata3: hard resetting link
ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
ata3.00: configured for UDMA/133
end_request: I/O error, dev sdb, sector 976767899
md: super_written gets error=-5, uptodate=0
raid1: Disk failure on sdb4, disabling device.
raid1: Operation continuing on 1 devices.
ata3: EH complete
sd 2:0:0:0: [sdb] 976773168 512-byte hardware sectors (500108 MB)
sd 2:0:0:0: [sdb] Write Protect is off
sd 2:0:0:0: [sdb] Mode Sense: 00 3a 00 00
sd 2:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
RAID1 conf printout:
 --- wd:1 rd:2
 disk 0, wo:0, o:1, dev:sda4
 disk 1, wo:1, o:0, dev:sdb4
RAID1 conf printout:
 --- wd:1 rd:2
 disk 0, wo:0, o:1, dev:sda4
md: unbind<sdb4>
md: export_rdev(sdb4)
md: bind<sdb4>
RAID1 conf printout:
 --- wd:1 rd:2
 disk 0, wo:0, o:1, dev:sda4
 disk 1, wo:1, o:1, dev:sdb4
md: recovery of RAID array md3
md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for recovery.
md: using 128k window, over a total of 418766272 blocks.

So the Sata channel reset on the motherboard. When it did, the /dev/sdb4 partition did not correctly rejoin the software raid partition (/dev/md3).

So I did the following to fix it:

[root@#deleted# ~]#   mdadm /dev/md3 --remove /dev/sdb4
[root@#deleted# ~]#   mdadm /dev/md3 --add /dev/sdb4

Now, the partition is resyncing.

[root@#deleted# ~]# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md0 : active raid1 sda1[0] sdb1[1]
      1003904 blocks [2/2] [UU]

md3 : active raid1 sdb4[2] sda4[0]
      418766272 blocks [2/1] [U_]
      [=====>...............]  recovery = 28.5% (119419264/418766272) finish=83.0min speed=60103K/sec

md1 : active raid1 sda2[0] sdb2[1]
      10008384 blocks [2/2] [UU]

md2 : active raid1 sda3[0] sdb3[1]
      58605056 blocks [2/2] [UU]

unused devices: <none>

Essentially, there is not much I can do to “fix” the issue. The Sata controller on the motherboard bugged out. I can call the manufacturer, but they will likely say there is nothing they can do if it is working now. Also, that is why I am using software Raid 1 to begin with. I did not lose any data in the process and I experienced virtually no down time.


Linux Commands / Tips / Tricks (part 2) — Sed one-liners

August 26, 2009

From http://www-h.eng.cam.ac.uk/help/tpl/unix/sed.html

Handy one-liners for SED

HANDY ONE-LINERS FOR SED (Unix stream editor) Mar. 23, 2001
compiled by Eric Pement version 5.1
Latest version of this file is usually at:

http://www.student.northpark.edu/pemente/sed/sed1line.txt

http://www.cornerstonemag.com/sed/sed1line.txt

This file is also available in Portuguese at:

http://www.lrv.ufsc.br/wmaker/sed_ptBR.html

FILE SPACING:

# double space a file
sed G

# double space a file which already has blank lines in it. Output file
# should contain no more than one blank line between lines of text.
sed ‘/^$/d;G’

# triple space a file
sed ‘G;G’

# undo double-spacing (assumes even-numbered lines are always blank)
sed ‘n;d’

NUMBERING:

# number each line of a file (simple left alignment). Using a tab (see
# note on ‘\t’ at end of file) instead of space will preserve margins.
sed = filename | sed ‘N;s/\n/\t/’

# number each line of a file (number on left, right-aligned)
sed = filename | sed ‘N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /’

# number each line of file, but only print numbers if line is not blank
sed ‘/./=’ filename | sed ‘/./N; s/\n/ /’

# count lines (emulates “wc -l”)
sed -n ‘$=’

TEXT CONVERSION AND SUBSTITUTION:

# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format
sed ’s/.$//’ # assumes that all lines end with CR/LF
sed ’s/^M$//’ # in bash/tcsh, press Ctrl-V then Ctrl-M
sed ’s/\x0D$//’ # gsed 3.02.80, but top script is easier

# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format
sed “s/$/`echo -e \\\r`/” # command line under ksh
sed ’s/$’”/`echo \\\r`/” # command line under bash
sed “s/$/`echo \\\r`/” # command line under zsh
sed ’s/$/\r/’ # gsed 3.02.80

# IN DOS ENVIRONMENT: convert Unix newlines (LF) to DOS format
sed “s/$//” # method 1
sed -n p # method 2

# IN DOS ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format
# Cannot be done with DOS versions of sed. Use “tr” instead.
tr -d \r outfile # GNU tr version 1.22 or higher

# delete leading whitespace (spaces, tabs) from front of each line
# aligns all text flush left
sed ’s/^[ \t]*//’ # see note on ‘\t’ at end of file

# delete trailing whitespace (spaces, tabs) from end of each line
sed ’s/[ \t]*$//’ # see note on ‘\t’ at end of file

# delete BOTH leading and trailing whitespace from each line
sed ’s/^[ \t]*//;s/[ \t]*$//’

# insert 5 blank spaces at beginning of each line (make page offset)
sed ’s/^/ /’

# align all text flush right on a 79-column width
sed -e :a -e ’s/^.\{1,78\}$/ &/;ta’ # set at 78 plus 1 space

# center all text in the middle of 79-column width. In method 1,
# spaces at the beginning of the line are significant, and trailing
# spaces are appended at the end of the line. In method 2, spaces at
# the beginning of the line are discarded in centering the line, and
# no trailing spaces appear at the end of lines.
sed -e :a -e ’s/^.\{1,77\}$/ & /;ta’ # method 1
sed -e :a -e ’s/^.\{1,77\}$/ &/;ta’ -e ’s/\( *\)\1/\1/’ # method 2

# substitute (find and replace) “foo” with “bar” on each line
sed ’s/foo/bar/’ # replaces only 1st instance in a line
sed ’s/foo/bar/4′ # replaces only 4th instance in a line
sed ’s/foo/bar/g’ # replaces ALL instances in a line
sed ’s/\(.*\)foo\(.*foo\)/\1bar\2/’ # replace the next-to-last case
sed ’s/\(.*\)foo/\1bar/’ # replace only the last case

# substitute “foo” with “bar” ONLY for lines which contain “baz”
sed ‘/baz/s/foo/bar/g’

# substitute “foo” with “bar” EXCEPT for lines which contain “baz”
sed ‘/baz/!s/foo/bar/g’

# change “scarlet” or “ruby” or “puce” to “red”
sed ’s/scarlet/red/g;s/ruby/red/g;s/puce/red/g’ # most seds
gsed ’s/scarlet\|ruby\|puce/red/g’ # GNU sed only

# reverse order of lines (emulates “tac”)
# bug/feature in HHsed v1.5 causes blank lines to be deleted
sed ‘1!G;h;$!d’ # method 1
sed -n ‘1!G;h;$p’ # method 2

# reverse each character on the line (emulates “rev”)
sed ‘/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//’

# join pairs of lines side-by-side (like “paste”)
sed ‘$!N;s/\n/ /’

# if a line ends with a backslash, append the next line to it
sed -e :a -e ‘/\\$/N; s/\\\n//; ta’

# if a line begins with an equal sign, append it to the previous line
# and replace the “=” with a single space
sed -e :a -e ‘$!N;s/\n=/ /;ta’ -e ‘P;D’

# add commas to numeric strings, changing “1234567″ to “1,234,567″
gsed ‘:a;s/\B[0-9]\{3\}\>/,&/;ta’ # GNU sed
sed -e :a -e ’s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta’ # other seds

# add commas to numbers with decimal points and minus signs (GNU sed)
gsed ‘:a;s/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g;ta’

# add a blank line every 5 lines (after lines 5, 10, 15, 20, etc.)
gsed ‘0~5G’ # GNU sed only
sed ‘n;n;n;n;G;’ # other seds

SELECTIVE PRINTING OF CERTAIN LINES:

# print first 10 lines of file (emulates behavior of “head”)
sed 10q

# print first line of file (emulates “head -1″)
sed q

# print the last 10 lines of a file (emulates “tail”)
sed -e :a -e ‘$q;N;11,$D;ba’

# print the last 2 lines of a file (emulates “tail -2″)
sed ‘$!N;$!D’

# print the last line of a file (emulates “tail -1″)
sed ‘$!d’ # method 1
sed -n ‘$p’ # method 2

# print only lines which match regular expression (emulates “grep”)
sed -n ‘/regexp/p’ # method 1
sed ‘/regexp/!d’ # method 2

# print only lines which do NOT match regexp (emulates “grep -v”)
sed -n ‘/regexp/!p’ # method 1, corresponds to above
sed ‘/regexp/d’ # method 2, simpler syntax

# print the line immediately before a regexp, but not the line
# containing the regexp
sed -n ‘/regexp/{g;1!p;};h’

# print the line immediately after a regexp, but not the line
# containing the regexp
sed -n ‘/regexp/{n;p;}’

# print 1 line of context before and after regexp, with line number
# indicating where the regexp occurred (similar to “grep -A1 -B1″)
sed -n -e ‘/regexp/{=;x;1!p;g;$!N;p;D;}’ -e h

# grep for AAA and BBB and CCC (in any order)
sed ‘/AAA/!d; /BBB/!d; /CCC/!d’

# grep for AAA and BBB and CCC (in that order)
sed ‘/AAA.*BBB.*CCC/!d’

# grep for AAA or BBB or CCC (emulates “egrep”)
sed -e ‘/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -e d # most seds
gsed ‘/AAA\|BBB\|CCC/!d’ # GNU sed only

# print paragraph if it contains AAA (blank lines separate paragraphs)
# HHsed v1.5 must insert a ‘G;’ after ‘x;’ in the next 3 scripts below
sed -e ‘/./{H;$!d;}’ -e ‘x;/AAA/!d;’

# print paragraph if it contains AAA and BBB and CCC (in any order)
sed -e ‘/./{H;$!d;}’ -e ‘x;/AAA/!d;/BBB/!d;/CCC/!d’

# print paragraph if it contains AAA or BBB or CCC
sed -e ‘/./{H;$!d;}’ -e ‘x;/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -e d
gsed ‘/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d’ # GNU sed only

# print only lines of 65 characters or longer
sed -n ‘/^.\{65\}/p’

# print only lines of less than 65 characters
sed -n ‘/^.\{65\}/!p’ # method 1, corresponds to above
sed ‘/^.\{65\}/d’ # method 2, simpler syntax

# print section of file from regular expression to end of file
sed -n ‘/regexp/,$p’

# print section of file based on line numbers (lines 8-12, inclusive)
sed -n ‘8,12p’ # method 1
sed ‘8,12!d’ # method 2

# print line number 52
sed -n ‘52p’ # method 1
sed ‘52!d’ # method 2
sed ‘52q;d’ # method 3, efficient on large files

# beginning at line 3, print every 7th line
gsed -n ‘3~7p’ # GNU sed only
sed -n ‘3,${p;n;n;n;n;n;n;}’ # other seds

# print section of file between two regular expressions (inclusive)
sed -n ‘/Iowa/,/Montana/p’ # case sensitive

SELECTIVE DELETION OF CERTAIN LINES:

# print all of file EXCEPT section between 2 regular expressions
sed ‘/Iowa/,/Montana/d’

# delete duplicate, consecutive lines from a file (emulates “uniq”).
# First line in a set of duplicate lines is kept, rest are deleted.
sed ‘$!N; /^\(.*\)\n\1$/!P; D’

# delete duplicate, nonconsecutive lines from a file. Beware not to
# overflow the buffer size of the hold space, or else use GNU sed.
sed -n ‘G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P’

# delete the first 10 lines of a file
sed ‘1,10d’

# delete the last line of a file
sed ‘$d’

# delete the last 2 lines of a file
sed ‘N;$!P;$!D;$d’

# delete the last 10 lines of a file
sed -e :a -e ‘$d;N;2,10ba’ -e ‘P;D’ # method 1
sed -n -e :a -e ‘1,10!{P;N;D;};N;ba’ # method 2

# delete every 8th line
gsed ‘0~8d’ # GNU sed only
sed ‘n;n;n;n;n;n;n;d;’ # other seds

# delete ALL blank lines from a file (same as “grep ‘.’ “)
sed ‘/^$/d’ # method 1
sed ‘/./!d’ # method 2

# delete all CONSECUTIVE blank lines from file except the first; also
# deletes all blank lines from top and end of file (emulates “cat -s”)
sed ‘/./,/^$/!d’ # method 1, allows 0 blanks at top, 1 at EOF
sed ‘/^$/N;/\n$/D’ # method 2, allows 1 blank at top, 0 at EOF

# delete all CONSECUTIVE blank lines from file except the first 2:
sed ‘/^$/N;/\n$/N;//D’

# delete all leading blank lines at top of file
sed ‘/./,$!d’

# delete all trailing blank lines at end of file
sed -e :a -e ‘/^\n*$/{$d;N;ba’ -e ‘}’ # works on all seds
sed -e :a -e ‘/^\n*$/N;/\n$/ba’ # ditto, except for gsed 3.02*

# delete the last line of each paragraph
sed -n ‘/^$/{p;h;};/./{x;/./p;}’

SPECIAL APPLICATIONS:

# remove nroff overstrikes (char, backspace) from man pages. The ‘echo’
# command may need an -e switch if you use Unix System V or bash shell.
sed “s/.`echo \\\b`//g” # double quotes required for Unix environment
sed ’s/.^H//g’ # in bash/tcsh, press Ctrl-V and then Ctrl-H
sed ’s/.\x08//g’ # hex expression for sed v1.5

# get Usenet/e-mail message header
sed ‘/^$/q’ # deletes everything after first blank line

# get Usenet/e-mail message body
sed ‘1,/^$/d’ # deletes everything up to first blank line

# get Subject header, but remove initial “Subject: ” portion
sed ‘/^Subject: */!d; s///;q’

# get return address header
sed ‘/^Reply-To:/q; /^From:/h; /./d;g;q’

# parse out the address proper. Pulls out the e-mail address by itself
# from the 1-line return address header (see preceding script)
sed ’s/ *(.*)//; s/>.*//; s/.*[: /'

# delete leading angle bracket & space from each line (unquote a message)
sed 's/^> //'

# remove most HTML tags (accommodates multiple-line tags)
sed -e :a -e 's/]*>//g;/zipup.bat
dir /b *.txt | sed “s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/” >>zipup.bat

TYPICAL USE: Sed takes one or more editing commands and applies all of
them, in sequence, to each line of input. After all the commands have
been applied to the first input line, that line is output and a second
input line is taken for processing, and the cycle repeats. The
preceding examples assume that input comes from the standard input
device (i.e, the console, normally this will be piped input). One or
more filenames can be appended to the command line if the input does
not come from stdin. Output is sent to stdout (the screen). Thus:

cat filename | sed ‘10q’ # uses piped input
sed ‘10q’ filename # same effect, avoids a useless “cat”
sed ‘10q’ filename > newfile # redirects output to disk

For additional syntax instructions, including the way to apply editing
commands from a disk file instead of the command line, consult “sed &
awk, 2nd Edition,” by Dale Dougherty and Arnold Robbins (O’Reilly,
1997; http://www.ora.com), “UNIX Text Processing,” by Dale Dougherty
and Tim O’Reilly (Hayden Books, 1987) or the tutorials by Mike Arst
distributed in U-SEDIT2.ZIP (many sites). To fully exploit the power
of sed, one must understand “regular expressions.” For this, see
“Mastering Regular Expressions” by Jeffrey Friedl (O’Reilly, 1997).
The manual (“man”) pages on Unix systems may be helpful (try “man
sed”, “man regexp”, or the subsection on regular expressions in “man
ed”), but man pages are notoriously difficult. They are not written to
teach sed use or regexps to first-time users, but as a reference text
for those already acquainted with these tools.

QUOTING SYNTAX: The preceding examples use single quotes (‘…’)
instead of double quotes (“…”) to enclose editing commands, since
sed is typically used on a Unix platform. Single quotes prevent the
Unix shell from intrepreting the dollar sign ($) and backquotes
(`…`), which are expanded by the shell if they are enclosed in
double quotes. Users of the “csh” shell and derivatives will also need
to quote the exclamation mark (!) with the backslash (i.e., \!) to
properly run the examples listed above, even within single quotes.
Versions of sed written for DOS invariably require double quotes
(“…”) instead of single quotes to enclose editing commands.

USE OF ‘\t’ IN SED SCRIPTS: For clarity in documentation, we have used
the expression ‘\t’ to indicate a tab character (0×09) in the scripts.
However, most versions of sed do not recognize the ‘\t’ abbreviation,
so when typing these scripts from the command line, you should press
the TAB key instead. ‘\t’ is supported as a regular expression
metacharacter in awk, perl, and HHsed, sedmod, and GNU sed v3.02.80.

VERSIONS OF SED: Versions of sed do differ, and some slight syntax
variation is to be expected. In particular, most do not support the
use of labels (:name) or branch instructions (b,t) within editing
commands, except at the end of those commands. We have used the syntax
which will be portable to most users of sed, even though the popular
GNU versions of sed allow a more succinct syntax. When the reader sees
a fairly long command such as this:

sed -e ‘/AAA/b’ -e ‘/BBB/b’ -e ‘/CCC/b’ -e d

it is heartening to know that GNU sed will let you reduce it to:

sed ‘/AAA/b;/BBB/b;/CCC/b;d’ # or even
sed ‘/AAA\|BBB\|CCC/b;d’

In addition, remember that while many versions of sed accept a command
like “/one/ s/RE1/RE2/”, some do NOT allow “/one/! s/RE1/RE2/”, which
contains space before the ’s’. Omit the space when typing the command.

OPTIMIZING FOR SPEED: If execution speed needs to be increased (due to
large input files or slow processors or hard disks), substitution will
be executed more quickly if the “find” expression is specified before
giving the “s/…/…/” instruction. Thus:

sed ’s/foo/bar/g’ filename # standard replace command
sed ‘/foo/ s/foo/bar/g’ filename # executes more quickly
sed ‘/foo/ s//bar/g’ filename # shorthand sed syntax

On line selection or deletion in which you only need to output lines
from the first part of the file, a “quit” command (q) in the script
will drastically reduce processing time for large files. Thus:

sed -n ‘45,50p’ filename # print line nos. 45-50 of a file
sed -n ‘51q;45,50p’ filename # same, but executes much faster

If you have any additional scripts to contribute or if you find errors
in this document, please send e-mail to the compiler. Indicate the
version of sed you used, the operating system it was compiled for, and
the nature of the problem. Various scripts in this file were written
or contributed by:

Al Aab # “seders” list moderator
Edgar Allen # various
Yiorgos Adamopoulos
Dale Dougherty # author of “sed & awk”
Carlos Duarte # author of “do it with sed”
Eric Pement # author of this document
Ken Pizzini # author of GNU sed v3.02
S.G. Ravenhall # great de-html script
Greg Ubben # many contributions & much help

tpl@eng.cam.ac.uk


Linux Commands / Tips / Tricks — Passing variables to terminal sessions (part 1)

August 26, 2009

Credit goes to some friends over at nixcraft.com for pointing me to use the expect tool.

You need to create a login file as follows login.txt:

server1|user|password

A shell script as follows (sshlogin.sh):

#!/bin/bash</pre>
FILE=login.txt
 CONNECT=sshlogin.exp
 SERVERNAME=$1
 MyServer=""
 MyUser=""
 MyPassword=""
 exec 3<&0
 exec 0<$FILE
 while read line
 do
 MyServer=$(echo $line | cut -d'|' -f1)
 MyUser=$(echo $line | cut -d'|' -f2)
 MyPassword=$(echo $line | cut -d'|' -f3)
 if [ "$SERVERNAME" == "$MyServer" ];
 then
 echo "Running ssh $MyUser@$MyServer..."
 $CONNECT $MyPassword $MyServer $MyUser
 fi
 done
 exec 0<&3
 echo "$SERVERNAME not found in login.txt file"

Modified sshlogin.exp from Ssh login expect script to supply password

In order to use following script you need to install expect tool, use apt-get or yum command!

#!/usr/bin/expect -f
# Expect script to supply root/admin password for remote ssh server
# and execute command.
# This script needs three argument to(s) connect to remote server:
# password = Password of remote UNIX server, for root user.
# ipaddr = IP Addreess of remote UNIX server, no hostname
# scriptname = Path to remote script which will execute on remote server
# For example:
#  ./sshlogin.exp password 192.168.1.11 who
# ------------------------------------------------------------------------
# Copyright (c) 2004 nixCraft project
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# set Variables
set password [lrange $argv 0 0]
set ipaddr [lrange $argv 1 1]
set username [lrange $argv 2 2]
set timeout -1
# now connect to remote UNIX box (ipaddr) with given script to execute
spawn ssh $username@$ipaddr
match_max 100000
# Look for passwod prompt
expect "*?assword:*"
# Send password aka $password
send -- "$password\r"
# send blank line (\r) to make sure we get back to gui
send -- "\r"
expect eof

To run script – set permissions

chmod +x sshlogin.sh
chmod +x  sshlogin.exp

Test it by connecting 127.0.0.1

./sshlogin 127.0.0.1

Read/Write Speeds on Adaptec 51645

November 4, 2008

Raid0 (two 10k RPM Raptors)
Read: 389MB/s (99.9% CPU usage)
Write: 107MB/s (99.8% CPU usage)
Raid10 (8x 750GB SATA 16MB Cache 7200RPM)
Read: 343MB/s (99.9% CPU usage)
Write: 111MB/s (71% CPU usage)
Single 500GB 32MB Cache 7200 RPM
Read: 408MB/s (99.9% CPU usage)
Write: 69.8MB/s (75% CPU usage)


>2TB on a fresh raid set

October 29, 2008

I figured out a pretty big hurdle today in the area over 2TB of data.  For some reason (probably because I first tried using fdisk) … my 2998GB (usable) media raid I could not partition correctly.  I had planned on using xfs, possibly ext3.  At first, I tried fdisk /dev/sdb … but I quickly found that it maxed out ~2TB.  After reading up a little more on google … I found that I needed to use parted … or gparted.  After a couple of days of toil and searching for reasons that libparted kept failing over 2TB … I found that I needed to rewrite my partition table.  This sounds redundant, but I actually needed to REwrite it in a different format.  It seemed to have defaulted to an msdos TYPE of partition table.  I found an article that told me how to resolve the issue.  Essentially, what you have to do is — in gparted you go Device->Create Partition Table->pull down advanced->then select the ‘gpt’ format.  Once I did that, life was grand and I could make the raid the full size of 2.72TB instead of the ‘meager’ 2.0TB that it was being limited to.   Problem solved … one down .. a few more to go :-)