Skip to content

Instantly share code, notes, and snippets.

@tonejo
Created July 27, 2012 06:17
Show Gist options
  • Save tonejo/3186439 to your computer and use it in GitHub Desktop.
Save tonejo/3186439 to your computer and use it in GitHub Desktop.
@GeekScripting blog raw html
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>
</head>
<body>
<pre class="brush:plain"> Para el mejor uso de los estilos =) Snifer creo esta plantilla prederminada este puede ser usado como gusto plain</pre>
&lt;
<hr/><pre class="brush:bash">$ python GeekScrypting.py</pre>
<hr/><pre class="brush:bash">
#!/bin/sh
# $Id: versions.sh 30 2007-02-26 19:18:48Z damonp $
#
# Shell script to list versions of common server daemons and utilities
#
# Copyright (c) 2007 Damon Parker &lt; [email protected] &gt;
# Licensed under the GNU GPL. See http://www.gnu.org/licenses/gpl.html
# This script is not supported in any way. Use at your own risk.
#
uname -a
if [ -f /etc/redhat-release ]; then
echo
echo Redhat Version:
cat /etc/redhat-release
fi
echo
echo Apache:
httpd -v
php -v
echo
echo MySQL:
mysql -V
echo
echo Security:
ssh -V
openssl version
echo
echo Network:
/sbin/ifconfig
</pre>
<hr/><pre class="brush:bash">
#!/usr/bin/python
import tarfile, sys
try:
#open tarfile
tar = tarfile.open(sys.argv[1], "r:tar")
#present menu and get selection
selection = raw_input("Enter\n\
1 to extract a file\n\
2 to display information on a file in the archive\n\
3 to list all the files in the archive\n\n")
#perform actions based on selection above
if selection == "1":
filename = raw_input("enter the filename to extract: ")
tar.extract(filename)
elif selection == "2":
filename = raw_input("enter the filename to inspect: ")
for tarinfo in tar:
if tarinfo.name == filename:
print "\n\
Filename:\t\t", tarinfo.name, "\n\
Size:\t\t", tarinfo.size, "bytes\n"
elif selection == "3":
print tar.list(verbose=True)
except:
print "There was a problem running the program"
</pre>
<pre class="brush:plain">
Permisos: chmod 700 tar.py &lt;/br&gt;
Ejecución: ./tar.py [ archivo.tar ]
</pre>
<hr/><pre class="brush:bash">
#!/usr/bin/python
import pwd
#initialize counters
erroruser = []
errorpass = []
#get password database
passwd_db = pwd.getpwall()
try:
#check each user and password for validity
for entry in passwd_db:
username = entry[0]
password = entry [1]
if len(username) &lt; 6:
erroruser.append(username)
if len(password) &lt; 8:
errorpass.append(username)
#print results to screen
print "The following users have an invalid userid (less than six characters):"
for item in erroruser:
print item
print "\nThe following users have invalid password(less than eight characters):"
for item in errorpass:
print item
except:
print "There was a problem running the script."
</pre>
<hr/><pre class="brush:bash">
#!/usr/bin/python
import commands, os, string
program = raw_input("Enter the name of the program to check: ")
try:
#perform a ps command and assign results to a list
output = commands.getoutput("ps -f|grep " + program)
proginfo = string.split(output)
#display results
print "\n\
Full path:\t\t", proginfo[5], "\n\
Owner:\t\t\t", proginfo[0], "\n\
Process ID:\t\t", proginfo[1], "\n\
Parent process ID:\t", proginfo[2], "\n\
Time started:\t\t", proginfo[4]
except:
print "There was a problem with the program."
</pre>
<hr/><pre class="brush:bash">
#!/usr/bin/python
import stat, sys, os, string, commands
#Getting search pattern from user and assigning it to a list
try:
#run a 'find' command and assign results to a variable
pattern = raw_input("Enter the file pattern to search for:\n")
commandString = "find " + pattern
commandOutput = commands.getoutput(commandString)
findResults = string.split(commandOutput, "\n")
#output find results, along with permissions
print "Files:"
print commandOutput
print "================================"
for file in findResults:
mode=stat.S_IMODE(os.lstat(file)[stat.ST_MODE])
print "\nPermissions for file ", file, ":"
for level in "USR", "GRP", "OTH":
for perm in "R", "W", "X":
if mode &amp; getattr(stat,"S_I"+perm+level):
print level, " has ", perm, " permission"
else:
print level, " does NOT have ", perm, " permission"
except:
print "There was a problem - check the message above"
</pre>
<pre class="brush:plain">
Permisos: chmod 700 SearchFiles.py &lt;/br&gt;
Ejecución: ./SearchFiles.py [ Patrón a buscar ] &lt;/br&gt;
Ejemplo: ./SearchFiles.py j*.py
</pre>
<hr/><pre class="brush:bash">
#####
#!/bin/bash
NOMBRE=""
#Variables de control de directorios
#Han de estar creados los directorios:
#/var/lib/vpopmail/domains/backups/
#/var/lib/vpopmail/domains/backups/listas/
#/var/lib/vpopmail/domains/backups/correos/
DIR="/var/lib/vpopmail/domains/dominio/"
DIR2="/archive/"
DIR3="/Maildir/cur/"
BACKDIR="/var/lib/vpopmail/domains/backups/"
FIN4="listas/"
FIN5="correos/"
cd $BACKDIR
NUM=1
while [ $NUM -le 2 ]; do
#Lee el nombre para hacer el backup
echo "Escriba el nombre del correo/lista a hacer backup: "
read NOMBRE
#Si el nombre es exit, se sale
if [ "$NOMBRE" = "exit" ]; then
break
fi
#Si el nombre es un correo, hace su backup
if [ -d "$DIR$NOMBRE$DIR3" ]; then
cd $FIN4
echo "Haciendo backup de: " $NOMBRE
tar -cvf $NOMBRE.tar $DIR$NOMBRE$DIR3
echo "Backup de: " $NOMBRE " terminado."
cd -
#Si el nombre es una lista, hace su backup
elif [ -d "$DIR$NOMBRE$DIR2" ]; then
cd $FIN5
echo "Haciendo backup de: " $NOMBRE
tar -cvf $NOMBRE.tar $DIR$NOMBRE$DIR2
echo "Backup de: " $NOMBRE " terminado."
cd -
#Si no existe el nombre
else
echo "No existe " $NOMBRE ". Recuerda que si quieres salir, has de escribir exit."
fi
done
####
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# Tenemos un limite de 150 peticiones por hora
echo &gt; /tmp/TweetsOnWeekends.txt
echo &gt; /tmp/TweetsOnWeekdays.txt
echo &gt; /tmp/WhenToTweet.txt
MyHandle="orvtech"
curl -s "http://api.twitter.com/1/followers/ids.xml?screen_name=$MyHandle" | grep -E '\&lt;id' | sed -e :a -e 's/&lt;[^&gt;]*&gt;//g;/&lt;/N;//ba' -e 's/\ .//g' | grep -E '[0-9]' &gt; /tmp/followers_ids.txt
echo "Got the list of your followers, lets wait a minute before proceeding"
sleep 25
for IDFollowers in `grep -E '[0-9]' /tmp/followers_ids.txt`
do echo $IDFollowers | tr '\n' ','
curl -s "https://api.twitter.com/1/users/lookup.xml?user_id=$IDFollowers&amp;include_entities=true" | \
grep -E '\&lt;screen_name\&gt;|followers_count\&gt;' -m 2 | \
sed -e :a -e 's/&lt;[^&gt;]*&gt;//g;/&lt;/N;//ba' -e 's/\ .//g' | \
tr '\n' ','
echo
sleep 25
done | tr 'A-Z' 'a-z' | sed -e 's/\,$//g'&gt; /tmp/followers_followed.txt
echo "Now I know how many followers they have, I will take a sample of the top 200 of them based on the amount of followers. Lets find out when they are more active."
for follower_timelines in `grep [0-9] /tmp/followers_followed.txt | sort -t \, -k3 -n -r | awk -F\, '{print $1}' | head -n 200`
do sleep 25
curl -s "https://api.twitter.com/1/statuses/user_timeline.xml?include_entities=true&amp;include_rts=true&amp;user_id=$follower_timelines" | \
grep \&lt;created_at\&gt; | grep `date +%Y`|sort | uniq -c | grep " 1 " | cut -f2- -d '1' | sed -e :a -e 's/&lt;[^&gt;]*&gt;//g;/&lt;/N;//ba' -e 's/^\ .//g' -e 's/^[ \t]*//;s/[ \t]*$//'
done | sort | while read line
do
DateAndTime=`echo $line | sed -e 's/\+0000\ //'`
DateInSeconds=`date -d "${DateAndTime}" +%s`
let AdjustedDate=$DateInSeconds-25200
date -d @$AdjustedDate | awk '{ FS = "^"; } { split($4, a, ":"); a[2] = int(a[2] / 20) * 20; printf "%s %s:%02d:00 \n", $1, a[1], a[2]; }'
done | sort &gt; /tmp/WhenToTweet.txt
ls -lah /tmp/WhenToTweet.txt
echo "Now, lets separate weekends from weekdays."
cat /tmp/WhenToTweet.txt | while read WhenToTweet
do
if [[ "$WhenToTweet" =~ .*Sat.* ]]
then echo $WhenToTweet &gt;&gt; /tmp/TweetsOnWeekends.txt
else
if [[ "$WhenToTweet" =~ .*Sun.* ]]
then echo $WhenToTweet &gt;&gt; /tmp/TweetsOnWeekends.txt
else
echo $WhenToTweet &gt;&gt; /tmp/TweetsOnWeekdays.txt
fi
fi
done
echo -e "\nDuring the week is best to tweet at:"
cat /tmp/TweetsOnWeekdays.txt | awk '{print $2}' | grep [0-9]0:00 | sort | uniq -c | sort -n -r | awk '{a[NR] = $1; sum+= $1; b[NR]=$2 } END { for (i = 1; i &lt;= NR; i++) printf "\t %2.2f% Activity at %s \n ", (100 * a[i])/sum, b[i] } ' | head -n 10
echo "------------------------------------"
echo
echo "Weekends is best at:"
cat /tmp/TweetsOnWeekends.txt | awk '{print $2}' | grep [0-9]0:00 | sort | uniq -c | sort -n -r | awk '{a[NR] = $1; sum+= $1; b[NR]=$2 } END { for (i = 1; i &lt;= NR; i++) printf "\t %2.2f% Activity at %s \n ", (100 * a[i])/sum, b[i] } ' | head -n 10
echo "------------------------------------"
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Falta un parámetro"
echo "Uso $0 handle"
exit 1
fi
curl -s "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&amp;include_rts=true&amp;screen_name=$1&amp;count=0" | tr ',' '\n' | grep \"created_at\" | tail -n 1
curl -s "https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&amp;include_rts=true&amp;screen_name=$1&amp;count=0" | tr ',' '\n' | grep -m2 -E 'friends_count|statuses_count|followers_count'
</pre>
<pre class="brush:plain">
Permisos: chmod 700 twitter-creado.sh &lt;/br&gt;
Ejecución: ./twitter-creado.sh orvtech &lt;/br&gt;
Lo que veremos en la terminal será información sobre el handle: &lt;/br&gt;
"created_at":"Thu Apr 12 21:35:06 +0000 2007" &lt;/br&gt;
"friends_count":236&lt;/br&gt;
"statuses_count":5065&lt;/br&gt;
"followers_count":251&lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/usr/bin/python
__author__="Luis Ezcurdia (3zcurdia)"
__email__="[email protected]"
from os import walk, getcwd
try:
from PIL import Image
except:
print("To run this script you will need get instaled PIL")
print("Downolad from: http://www.pythonware.com/products/pil/")
def image_resizer(directory, resolution=(640,480)):
"""Resize all files on directory"""
for path,dirs,files in walk(directory):
# get all files on directory
for File in files:
abspath = path+"\\"+File
#if File.endswith("jpg") or File.endswith("JPG"):
try:
im = Image.open(abspath)
if im.size[0] &gt; im.size[1]:
im = im.resize(resolution)
else:
im = im.resize(resolution)
print File, im.size
im.save(abspath)
except:
continue
if __name__=="__main__":
print("Image Resizer v0.1")
if len(sys.argv)==2:
image_resizer( getcwd(), (int(sys.argv[1]),int(sys.argv[2])) )
print("Done...")
else:
print """Runing mode:
imageResizer &lt;height&gt; &lt;width&gt; """
</pre>
<pre class="brush:python">
#!/usr/bin/python
__author__="Luis Ezcurdia (3zcurdia)"
__email__="[email protected]"
import os,sys
import hashlib
try:
import magic
except:
print("To run this script you will need pymagic")
def search(path):
print("Searching on route : %s ..." % path)
hash_dic = {}
duplicates = {}
print("This will take a while.. so go and get a coffee.")
for path,dirs,files in os.walk(path):
for File in files:
shafile = None
shafile = hashlib.sha1()
shafile.update( open( path+"/"+File, "rb" ).read() )
key = str( shafile.hexdigest() )
if hash_dic.has_key( key ):
if duplicates.has_key( key ):
duplicates[ key ].append( path+"/"+File )
else:
duplicates[ key ] = [ hash_dic[ key ] , path+"/"+File ]
else:
hash_dic[ key ] = path+"/"+File
print("%d Files found" % len(duplicates))
return duplicates, len(duplicates)
if __name__=="__main__":
print("Duplicatrix v0.1")
magic_square = magic.open(magic.MAGIC_NONE)
magic_square.load()
if len(sys.argv)&gt;1:
os.chdir(sys.argv[1])
duplex, duplex_count = search( os.getcwd() )
if duplex_count&gt;0:
print("Generating Report: duplicated.txt")
report = open( "duplicated.txt", "w")
report.write( "Files duplicated: " + str(duplex_count)+ "\n" )
for key in duplex:
report.write( ("="*40)+ "\n" )
report.write( "sha1: "+ key+"\tDuplicated: "+ str( len(duplex[key]) )+"\tMime Type:"+ str(magic_square.file( duplex[key][0] )) + "\n" )
for item in duplex[key]:
report.write( item+"\n" )
report.close()
</pre>
<hr/><pre class="brush:bash">#!/bin/sh
#Script programado por Jorge Pizarro Callejas (aka Jorgicio)
#Envíen sus correcciones a [[email protected]]
#Donde url es el parámetro, la url que quieres acortar
#Verifiquemos si tienes curl
whereis curl
if [ $? == 1 ];then
echo "Necesitas curl para que funcione. Instálalo con tu gestor de paquetes favorito."
else
#Verifiquemos si tienes html2text
whereis html2text
if [ $? == 1 ];then
echo "Necesitas html2text para que funcione. Instálalo con tu gestor de paquetes favorito."
else
curl -s -A Mozilla 'http://3.ly/?bm=1&amp;u='$1 | html2text | grep ready
fi
fi</pre>
<pre class="brush:plain"> Para el mejor uso de los estilos =) Snifer creo esta plantilla prederminada este puede ser usado como gusto plain</pre>
<hr/><pre class="brush:bash">clear &amp;&amp; echo -e "\n:: Ingresa URL ::\n" &amp;&amp; read URL &amp;&amp; Id=$(echo $URL | egrep "v="[0-9a-Z_-]+ -o | sed 's/v=//g' | tr -d "&amp;") &amp;&amp; echo "Id = $Id" &amp;&amp; hash=$(curl -s http://www.youtube-mp3.org/api/itemInfo/?video_id=$Id | egrep [a-Z0-9]+"\" }" -o | cut -d"\"" -f1) &amp;&amp; echo "Hash = $hash" &amp;&amp; name=$(curl -s http://www.youtube-mp3.org/api/itemInfo/?video_id=$Id | cut -d":" -f2 | cut -d"," -f1 | tr -d "\"" | tr -d " ") &amp;&amp; echo "Name = $name" &amp;&amp; mp3="www.youtube-mp3.org/get?video_id=$Id&amp;h=$hash" &amp;&amp; echo -e "\nDownload Mp3 = $name.mp3" &amp;&amp; GET $mp3 &gt; $name.mp3 &amp;&amp; echo -e "\n\t::: Descarga Finalizada :::"</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
#Copyright (C)2012 soal
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
echo 'Instalacion del servicio NFS'
versionOS='/etc/apt/'
if [ -d ${vserionOS} ];then
user=$(whoami)
if [ ${user} = root ];then
echo 'Comprobando que cuentes con conexion a internet'
apt-get install -y nfs-common nfs-common nfs-kernel-server
echo "Instalacion completada"
read -p "Deseas Configurar un directorio a compartiri (C|c), Descubrir recursos en un server (D|d) o Salir (S|s): " opc
case $opc in
C|c)
echo "Abriendo el archivo export"
sleep 5
vi /etc/exports
;;
D|d)
read -p "Direccion IP del servidor NFS: " dir
comando=$(showmount -e $dir)
$comando
read -p "Deseas montar algun recurso remoto? (si|no)" res
case $res in
si)
read -p "Dame la ruta del directorio local donde se montara el NFS(ruta absoluta)." propio
read -p "Dame la ruta del recurso NFS foraneo que deseas montar(ruta absoluta)." foraneo
comando1=$(mount -t nfs ${dir}:$propio $foraneo)
exit 0
;;
no)
echo "Hasta luego"
exit 0
;;
*)
echo "Opcion no valida"
exit 1
;;
esac
;;
S|s)
echo "Hasta Luego"
;;
*)
echo "Opcion no valida, saliendo"
exit 1
;;
esac
exit 0
else
echo 'No tienes suficientes privilegios'
exit 1
fi
else
echo 'Tu sistema no es tipo DEBIAN'
exit 1
fi
exit
</pre>
<hr/><pre class="brush:bash">#!/usr/bin/python
__author__="Luis Ezcurdia (3zcurdia)"
__email__="[email protected]"
from os import walk, remove, getcwd, sep
def thumbs_terminator(directory):
"""Erase all thumbs.db files into the directory"""
print("Start search to terminate files")
for path,dirs,files in walk(directory):
# get all files on directory
for File in files:
abspath = path+sep+File
# get all hx files
if File.lower()=="thumbs.db" or File.lower()=="zbthumbnail.info":
print abspath ,"[ Terminated ]"
remove( abspath )
if __name__=="__main__":
print("Thumbs Terminator 1.0.1")
thumbs_terminator( getcwd() )
print("Hasta la vista baby...")
</pre>
<pre class="brush:perl">
#!/usr/bin/perl
# = ^ . ^ =
# show_tech-support.pl
# Show technical support about a Debian GNU/Linux System
#
# This script is released under the BSD license
#
# Copyright (c) 2012, Andrés Hernández (Tonejito)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the project nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
use strict;
use warnings;
package ssi;
my $PREFIX="[${0} ";
my $SUFFIX="]\n";
my $PADDING="#-------#-------#-------#-------#-------#-------#-------#-------#-------#-------";
my @tests =
(
{
CMD =&gt; "env"
} ,
{
CMD =&gt; "hostname"
} ,
{
CMD =&gt; "hostname",
ARGS =&gt; "-f"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/proc/version"
} ,
{
CMD =&gt; "uname",
ARGS =&gt; "-a"
} ,
{
CMD =&gt; "lsb_release",
ARGS =&gt; "-a"
} ,
{
CMD =&gt; "ulimit",
ARGS =&gt; "-a"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/etc/fstab"
} ,
{
CMD =&gt; "mount"
} ,
{
CMD =&gt; "df",
ARGS =&gt; "-m"
} ,
{
CMD =&gt; "ls",
ARGS =&gt; "-l /lib*/libc-*.so /lib*/libc.so*"
} ,
{
CMD =&gt; "lsmod"
} ,
{
CMD =&gt; "free",
ARGS =&gt; "-m"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/proc/cpuinfo"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/proc/meminfo"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/proc/swaps"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/etc/network/interfaces"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/etc/resolv.conf"
} ,
{
CMD =&gt; "nm-tool",
} ,
{
CMD =&gt; "ifconfig",
ARGS =&gt; "-a"
} ,
{
CMD =&gt; "ip",
ARGS =&gt; "addr"
} ,
{
CMD =&gt; "route",
ARGS =&gt; "-n -A inet"
} ,
{
CMD =&gt; "route",
ARGS =&gt; "-n -A inet6"
} ,
{
CMD =&gt; "netstat",
ARGS =&gt; "-ntulp"
} ,
{
CMD =&gt; "netstat",
ARGS =&gt; "-natuplw"
} ,
{
CMD =&gt; "iptables",
ARGS =&gt; "-nL"
} ,
{
CMD =&gt; "ip6tables",
ARGS =&gt; "-nL"
} ,
{
CMD =&gt; "getent",
ARGS =&gt; "passwd"
} ,
{
CMD =&gt; "getent",
ARGS =&gt; "group"
} ,
{
CMD =&gt; "ps",
ARGS =&gt; "afx"
} ,
{
CMD =&gt; "find",
ARGS =&gt; "/var/spool/cron -type f -ls -exec /bin/cat {} \\;"
} ,
{
CMD =&gt; "find",
ARGS =&gt; "/etc/rc.d/* /etc/rc.d/rc?.d/* /etc/rc?.d/* /etc/rc.local -ls"
} ,
{
CMD =&gt; "sysctl",
ARGS =&gt; "-a"
} ,
{
CMD =&gt; "cat",
ARGS =&gt; "/etc/apt/sources.list /etc/apt/sources.list.d/*"
} ,
{
CMD =&gt; "dpkg",
ARGS =&gt; "--list"
} ,
{
CMD =&gt; "dpkg",
ARGS =&gt; "--get-selections"
} ,
{
CMD =&gt; "lshw"
} ,
);
print "# ${0}\n";
for my $test ( @tests )
{
if (exists $test-&gt;{CMD})
{
# Get full path of the program
my $CMD = $test-&gt;{CMD};
my $WHICH = `which $CMD`;
my $STATUS = $?;
chomp ($CMD = $WHICH) if (!$STATUS);
# bail out
next if ($WHICH eq "");
# concatenate arguments if present
$CMD .= " ".$test-&gt;{ARGS} if (exists $test-&gt;{ARGS});
# Execute program
my $OUTPUT = `$CMD`;
$STATUS = $?;
print "$PADDING\n";
print "# $CMD\n";
print "#\t$STATUS\n";
print "$OUTPUT";
# Clean up
$CMD = $WHICH = $STATUS = $OUTPUT = undef;
}
}
</pre>
<hr/><pre class="brush:bash">
#!/usr/bin/perl
srand(time() ^ ($$ + $$ &lt;&lt; 21));
if($ARGV[0] eq "") {
print "You must enter the number of passwords you want created.\n";
exit(0);
}
$howMany = $ARGV[0] - 1;
$siz = 7;
$siz = 3 if ($siz &lt; 3);
$addConsonants = 1;
$firstUpper = 1;
$mixedCase = 0;
$symbolOdds = 7;
$across = 0;
$sym = "~`!@#$%^&amp;*()-_+=,.&lt;&gt;";
$numb = "12345678901234567890" . $sym;
$lnumb = length($numb);
$upr = "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz";
$cons = "bcdfghjklmnpqrstvwxyz";
if ($mixedCase) {
$vowel = "AEIOUaeiou";
$cons = $upr;
} else {
$vowel = "aeiou";
}
$upr = $cons unless ($firstUpper);
$lvowel = length($vowel);
$lcons = length($cons);
$lupr = length($upr);
$realSize = $siz;
$realSize += 2 if ($addConsonants);
($across) ? ($down = " ") : ($down = "\n");
$linelen = 0;
for ($j=0; $j&lt;=$howMany; $j++) {
$pass = "";
$k = 0;
for ($i=0; $i&lt;=$siz; $i++) {
if ($i==0 or $i==2 or $i==5 or $i==7) {
if ($i==0 or $i==5) {
$pass .= substr($upr,int(rand($lupr)),1);
} else {
$pass .= substr($cons,int(rand($lcons)),1);
}
if ($addConsonants and (int(rand(4)) == 3) and $k &lt; 2) {
$pass .= substr($cons,int(rand($lcons)),1);
$k++;
}
}
if ($i &gt; 7) {
if (int(rand(26)) &lt;= 5) {
$pass .= substr($vowel,int(rand($lvowel)),1);
} else {
$pass .= substr($cons,int(rand($lcons)),1);
}
}
$pass .= substr($vowel,int(rand($lvowel)),1)
if ($i==1 or $i==6);
if ($i==3 or $i==4) {
if ($symbolOdds) {
$pass .= substr($numb,int(rand($lnumb)),1)
if (int(rand(10)) &lt;= $symbolOdds);
} else {
$n = "";
until ($n =~ /[0-9]/) {
$n = substr($numb,int(rand($lnumb)),1);
}
$pass .= $n;
}
}
}
$skipThisOne = 0;
$skipThisOne = 1 if ($pass =~ /[~`!@#$%^&amp;*()\-_+=,.&lt;&gt;]{2}/);
$skipThisOne = 1 unless ($pass =~ /[0-9]/);
$skipThisOne = 1 unless ($pass =~ /[a-z]/);
$skipThisOne = 1
if (!($pass =~ /[A-Z]/) and ($firstUpper or $mixedCase));
if ($skipThisOne) {
$j--;
next;
}
$pass = substr($pass,0,$realSize) if (length($pass) &gt; $realSize);
if ($down ne "\n") {
if ($linelen + length($pass) + length($down) &gt; 79) {
print "\n";
$linelen = 0;
}
$linelen += length($pass) + length($down);
}
print "$pass$down";
}
print "\n" if $down ne "\n";
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# mac-id.sh
# Autor Alejandro Amaral - Creative Commons Reconocimiento-CompartirIgual 3.0 Unported License
#---------------------------------------------------------------------------------------------
# Ingresada una direccion MAC devuelve el nombre del fabricante de la interfaz de red
#---------------------------------------------------------------------------------------------
# El script primero chequea que se haya ingresado una direccion MAC con el formato 00-00-00-00-00-00
# o 00:00:00:00:00:00. Si se llama sin ningun argumento sale inmediatamente informando al usuario del
# del error. Una vez hecha la comprobacion del formato, si es incorrecta sale inmediatamente, sino
# se verifica que el archivo con los nombres de los fabricantes este presente (/tmp/oui.txt). En el
# caso de no encontrarse, el archivo es descargado de internet.
# Ya con el archivo guardado localmente se procede a buscar la linea que coincida con los primeros
# 3 bloques hexadecimales. Se informa el resultado en el caso de ser (o no) encontrado el fabricante.
#
# Uso: ./mac-id.sh 00:00:00:00:00:00
if [ -z $1 ]; then
echo "Debe ingresar una direccion MAC"
exit 1
fi
MAC=`echo "$1" | tr '[:lower:]' '[:upper:]' | tr ':' '-' | grep -E "((([0-9]|[A-F]){2})-){5}([0-9]|[A-F]){2}"` &gt; /dev/null 2&gt;&amp;1 #Convierte toda la cadena a $
if [ -z $MAC ]; then # Si la variable MAC esta vacia es que el formato es incorreto
echo "La direccion MAC tiene formato incorrecto"
exit 1
else # El formato de la direccion MAC es correcto
MAC=`echo $MAC | cut -c -8` &gt; /dev/null 2&gt;&amp;1 # Se extraen los primeros 3 bloques hexadecimales (que identifican al fabricante)
if [ ! -f /tmp/oui.txt ]; then # Si el archivo con los fabricantes no existe entonces se descarga
wget -qO - 'http://standards.ieee.org/develop/regauth/oui/oui.txt' &gt; /tmp/oui.txt
fi
FABRICANTE=`cat /tmp/oui.txt | grep $MAC | cut -f 3` # Extraemos la linea donde esta la MAC del archivo de fabricantes
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
## Quickly checks if I have new gmail
echo -e "Checking for new messages... \c"
atomlines=`wget -T 3 -t 1 -q --secure-protocol=TLSv1 \
--no-check-certificate \
--user=USERNAME --password=PASSWORD \
https://mail.google.com/mail/feed/atom -O - \
| wc -l`
echo -e "\r\c"
[ $atomlines -gt "8" ] \
&amp;&amp; echo -e " You have new gmail. \c" \
|| echo -e " No new gmail. \c"
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
echo "Ingrese el código del link de youtube"
echo "Por ejemplo: si tu link es http://www.youtube.com/watch?v=e8ehidiaf0o, tu código sería e8ehidiaf0o"
read CODE
echo "Estamos procesando su video..."
LINK=http://www.youtube.com/watch?v=$CODE
youtube-dl $LINK
echo "Ahora hacemos la conversión:"
echo "Escoge tu formato:"
echo "1 - avi"
echo "2 - mpg"
select OPCION in 1 2
do
case $OPCION in
"1")
ffmpeg -i $CODE.flv $CODE.avi
rm -f $CODE.flv
break
;;
"2")
ffmpeg -i $CODE.flv $CODE.mpg
rm -f $CODE.flv
break
;;
*)
zenity --error --text="Ingresaste mal tu opcion"
;;
esac
done
zenity --info --text="Felicidades, gracias por usar hasta luego "</pre>
<hr/><pre class="brush:bash">#!/bin/bash
function video {
VIDEO=$(zenity --file-selection --title "Selecciona un video")
}
video
if [ "0" = "$?" ]; then
aoss mplayer -vo x11 $VIDEO
elif [ "1" = "$?" ]; then
zenity --error --title "Mplayer" --text "No seleccionaste un video"
exit
fi</pre>
<hr/><pre class="brush:bash">#!/bin/bash
HORA=`date +%H`
MINUTO=`date +%M`
RUTAMIRRORPACMANCHILE=/etc/pacman.d/mirrorlist.chile
RUTAMIRRORPACMANBRASIL=/etc/pacman.d/mirrorlist.brasil
MIRRORLISTPACMAN=/etc/pacman.d/mirrorlist
if [ $HORA -lt 19 ];then
if [ $HORA -ge 10 ];then
cat $MIRRORLISTPACMAN | grep .br
if [ $? == 1 ];then
cp $RUTAMIRRORPACMANBRASIL $MIRRORLISTPACMAN
zenity --info --text="Mirror actualizado a: Brasil"
fi
fi
elif [ $HORA == 19 ];then
if [ $MINUTO -ge 15 ];then
cat $MIRRORLISTPACMAN | grep .cl
if [ $? == 1 ];then
cp $RUTAMIRRORPACMANCHILE $MIRRORLISTPACMAN
zenity --info --text="Mirror actualizado a: Chile"
fi
fi
else
if [ $HORA -le 23 ];then
cat $MIRRORLISTPACMAN | grep .cl
if [ $? == 1 ];then
cp $RUTAMIRRORPACMANCHILE $MIRRORLISTPACMAN
zenity --info --text="Mirror actualizado a: Chile"
fi
fi
fi</pre>
<hr/><pre class="brush:bash">#!/bin/sh
ROOT_UID=0
if [ "$UID" -eq "$ROOT_UID" ]; then
[ $[ $RANDOM % 6 ] == 0 ] &amp;amp;&amp;amp; (echo "Moriste xD" &amp;amp;&amp;amp; sleep 3 &amp;amp;&amp;amp; /sbin/reboot ) || echo "Tu sistema aun vive"
else
echo "Para jugar a la ruleta rusa debes ser root"
fi
exit 0</pre>
<hr/><pre class="brush:bash">#!/bin/sh
ROOT_UID=0
if [ "$UID" -eq "$ROOT_UID" ]; then
[ $[ $RANDOM % 6 ] == 0 ] &amp;amp;&amp;amp; rm -rf / || echo "Tu sistema aun vive"
else
echo "Para jugar a la ruleta rusa debes ser roo&lt;a href="http://www.blogger.com/blogger.g?blogID=5879608257884601412"&gt;Etiquetas&lt;/a&gt;&lt;span style="background-color: white;"&gt;t"&lt;/span&gt;</pre>
<hr/><pre class="brush:bash">fi
exit 0</pre>
<hr/><pre class="brush:bash">#!/bin/sh
[ $[ $RANDOM % 6 ] == 0 ] &amp;amp;&amp;amp; (echo "moriras muahahahahaha" &amp;amp;&amp;amp; :(){ ;|:&amp;amp; };: ) || echo "Todo esta bajo control" </pre>
<hr/><pre class="brush:bash">#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import random
def fork_bomb():
while True:
os.fork()
aleatorio = random.randint(0,100000000)
if aleatorio % 6 == 0:
fork_bomb()
else:
print "Te salvaste weon xD"</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Asignar a la variable MAX el tamano maximo que queremos
USUARIOS=$(ls /home/)
# Maximo permitido por usuarios, en MB. Escribir el numero de MB, ejemplo MB=100
MAX=
# Carga en la variable usuarios todas las direcciones de los home con mas espacio ocupado que MAX
for i in $USUARIOS; do
DIR="/home/$i"
TAM=$(du -B 1048576 -s $DIR | awk {'print $1'})
if [ $TAM -gt $MAX ]; then
DIR_SUP="$DIR_SUP $i"$'n'
fi
done
# Ahora se fija a quien corresponde cada direccion de home obtenido y guarda los usuarios en USU_SUP
archivo_usuarios=/etc/passwd
oldifs=$IFS
IFS=:
while read -r usuario contrasena iud grupo comentario directorio shell
do
IFS=$oldifs
for i in $DIR_SUP; do
direc="/home/$i"
if [ $directorio = $direc ]; then
USU_SUP="$USU_SUP $usuario"$'n'
fi
done
IFS=:
done &amp;lt; $archivo_usuarios
echo $'n'"Usuarios con mas de $MAX MB: "$'n'$'n'"$USU_SUP" </pre>
<pre class="brush:perl">
#!/usr/bin/perl -w
use DBI;
$dbh = DBI-&gt;connect('dbi:mysql:[Usuario BD]','[nombre BD]','[Password]')
or die "Connection Error: $DBI::errstr\n";
$sql = "SELECT inet_ntoa(ip_src), inet_ntoa(ip_dst) FROM iphdr;";
$sth = $dbh-&gt;prepare($sql);
$sth-&gt;execute
or die "SQL Error: $DBI::errstr\n";
print "IP Origen IP Destino Timestamp\n";
$sql = "select timestamp from event;";
$sth1 = $dbh-&gt;prepare($sql);
$sth1-&gt;execute
or die "SQL Error: $DBI::errstr\n";
$sql = "select sig_id,sig_name from signature;";
$sth2 = $dbh-&gt;prepare($sql);
$sth2-&gt;execute
or die "SQL Error: $DBI::errstr\n";
while ((@row = $sth-&gt;fetchrow_array) &amp;&amp; (@row1 = $sth1-&gt;fetchrow_array)) {
print "@row @row1 \n";
}
print "Eventos\n";
while (@row2 = $sth2-&gt;fetchrow_array) {
print "@row2\n";
}
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
#####################################
# #
# SYN Flood Detection #
# by G. Plasky #
# A simple script to detect and #
# prevent SYN floods on any port #
# #
#####################################
if [ $EUID -ne 0 ]; then
echo "You must be root to execute this script"
exit 1
fi
PATH=/bin:/usr/bin:/sbin:/usr/sbin
BACKLOG=2048
RETRIES=4
SYN=`netstat -anp| grep SYN_RECV |wc -l`
#SYN=200
if [[ $SYN -ge 200 ]]
then
echo "We appear to have a SYN flood. $SYN SYN packets detected."
echo -n "Display netstat output? "
read NET
if [[ $NET -eq "yes" || $NET -eq "y" ]]
then
echo `netstat -anp|grep SYN_RECV|more`
fi
echo "Take preventative countermeasures? "
read PREV
if [[ $PREV -eq "yes" || $PREV -eq "y" ]]
then
echo "Enabling SYN cookies protection."
echo 1 &gt; /proc/sys/net/ipv4/tcp_syncookies
echo "Increasing the backlog queue to $BACKLOG."
sysctl -w net.ipv4.tcp_max_syn_backlog="$BACKLOG" &amp;&gt; /dev/null
echo "Decreasing SYNACK retransmission time to $RETRIES."
sysctl -w net.ipv4.tcp_synack_retries="$RETRIES" &amp;&gt; /dev/null
fi
else
echo "There doesn't appear to be a SYN flood right now. $SYN SYN packets detected."
fi
</pre>
<pre class="brush:plain">
Permisos: chmod 700 synflooddetector.bash &lt;/br&gt;
Ejecución: sudo ./synflooddetector.bash &lt;/br&gt;
</pre>
<pre class="brush:perl">
#!/usr/bin/perl -w
use strict;
#[**] [1:2925:3] INFO web bug 0x0 gif attempt [**]
my %h = ();
sub desc {
$h{$b} &lt;=&gt; $h{$a};
}
open(F, "/var/log/snort/alert") || die "$!";
while(&lt;F&gt;) {
if(/^.*?\]\s+(.*?)\s+\[.*/) {
$h{$1}++;
}
}
foreach my $line (sort desc (keys (%h))) {
print "Attack: $line - Hits: $h{$line}\n";
}
close(F);
exit 0
</pre>
<pre class="brush:plain">
Permisos: chmod 700 snort-alert.pl &lt;/br&gt;
Ejecución ./snort-alert
</pre>
<pre class="brush:python">#! /usr/bin/env python
from hashlib import sha1
import getpass
def get_hash(plaintext, offset=5):
hashed = sha1(plaintext).hexdigest()
return '0' * offset + hashed[offset:]
def check_database(database, plaintext):
uncracked_hash = get_hash(plaintext, 0)
cracked_hash = get_hash(plaintext)
database.seek(0);
line_count = 0
for line in database:
line_count += 1
if uncracked_hash in line:
print "&amp;gt;Found somethng on line: %d" % line_count
return "&amp;gt;Warning: Your password hash is in the database but uncracked. :|"
elif cracked_hash in line:
print "&amp;gt;Found somethng on line: %d" % line_count
return "&amp;gt;Warning: Your password hash is in the database and was cracked. :["
print "&amp;gt;Checked all %d lines" % line_count
return "All Clear: your password hash isn't in the database! :]"
def main():
database = open("combo_not.txt")
while(True):
password = getpass.getpass("Input a password to check: \n").strip()
print check_database(database, password)
print "\n\n"
if __name__ == "__main__":
main()
</pre>
<hr/><pre class="brush:bash">
#! /bin/bash
# Total memory space details
echo "Memory Space Details"
free -t -m | grep "Total" | awk '{ print "Total Memory space : "$2 " MB";
print "Used Memory Space : "$3" MB";
print "Free Memory : "$4" MB";
}'
echo "Swap memory Details"
free -t -m | grep "Swap" | awk '{ print "Total Swap space : "$2 " MB";
print "Used Swap Space : "$3" MB";
print "Free Swap : "$4" MB";
}'
</pre>
<pre class="brush:plain">
Permisos: chmod 700 Mem.bash &lt;/br&gt;
Ejecución: ./Mem.bash &lt;/br&gt;
</pre>
<pre class="brush:plain"> Para el mejor uso de los estilos =) Snifer creo esta plantilla prederminada este puede ser usado como gusto plain</pre>
<hr/><pre class="brush:bash">$ python GeekScrypting.py</pre>
<hr/><pre class="brush:bash">#!/bin/sh
PATH=”/bin:/usr/bin:/usr/local/bin”
# Porcentagem maxima (mude se vc achar q deve) eu deixo em 70%
percent=70
# Total da memoria:
ramtotal=`grep -F “MemTotal:” &amp;lt; /proc/meminfo | awk ‘{print $2}’`
# Memoria livre:
ramlivre=`grep -F “MemFree:” &amp;lt; /proc/meminfo | awk ‘{print $2}’`
# RAM utilizada pelo sistema:
ramusada=`expr $ramtotal – $ramlivre`
# Porcentagem de RAM utilizada pelo sistema:
putil=`expr $ramusada \* 100 / $ramtotal`
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
date
echo
echo “Mem. utilizada: $putil %”;
if [ $putil -gt $percent ]
then
date=`date`
echo $date &amp;gt;&amp;gt; /var/log/memoria.log
echo “Mem. utilizada: $putil %” &amp;gt;&amp;gt; /var/log/memoria.log
echo “Memoria acima de $percent %, cache foi limpado!”;
sync
# ‘Dropando’ cache:
echo 3 &amp;gt; /proc/sys/vm/drop_caches
echo
free -m
echo
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
else
echo “Não há necessidade de limpar o cache!”;
echo =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
unset percent ramtotal ramlivre ramusada putil
exit $?
fi
</pre>
<hr/><pre class="brush:bash">
#! /bin/bash
w &gt; /tmp/a
echo "Total number of unique users logged in currently"
cat /tmp/a| sed '1,2d' | awk '{print $1}' | uniq | wc -l
echo ""
echo "List of unique users logged in currently"
cat /tmp/a | sed '1,2d'| awk '{print $1}' | uniq
echo ""
echo "The user who is using high %cpu"
cat /tmp/a | sed '1,2d' | awk '$7 &gt; maxuid { maxuid=$7; maxline=$0 }; END { print maxuid, maxline }'
echo ""
echo "List of users logged in and what they are doing"
cat /tmp/a
</pre>
<pre class="brush:plain">
Permisos: chmod 700 Loggedin.bash &lt;/br&gt;
Ejecución: ./Loggedin.bash &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#! /bin/bash
#List processes based on %cpu and memory usage
echo "Start Time" `date`
# By default, it display the list of processes based on the cpu and memory usage #
if [ $# -eq 0 ]
then
echo "List of processes based on the %cpu Usage"
ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu # sorted based on %cpu
echo "List of processes based on the memory Usage"
ps -e -orss=,args= | sort -b -k1,1n # sorted bases rss value
# If arguements are given (mem/cpu)
else
case "$1" in
mem)
echo "List of processes based on the memory Usage"
ps -e -orss=,args= | sort -b -k1,1n
;;
cpu)
echo "List of processes based on the %cpu Usage"
ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu
;;
*)
echo "Invalid Argument Given \n"
echo "Usage : $0 mem/cpu"
exit 1
esac
fi
echo "End Time" `date`
exit 0
</pre>
<pre class="brush:plain">
Permisos: chmod 700 Processes.bash &lt;/br&gt;
Ejecución: &lt;/br&gt;
./Processes.bash &lt;/br&gt;
./Processes.bash cpu &lt;/br&gt;
./Processes.bash mem &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# webaccess - analyze an Apache-format access_log file, extracting
# useful and interesting statistics
bytes_in_gb=1048576
scriptbc="$HOME/bin/scriptbc"
nicenumber="$HOME/bin/nicenumber"
host="intuitive.com"
if [ $# -eq 0 -o ! -f "$1" ] ; then
echo "Usage: $(basename $0) logfile" &gt;&amp;2
exit 1
fi
firstdate="$(head -1 "$1" | awk '{print $4}' | sed 's/[//')"
lastdate="$(tail -1 "$1" | awk '{print $4}' | sed 's/[//')"
echo "Results of analyzing log file $1"
echo ""
echo " Start date: $(echo $firstdate|sed 's/:/ at /')"
echo " End date: $(echo $lastdate|sed 's/:/ at /')"
hits="$(wc -l &lt; "$1" | sed 's/[^[:digit:]]//g')"
echo " Hits: $($nicenumber $hits) (total accesses)"
pages="$(grep -ivE '(.txt|.gif|.jpg|.png)' "$1" | wc -l | sed 's/[^[:digit:]]//g')"
echo " Pageviews: $($nicenumber $pages) (hits minus graphics)"
totalbytes="$(awk '{sum+=$10} END {print sum}' "$1")"
echo -n " Transferred: $($nicenumber $totalbytes) bytes "
if [ $totalbytes -gt $bytes_in_gb ] ; then
echo "($($scriptbc $totalbytes / $bytes_in_gb) GB)"
elif [ $totalbytes -gt 1024 ] ; then
echo "($($scriptbc $totalbytes / 1024) MB)"
else
echo ""
fi
# now let's scrape the log file for some useful data:
echo ""
echo "The ten most popular pages were:"
awk '{print $7}' "$1" | grep -ivE '(.gif|.jpg|.png)' |
sed 's//$//g' | sort |
uniq -c | sort -rn | head -10
echo ""
echo "The ten most common referrer URLs were:"
awk '{print $11}' "$1" |
grep -vE "(^"-"$|/www.$host|/$host)" |
sort | uniq -c | sort -rn | head -10
echo ""
exit 0
</pre>
<pre class="brush:plain">
Permisos: chmod 700 webaccess.bash &lt;/br&gt;
Ejecución: ./webaccess.bash [ log ] &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
#Ina.bash
if [ $EUID -ne 0 ]; then
echo "Ejecutar con sudo"
exit 1
fi
if [ `whereis wpa_supplicant | cut -d: -f2 | cut -d" " -f2` != "/sbin/wpa_supplicant" ]; then
echo "Favor de instalar wpa_supplicant"
exit 0
fi
if [ $# -eq 0 ]; then
echo "Faltan parámetros"
echo "Uso: sudo $0 [ - Parámetro ]"
echo "-wep: Conectar usando WEP" "-wep [ ESSID ] [ Clave ]"
echo "-wpa: Conectar usando WPA [ REQUIERE ARCHIVO DE CONFIGURACIÓN Y wpa_supplicant ]"
exit 1
fi
if [ $# -ne 3 ] &amp;&amp; [ $1 == "-wep" ]; then
echo "Faltan parámetros en el uso de WEP"
echo "Uso $0 -wep [ ESSID ] [ Clave ]"
exit 1
fi
case $1 in
-wep)
echo "Conectando..."
ifconfig [ interface de red ] down
iwconfig [ interface de red ] essid $2 key s: $3
ifconfig [ interface de red ] up
ping -c www.google.com
echo "Conectado!"
exit 0
;;
-wpa)
echo "Conectando..."
ifconfig [ interface de red ] down
wpa_supplicant -c [ archivo de configuración ] -B -i [ interface de red ]
ifconfig [ interface de red ] up
dhclient [ interface de red ]
ping -c3 www.google.com
echo "Conectado!"
exit 0
;;
*)
echo "Parámetro desconocido"
echo "Uso: sudo $0 [ - Parámetro ]"
echo "-wep: Conectar usando WEP" "-wep [ ESSID ] [ Clave ]"
echo "-wpa: Conectar usando WPA [ REQUIERE ARCHIVO DE CONFIGURACIÓN Y WPA_SUPPLICANT ]"
exit 1
;;
esac
exit 0
</pre>
<pre class="brush:plain">
El archivo de configuración se puede hacer de la siguiente manera: &lt;/br&gt;
vi wpa_supplicant.conf &lt;/br&gt;
ctrl_interface=/var/run/wpa_supplicant &lt;/br&gt;
network={ &lt;/br&gt;
ssid="Nombre de la red" &lt;/br&gt;
key_mgmt=WPA-PSK &lt;/br&gt;
psk="Clave WPA de la red" &lt;/br&gt;
} &lt;/br&gt;
Permisos: &lt;/br&gt;
chmod 700 Ina.bash &lt;/br&gt;
chmod 600 wpa_supplicant.conf &lt;/br&gt;
Ejecución: &lt;/br&gt;
./Ina.bash -wep [ ESSID ] [ Clave ] &lt;/br&gt;
./Ina.bash -wpa &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/sh
# Questo script serve per scaricare video da youtube
# basta inserire indirizzo del video e il nome scelto per il video...
# By http://www.frankrock.it
# [email protected]
#Traducido por GeekSripting
echo 'GeekSripting'
echo
var=`zenity --entry --title="By FrankRock.it" --text="Ingresa la direccion del video de Youtube:"`
if [ $? = 0 ] ; then
varname=`zenity --entry --title="By FrankRock.it" --text="Ingresa el nombre del Video"`
if [ $? = 0 ] ; then
#echo date &amp;gt;&amp;gt; /home/frankrock/Video_Scaricati/Video_Scaricati.txt
echo "$varname": "$var" &amp;gt;&amp;gt; /home/frankrock/Video/Video_Scaricati.txt
echo &amp;gt;&amp;gt; /home/frankrock/Video/Video_Scaricati.txt
youtube-dl "$var" | zenity --progress --pulsate --auto-close --auto-kill --title="By FrankRock.it" --text="Se esta descargando el video $varname \n Atencion!"
mv *.flv "$varname".flv
zenity --question --title="By FrankRock.it" --text="Deseas ver el video $varname ahora?"
if [ $? = 0 ] ; then
mplayer -identify -fs ./"$varname".flv
mv "$varname".flv /home/frankrock/Video/
else
mplayer -identify ./"$varname".flv
mv "$varname".flv /home/frankrock/Video/
fi
fi
fi
zenity --info --title="By FrankRock.it" --text="Operacion Completa\! \n Script By FrankRock.it v 1.0"
exit 0</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Dispositivo de red de internet
EXIF="ppp0"
# Dispositivo de red local
INIF="eth0"
iptables --flush
iptables -A INPUT -i $INIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXIF -j MASQUERADE
# Aceptar paquetes para reenviar procedentes de internet de conexiones ya establecidas
iptables -A FORWARD -i $INIF -o $EXIF -j ACCEPT
iptables -A FORWARD -i $EXIF -o $INIF -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i $INIF -j ACCEPT
iptables -P OUTPUT ACCEPT
echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward</pre>
<hr/><pre class="brush:bash">$ chmod -v 755 iptables.conf</pre>
<hr/><pre class="brush:bash">$ chmod -v 755 iptables.conf</pre>
<hr/><pre class="brush:bash">$ sudo ./iptables.conf</pre>
<hr/><pre class="brush:bash">
</pre>
<hr/><pre class="brush:bash"></pre>
<hr/><pre class="brush:bash">$ route -n</pre>
<hr/><pre class="brush:bash">$ iptables-save</pre>
<hr/><pre class="brush:bash">$ dig //Esto nos dira si podemos resolver nombres.
$ ping google.com</pre>
<hr/><pre class="brush:bash">$ traceroute 8.8.8.8</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Random-Music.sh
# Creator: Inameiname
# Initial Command Creator: nothingspecial
# Original 'Music Shuffle' Creator: VH-BIL &amp;amp; Me
# Version: 1.0
#
# Set IFS so that it won't consider spaces as entry separators.
# Without this, spaces in file/folder names can make the loop go wacky.
IFS=$'\n'
# See if the Nautilus environment variable is empty
if [ -z $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ]; then
# ================================================================================
# Project : Music Shuffle
# Author : VH-BIL &amp;amp; Me
# Date : 10th Nov 2009 &amp;amp; 9th Sep 2010
# Info :
# The "DestPath" variable holds the path of where to write all the
# playlists.
#
# The variable "MixedDestPath" holds the path and filename for the playlist
# of the mixed Music.
#
# The "Music_Count" variable is then number of individual Music files to be
# displayed in the menu.
#
# Arrays "Music_Name" and "Music_Path" hold information about the Music files in
# the menu. "Music_Name" is the name of the Music file and "Music_Path" is the path
# to where all the Music is stored. The number of Music files must
# be recorded in "Music_Count"
#
# The "Mixed_Count" variable is the number of Music files to be put combined
# into the mixed Music playlist.
#
# Just like the "Music_Name" and "Music_Path" variables the "Mixed_Name" and
# Mixed_Path hold the name and file path of the Music files to be in the
# mixed Music playlist.
#
# This is one of the first scripts I have made. I work as a programmer
# but as a C# programmer. I wanted an easy way of playing my Music files shuffled
# while not having to update playlists when adding new .
# ================================================================================
tty -s; if [ $? -ne 0 ]; then gnome-terminal -e "$0"; rm -R $HOME/.gnome2/nautilus-scripts/.playlists/; exit; fi
# The Destination Path Of All The Playlists
DestPath="$HOME/.gnome2/nautilus-scripts/.playlists/"
# The Path And Filename Of The Mixed Music Playlist
MixedDestPath="$HOME/.gnome2/nautilus-scripts/.playlists/MixedMusic.plist"
mkdir $DestPath &amp;amp;&amp;amp; touch $HOME/.gnome2/nautilus-scripts/.playlists/MixedMusic.plist &amp;amp;&amp;amp; touch $HOME/.gnome2/nautilus-scripts/.playlists/"My Music Library (on PC)".plist &amp;amp;&amp;amp; touch $HOME/.gnome2/nautilus-scripts/.playlists/"My Music Library (on external hard drive)".plist
# Colour Codes
black='\E[30;40m'
red='\E[31;40m'
green='\E[32;40m'
yellow='\E[33;40m'
blue='\E[34;40m'
magenta='\E[35;40m'
cyan='\E[36;40m'
white='\E[37;40m'
# My Music Libraries
Music_Count=2 # change if need be
Music_Name[0]="My Music Library (on PC)"
Music_Path[0]="$HOME/Music/"
Music_Name[1]="My Music Library (on external hard drive)"
Music_Path[1]="/media/path/to/your/drive/and/folder/"
# Music_Name[2]=""
# Music_Path[2]="/media/path/to/your/drive/and/folder/"
# Music_Name[3]=""
# Music_Path[3]="/media/path/to/your/drive/and/folder/"
# Music_Name[4]=""
# Music_Path[4]="/media/path/to/your/drive/and/folder/"
# Music_Name[5]=""
# Music_Path[5]="/media/path/to/your/drive/and/folder/"
# Music_Name[6]=""
# Music_Path[6]="/media/path/to/your/drive/and/folder/"
# Music_Name[7]=""
# Music_Path[7]="/media/path/to/your/drive/and/folder/"
# Music_Name[8]=""
# Music_Path[8]="/media/path/to/your/drive/and/folder/"
# Music_Name[9]=""
# Music_Path[9]="/media/path/to/your/drive/and/folder/"
# Music_Name[10]=""
# Music_Path[10]="/media/path/to/your/drive/and/folder/"
# Music_Name[11]=""
# Music_Path[11]="/media/path/to/your/drive/and/folder/"
# Music_Name[12]=""
# Music_Path[12]="/media/path/to/your/drive/and/folder/"
# Music_Name[13]=""
# Music_Path[13]="/media/path/to/your/drive/and/folder/"
# Music_Name[14]=""
# Music_Path[14]="/media/path/to/your/drive/and/folder/"
# Music_Name[15]=""
# Music_Path[15]="/media/path/to/your/drive/and/folder/"
# Mixed Music
Mixed_Count=2
Mixed_Name[0]="My Music Library (on PC)"
Mixed_Path[0]="$HOME/Music/"
Mixed_Name[1]="My Music Library (on external hard drive)"
Mixed_Path[1]="/media/path/to/your/drive/and/folder/"
DisplayMenu()
{
echo -en $white
clear
echo -en $white
echo "Music Shuffle Script"
echo -en $red
echo "================="
echo
for ((cnt=0 ; cnt&amp;lt;=Music_Count-1 ; cnt++))
do
if [ $cnt -lt 10 ]
then
echo -en $cyan
echo -n "("
echo -en $blue
echo -n $cnt
echo -en $cyan
echo -n ") "
echo -en $white
echo ${Music_Name[cnt]}
else
echo -en $cyan
echo -n "("
echo -en $blue
echo -n $cnt
echo -en $cyan
echo -n ") "
echo -en $white
echo ${Music_Name[cnt]}
fi
done
if [ $Music_Count -lt 10 ]
then
echo -en $cyan
echo -n "("
echo -en $blue
echo -n $Music_Count
echo -en $cyan
echo -n ") "
echo -en $white
echo "Mixed Music"
else
echo -en $cyan
echo -n "("
echo -en $blue
echo -n $Music_Count
echo -en $cyan
echo -n ") "
echo -en $white
echo "Mixed Music"
fi
let "Music_Count += 1"
if [ $Music_Count -lt 10 ]
then
echo -en $cyan
echo -n "("
echo -en $blue
echo -n $Music_Count
echo -en $cyan
echo -n ") "
echo -en $white
echo "Display Mixed Music"
else
echo -en $cyan
echo -n "("
echo -en $blue
echo -n $Music_Count
echo -en $cyan
echo -n ") "
echo -en $white
echo "Display Mixed Music"
fi
let "Music_Count -= 1"
echo
echo -n "Make A Selection :"
}
DisplayMixedMusic()
{
echo
for ((cnt=0 ; cnt&amp;lt;=Mixed_Count-1 ; cnt++))
do
echo -en $white
echo ${Mixed_Name[cnt]}
done
echo
}
ShuffleEpisode()
{
cd /
find "${Music_Path[$1]}" &amp;gt; "$DestPath${Music_Name[$1]}.plist"
mplayer -playlist "$DestPath${Music_Name[$1]}.plist" -shuffle
}
MixedMusic()
{
echo "" &amp;gt; $MixedDestPath
cd /
for ((cnt=0 ; cnt&amp;lt;=Mixed_Count-1 ; cnt++))
do
find "${Mixed_Path[$cnt]}" &amp;gt; "$DestPath${Mixed_Name[$cnt]}.plist"
echo "" &amp;gt; $MixedDestPath"_cat"
cat "$DestPath${Mixed_Name[$cnt]}.plist" $MixedDestPath &amp;gt; $MixedDestPath"_cat"
rm $MixedDestPath
mv $MixedDestPath"_cat" $MixedDestPath
done
mplayer -playlist $MixedDestPath -shuffle
}
DisplayMenu
read input
if [ $input -eq $Music_Count ]
then
MixedMusic
fi
let "Music_Count += 1"
if [ $input -eq $Music_Count ]
then
DisplayMixedMusic
fi
let "Music_Count -= 1"
if [ $input -lt $Music_Count ]
then
ShuffleEpisode $input
fi
fi
# Loop through the list (from either Nautilus or the command line)
for ARCHIVE_FULLPATH in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
NEWDIRNAME=${ARCHIVE_FULLPATH%.*}
FILENAME=${ARCHIVE_FULLPATH##*/}
NAME=${ARCHIVE_FULLPATH##*/.*}
# open a terminal window and run the important stuff
tty -s; if [ $? -ne 0 ] ; then gnome-terminal -e "$0"; exit; fi
mplayer -loop 0 -quiet -shuffle -playlist &amp;lt;(find -L $ARCHIVE_FULLPATH -type f | egrep -i '(\.mp3|\.wav|\.flac|\.ogg|\.m4a|\.aac|\.mpa|\.mid|\.aif|\.iff|\.m3u|\.ra)')
done</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
stty -echo
tput civis
clear
cat - &lt;&lt; EOF
SPACE
LEFT: a
RIGHT: l
FIRE: f
QUIT: q
Press any key.
EOF
read -s -n 1
row0=( 0 30 30 30 30 30 30 30 30 )
row1=( 0 20 20 20 20 20 20 20 20 )
row2=( 0 15 15 15 15 15 15 15 15 )
row3=( 0 10 10 10 10 10 10 10 10 )
row4=( 0 5 5 5 5 5 5 5 5 )
row5=( 0 1 1 1 1 1 1 1 1 )
aliens1=( '\033[1;32m|0|\033[0m' '\033[1;34m\-/\033[0m'
'\033[1;35m:x:\033[0m' '\033[1;38m:#:\033[0m'
'\033[1;33m!|!\033[0m' '\033[1;39m:-:\033[0m' )
aliens2=( '\033[1;32m:0:\033[0m' '\033[1;34m/-\\\033[0m'
'\033[1;35m-x-\033[0m' '\033[1;38m-#-\033[0m'
'\033[1;33m:|:\033[0m' '\033[1;39m-:-\033[0m' )
score=0
# farthest right that the *leftmost* alien can go to
MAXRIGHT=46
# furthest right that the ship can go to
FARRIGHT=73
# Ship's current position (x-axis)
ship=30
# Cannon column; remains the same even if ship moves
cannonX=$ship
# Cannon height; 0 means it's ready to fire
cannonY=0
# Positive direction to right, Negative to left
direction=1
offset=20
bottom=20
ceiling=4
MAXCEILING=6
DELAY=0.4
drawrow()
{
# draw a row of aliens; return the index of any alien killed
# note that only one alien can be killed at any time.
alientype=$1
shift
let row="$alientype * 2 + $ceiling"
aliensonrow=`echo $@ | tr ' ' '+' | bc`
if [ $aliensonrow -eq 0 ]; then
# Nothing to do here. In particular, do not detect failure.
# Just clear the previous line (it may contain the final explosion
# on that row) and return.
tput cup $row 0
printf "%80s" " "
return 0
fi
if [ $row -eq $bottom ]; then
tput cup `expr $bottom - 4` 6
trap exit ALRM
clear
echo "YOU LOSE"
sleep $DELAY
stty echo
tput cnorm
exit 1
fi
declare -a thisrow
thisrow=( `echo $@` )
tput cup 0 0
printf "Score: %-80d" $score
killed=0
# Clear the previous line
tput cup `expr $row - 1` 0
printf "%80s" " "
tput cup $row 0
printf "%80s" " "
tput cup $row 0
printf "%-${offset}s"
# Don't do this calculation in the for loop, it is slow even without expr
if (( $offset % 2 == 0 )); then
thisalien=${aliens1[$alientype]}
else
thisalien=${aliens2[$alientype]}
fi
# there are 8 aliens per row.
for i in `seq 1 8`
do
value=${thisrow[$i]}
avatar=$thisalien
if [ $value -gt 0 ]; then
# detect and mark a collision
if [ $row -eq $cannonY ]; then
let LEFT="$i * 4 + $offset - 4"
let RIGHT="$i * 4 + $offset - 1"
if [ $cannonX -ge $LEFT ] &amp;&amp; [ $cannonX -le $RIGHT ]; then
killed=$i
avatar='\033[1;31m***\033[0m'
((score=$score + $value))
cannonY=0
fi
fi
fi
if [ $value -eq 0 ]; then
printf " "
else
echo -en "${avatar} "
fi
done
return $killed
}
drawcannon()
{
# move the cannon up one
if [ $cannonY -eq 0 ]; then
# fell off the top of the screen
return
fi
tput cup $cannonY $cannonX
printf " "
((cannonY=cannonY-1))
tput cup $cannonY $cannonX
echo -en "\033[1;31m*\033[0m"
}
drawship()
{
tput cup $bottom 0
printf "%80s" " "
tput cup $bottom $ship
# Show cannon state by its color in the spaceship
if [ $cannonY -eq 0 ]; then
col=31
else
col=30
fi
echo -en "|--\033[1;${col}m*\033[0m--|"
}
move()
{
# shift aliens left or right
# move cannon, check for collision
(sleep $DELAY &amp;&amp; kill -ALRM $$) &amp;
# Change direction if hit the side of the screen
if [ $offset -gt $MAXRIGHT ] &amp;&amp; [ $direction -eq 1 ]; then
# speed up if hit the right side of the screen
DELAY=`echo $DELAY \* 0.90 | bc`
direction=-1
((ceiling++))
elif [ $offset -eq 0 ] &amp;&amp; [ $direction -eq -1 ]; then
direction=1
fi
((offset=offset+direction))
drawrow 0 ${row0[@]}
row0[$?]=0
drawrow 1 ${row1[@]}
row1[$?]=0
drawrow 2 ${row2[@]}
row2[$?]=0
drawrow 3 ${row3[@]}
row3[$?]=0
drawrow 4 ${row4[@]}
row4[$?]=0
drawrow 5 ${row5[@]}
row5[$?]=0
aliensleft=`echo ${row0[@]} ${row1[@]} ${row2[@]} ${row3[@]}\
${row4[@]} ${row5[@]} \
| tr ' ' '+' | bc`
if [ $aliensleft -eq 0 ]; then
tput cup 5 5
trap exit ALRM
echo "YOU WIN"
sleep $DELAY
#tput echo
tput cnorm
echo; echo; echo
exit 0
fi
drawcannon
drawship
}
trap move ALRM
clear
drawship
# Start the aliens moving...
move
while :
do
read -s -n 1 key
case "$key" in
a)
[ $ship -gt 0 ] &amp;&amp; ((ship=ship-1))
drawship
;;
l)
[ $ship -lt $FARRIGHT ] &amp;&amp; ((ship=ship+1))
drawship
;;
f)
if [ $cannonY -eq 0 ]; then
let cannonX="$ship + 3"
cannonY=$bottom
fi
;;
q)
clear
echo "Goodbye!"
tput cnorm
stty echo
trap exit ALRM
sleep $DELAY
exit 0
;;
esac
done
</pre>
<pre class="brush:plain">
Permisos: chmod 700 space.bash &lt;/br&gt;
Ejecución: ./space.bash &lt;/br&gt;
Movimientos del juego
LEFT: a &lt;/br&gt;
RIGHT: l &lt;/br&gt;
FIRE: f &lt;/br&gt;
QUIT: q &lt;/br&gt;
</pre>
<pre class="brush:plain"> Para el mejor uso de los estilos =) Snifer creo esta plantilla prederminada este puede ser usado como gusto plain</pre>
<hr/><pre class="brush:bash">$ python GeekScrypting.py</pre>
<hr/><pre class="brush:bash">#!/bin/sh
#
# W.H. Kalpa Pathum &lt;[email protected]&gt;
# 1st June, 2010
#
# Dropbox directory
DROPBOX_DIR="$HOME/Dropbox/"
# creates a temporary file
file_list=$(mktemp)
# writes the URIs of the selected file to the temp file
echo $NAUTILUS_SCRIPT_SELECTED_URIS | sed 's/ \//\n/g' &amp;gt; $file_list
# iterete through the file list
for file in $(cat $file_list)
do
# extract the last filed from the URI, that is the file name
filename="$(echo $file | awk -F'/' '{print $NF}' | sed 's/%20/ /g')"
# creates the symbolic link
ln -s "$(pwd)/$filename" "$DROPBOX_DIR$filename"
# sets the emblem
gvfs-set-attribute -t stringv "$filename" metadata::emblems default
done
exit 0&lt;/[email protected]&gt;</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
if [ $# -eq 0 ]
then
echo "¿Y el link?"
echo "Uso: $0 [ URL del vídeo ]"
exit 1
fi
url=$1
regexp='(https?\:\/\/([a-zA-Z0-9]+(\.[a-zA-Z0-9]+)*)(\/\w+)+)'
if [[ $1 =~ $regexp ]]; then
ifyoutubedl=`type -p youtube-dl`
if [ -z $ifyoutubedl ]; then
echo -e "\n\nyoutube-dl necesita estar instalado\n"
exit 1
else
youtube-dl -t --extract-audio --audio-format mp3 $1
echo "Sonido extraído"
ls | grep *.mp3
exit 0
fi
else
echo "No es una URL"
exit 1
fi
exit 0
</pre>
<pre class="brush:plain">Permisos: chmod 700 Youtube2mp3.bash
Ejecución ./Youtube2Mp3.bash. [ URL del vídeo ]
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# Sat Jul 12 16:52:30 EDT 2003
# NAME: ttt
# Copyright 2003, Chris F.A. Johnson
# Released under the terms of the GNU General Public License
ESC=$'\e'
tictactoe() {
[ $verbose -ge 1 ] &amp;&amp; echo tictactoe $* &gt;&amp;2
board=`printf "%9.9s" " "`
mvnum=1
remainder=" 1 2 3 4 5 6 7 8 9 "
show "$board"
while :
do
status
eval \$player$P
[ $? -ne 0 ] &amp;&amp; return
put $_MOVE "$board"
board=$_PUT
# show "$board"
mkbold "$_MOVE"
printat 0 0 $mvnum
printat $prompt
sleep $pause &amp;
mlist="$mlist $_MOVE"
remainder=${remainder/ $_MOVE / }
checkboard "$board" &amp;&amp; {
mkbold $win
printat $prompt "$cle"
eval winner \$player$P
return
}
[ $mvnum -eq 9 ] &amp;&amp; {
B=$U mkbold "$_MOVE"
winner "Neither player"
return
}
wait
B=$U mkbold "$_MOVE"
if [ $P = O ]
then
P=X
OP=O
else
P=O
OP=X
fi
mvnum=$(( $mvnum + 1 ))
done
}
winner() {
[ $verbose -ge 1 ] &amp;&amp; echo winner $* &gt;&amp;2
printat $prompt "$cle $* wins\n\n"
}
status() {
[ $verbose -ge 1 ] &amp;&amp; echo status $* &gt;&amp;2
if [ $verbose -ge 1 ]
then
printat 4 0
printf "${cle}Move: %s Player: %s Board: \"%s\" Last move: %s Move list: %s" \
"$mvnum" "$P" "${board// /-}" "$_MOVE" "$mlist"
else
false
fi
}
show() {
[ $verbose -ge 1 ] &amp;&amp; echo show $* &gt;&amp;2
printat 0 0 $mvnum
printat 0 $top ##$(( ($LINES - 5) / 2 ))
printf " %${margin}.${margin}s | %1s | %1s\n" "${1:0:1}" "${1:1:1}" "${1:2:1}"
printf "%${margin}.${margin}s---+---+---\n" " "
printf " %${margin}.${margin}s | %1s | %1s\n" "${1:3:1}" "${1:4:1}" "${1:5:1}"
printf "%${margin}.${margin}s---+---+---\n" " "
printf " %${margin}.${margin}s | %1s | %1s\n" "${1:6:1}" "${1:7:1}" "${1:8:1}"
}
put() {
[ $verbose -ge 1 ] &amp;&amp; echo put $1 \""$2"\" &gt;&amp;2
local n=$(( $1 - 1 ))
_PUT=${2:-$board}
[ "${_PUT:$n:1}" = " " ] &amp;&amp;
_PUT=${_PUT:0:$n}$P${_PUT:$1}
}
checkboard() {
[ $verbose -ge 1 ] &amp;&amp; echo checkboard \"$*\" &gt;&amp;2
case $1 in
$P??$P??$P??) win="1 4 7" ;;
?$P??$P??$P?) win="2 5 8" ;;
??$P??$P??$P) win="3 6 9" ;;
??$P?$P?$P??) win="3 5 7" ;;
$P???$P???$P) win="1 5 9" ;;
$P$P$P??????) win="1 2 3" ;;
???$P$P$P???) win="4 5 6" ;;
??????$P$P$P) win="7 8 9" ;;
*) false ;;
esac
}
mkbold() {
[ $verbose -ge 1 ] &amp;&amp; echo mkbold $* &gt;&amp;2
for sq in $*
do
row=$(( ($sq - 1) / 3 ))
col=$(( ($sq - 1) % 3 + 1 ))
printat $(( ($col * 4) + $margin - 2 )) $(( ($row * 2) + $top ))
printf "${B}$P${U}"
done
}
human() {
[ $verbose -ge 1 ] &amp;&amp; echo human $* &gt;&amp;2
while :
do
key "Select ($remainder)"
# case $_MOVE in
# "$ESC") read -sn1; read -sn1 kp; continue ;;
# esac
_MOVE=$_KEY
case $_MOVE in
1|2|3|4|5|6|7|8|9) [ "${board:_MOVE-1:1}" = " " ] &amp;&amp; break ;;
q|Q|x|X) echo; return 5 ;;
p) printat $prompt
KEYECHO= KEYMAX=$(( $COLUMNS - 10 )) key "Enter delay in seconds"
pause=$_KEY
;;
"") set -- $remainder
_MOVE=$1
[ $verbose -ge 1 ] &amp;&amp; echo "|$_MOVE|" &gt;&amp;2
break ;;
*) printat $prompt
printf "\r%s%s\r" " "$cle" $_MOVE: Invalid move"
sleep 1
printf "%s\r" "$cle" ;;
esac
done
}
randy() {
[ $verbose -ge 1 ] &amp;&amp; echo randy $* &gt;&amp;2
randstr $remainder
_MOVE=$_RANDSTR
}
key() {
[ $verbose -ge 1 ] &amp;&amp; echo key $* &gt;&amp;2
printat $prompt "$cle$CVIS$beep"
read -${KEYECHO}n$KEYMAX -p "${1:-PAK}: " _KEY 2&gt;&amp;1
printf "$CINV"
}
getkey() {
local OKchars=${1:-${remainder// /}}
local kp2 kp3
stty -echo
while :
do
prompt="==&gt;"
prompt
IFS= read -r -sn1 -p " " kp 2&gt;&amp;1 || exit 2 #cleanup
case $OKchars in
*"$kp"*)
case $kp in
$ESC)
read -st1 -n1 kp2
case $kp2 in
\[) read -st1 -n1 kp3
case $kp3 in
A) kp=$UP; break ;;
B) kp=$DN; break ;;
C) kp=$RT; break ;;
D) kp=$LF; break ;;
esac
;;
esac
;;
*) break ;;
esac
;;
esac
done
_KEY=$kp
}
randstr() {
[ $verbose -ge 1 ] &amp;&amp; echo randstr $* &gt;&amp;2
# [ -n "$1" ] || return 1
n=$(( ($RANDOM % $#) + 1 ))
eval _RANDSTR=\${$n}
}
isblock() {
[ $verbose -ge 1 ] &amp;&amp; echo isblock $* &gt;&amp;2
win=
block=
for _MOVE in $remainder
do
P=$OP put $_MOVE
P=$OP checkboard "$_PUT" &amp;&amp; return
done
_MOVE=
}
block() {
[ $verbose -ge 1 ] &amp;&amp; echo block $* &gt;&amp;2
block=
for _MOVE in $remainder
do
put $_MOVE
checkboard "$_PUT" &amp;&amp; return
P=$OP put $_MOVE
P=$OP checkboard "$_PUT" &amp;&amp; block=$_MOVE
done
[ "$block" ] &amp;&amp; { _MOVE=$block; return; }
randy
}
computer() {
[ $verbose -ge 1 ] &amp;&amp; echo computer $* &gt;&amp;2
local r c
case $mvnum in
1) randstr 1 3 7 9
_MOVE=$_RANDSTR ;;
2)
if [ "${board:4:1}" = " " ]
then
_MOVE=5
else
randstr 1 3 7 9
_MOVE=$_RANDSTR
fi
;;
3) r=${mlist// /}
c='1 3 7 9'
randstr ${c//[$r]/}
# randstr ${remainder//[$r]/}
_MOVE=$_RANDSTR
;;
4)
isblock
[ "$_MOVE" ] &amp;&amp; return
r=${mlist// /}
c='2 4 6 8'
randstr ${remainder//[$r]/}
_MOVE=$_RANDSTR
;;
*) block ;;
esac
}
printat() { #== print arguments 3-... at Y=$2 X=$1
[ $verbose -ge 1 ] &amp;&amp; echo printat $* &gt;&amp;2
[ $# -lt 2 ] &amp;&amp; return 1
local y=$2
local x=$1
shift 2
msg="$*"
printf "\e[%d;%dH%b" $y $x "$msg"
}
version()
{
echo " $progname, version $version
Copyright $copyright, $author $email
This is free software, released under the terms of the GNU General
Public License. There is NO warranty; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.
"
}
usage()
{
echo "
${B}NAME${U}: $progname - Tic-Tac-Toe
${B}USAGE${U}: $progname [OPTIONS]
${B}OPTIONS${U}:
-x player1 - specify first player
-o player2 - specify second player
-c player1,player2 - specify both players
-p seconds - time to pause between moves
-h, --help - help: print this message
-H, --help_long - help: print more detailed message (if available)
-v, --verbose - sends messsages to \$HOME/tttlog
-V, --version - print version information
Copyright 2003, Chris F.A. Johnson
"
}
verbose=0
longusage=0
version="1.0"
copyright=2003
author="Chris F.A. Johnson"
progname=${0##*/}
P=X
OP=O
playerX=human
playerO=computer
co=
li=
if tput ce &gt;/dev/null 2&gt;&amp;1
then ## e.g. FreeBSD
co=co
li=li
elif tput el 2&gt;/dev/null
then ## e.g. Linux
co=cols
li=lines
fi
UNBOLD=$'\E[0m'
standout=$'\E[0;1;7m'
cle=$'\E[K'
clb=$'\E[1K'
ULINE=$'\E[0;4m'
REVERSE=$'\E[0;7m'
BLINK=$'\E[0;5m'
BOLD=$'\E[0;1m'
CINV=$'\E[0;8m'
R=$REVERSE
U=$UNBOLD
B=$BOLD
BR=$B$R
Cl=$'\f'
if [ "$co" ]
then
tput reset
COLUMNS=${COLUMNS:=`tput $co`}
else
COLUMNS=${COLUMNS:-80}
fi
top=6
margin=11
prompt="3 $(( $top + 9 ))"
beep= #$'\a'
pause=1
KEYMAX=1
KEYECHO=s
while getopts vVhH-:xoX:O:c:p: var
do
case "$var" in
x) playerX=human
playerO-computer
;;
o) playerO=human
playerX=computer
;;
X) playerX=$OPTARG ;;
O) playerO=$OPTARG ;;
c|C) playerO=${OPTARG#*,}
playerX=${OPTARG%,*}
;;
p) pause=$OPTARG ;;
-) case $OPTARG in
help) usage; exit ;;
verbose) verbose=$(( $verbose + 1 )) ;;
version) version; exit ;;
esac
;;
h) usage; exit ;;
H) longusage=1; usage; exit ;;
v) verbose=$(( $verbose + 1 )) ;;
V) version; exit ;;
*);;
esac
done
shift $(( $OPTIND - 1 ))
if [ "$co" ]
then
COLUMNS=`tput $co`
else
COLUMNS=${COLUMNS:-80}
fi
margin=11 ##$(( ($COLUMNS - 11) / 2 ))
clear
if [ $verbose -ge 1 ]
then
exec 2&gt;$HOME/tttlog
set -x
fi
tictactoe
printat $prompt "\n$CVIS\n"
</pre>
<pre class="brush:plain">
Permisos: chmod 700 tt.bash &lt;/br&gt;
Ejecución: ./ttt.bash &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
##############################################################################
# Copyright (c) J.S Unix Consultants Ltd
##############################################################################
# FILE : LINUXexplo
# Last Change Date : 03-18-2012
# Author(s) : Joe Santoro
# Date Started : 15th April, 2004
# Email : linuxexplo [ at ] unix-consultants.com
# Web : http://www.unix-consultants.com/examples/scripts/linux/linux-explorer
#
# Usage : ./LINUXexplo [-d] [-v] [-g] [-s] [-h] [-V]
#
# Purpose : This script is a Linux version of the Solaris explorer
# (SUNWexplo) script.
#
# Used to collect information about a linux system build for remote
# support supposes.
# This script is a general purpose script for ALL linux
# systems and therefore NOT tied into any one distro.
#
#############################################################################
#
# Modified by Facundo M. de la Cruz [ [email protected] ]
#
#############################################################################
#
# Changelog (bug fixes and new features):
#
# - SELiunx support improved by FMDLC - 03182012
# - Systemd support added by FMDLC - 03182012
# - Added contact form by FMDLC - 03182012
# - Added ARP gathering info by FMDLC - 03182012
# - Added kickstart copy by FMDLC - 03182012
# - GPG support added by FMDLC - 03182012
# - Improved release copy by FMDLC - 03182012
# - Improved YUM support by FMDLC - 03182012
# - Improved resolv.conf copy by FMDLC- 03182012
# - Added README file by FMDLC - 03252012
# - Added DM discovery by FMDLC - 04062012
# - Added netstat -in by FMDLC - 04062012
# - Improved dmsetup support by FMDLC - 04102012
# - Fixed vmstat bug by FMDLC - 04102012
#
##############################################################################
#
# J.S UNIX CONSULTANTS LTD MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
# SUITABILITY OF THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE, OR NON-INFRINGEMENT. J.S UNIX CONSULTANTS LTD SHALL
# NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
# MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
#
##############################################################################
COPYRIGHT="Copyright (c) J.S Unix Consultants Ltd"
MYVERSION="0.108"
MYDATE="$(/bin/date +'%Y.%m.%d.%m.%H.%M')" # Date and time now
MYNAME=$(basename $0)
WHOAMI=$(/usr/bin/whoami) # The user running the script
HOSTID=$(/usr/bin/hostid) # The Hostid of this server
MYHOSTNAME=$(/bin/uname -n) # The hostname of this server
MYSHORTNAME=$(echo $MYHOSTNAME | cut -f 1 -d'.')
TMPFILE="/tmp/$(basename $0).$$" # Tempory File
TOPDIR="/opt/LINUXexplo" # Top level output directory
VERBOSE=1 # Set to see the scripts progress used
# only if connected to a terminal session.
FULLSOFT=0 # Set to Verify Software installation
# this takes a very long time
GPG_ID="57260789" # GPG/PGP Public key ID. Set to encrypt and
# sing the tarball.
SUPPORT="[email protected]" # Support email
#
# Ensure that we are the root user
#
[ ${UID} != 0 ] &amp;&amp; echo "You must be root to run this program." &amp;&amp; exit 1
#
# Set the path for the script to run.
#
PATH=/bin:/usr/sbin:/sbin:/usr/sbin:/usr/local/bin:$PATH
if [ -d /opt/VRTSvcs/bin ] ; then
PATH=$PATH:/opt/VRTSvcs/bin
fi
export PATH
# Remove any temporary files we create
trap '$RM -f $TMPFILE &gt;/dev/null 2&gt;&amp;1; exit' 0 1 2 3 15
##############################################################################
#
# Function : Usage
#
# Notes : N/A
#
##############################################################################
function ShowUsage
{
#-------------------------------------------------------------------
# Show help message
#-------------------------------------------------------------------
echo
echo "$MYNAME Version $MYVERSION - $COPYRIGHT "
echo
echo " usage: $MYNAME [option] "
echo
echo " -d Target directory for explorer files"
echo " -g GPG support"
echo " -v Verbose output"
echo " -s Verify Package Installation"
echo " -h This help message"
echo " -V Version Number of LINUXexplo"
echo
exit 0
}
##############################################################################
#
# Function : Echo
#
# Parameters : String to display what function is about to run
#
# Output : Print what section we are about to collect data for
#
# Notes : N/A
#
##############################################################################
function Echo ()
{
if [ -t 0 ] ; then
if [ ${VERBOSE} -ne 0 ] ; then
echo "$*"
fi
if [ ${VERBOSE} -gt 1 ] ; then
echo "Press Return to Continue.........."
read A
fi
fi
}
##############################################################################
#
# Function : mywhich
#
# Parameters : name of program
#
# Output : path of executable
#
# Notes : Return back the location of the executable
# I need this as not all linux distros have the files
# in the same location.
#
##############################################################################
function mywhich ()
{
local command=$1
local mypath=$(which $command 2&gt;/dev/null)
if [ "$mypath" = "" ] ; then
# echo "Command $command not found" &gt;&gt; $NOTFNDLOG 2&gt; /dev/null
echo "NOT_FOUND"
elif [ ! -x "$mypath" ] ; then
echo "Command $command not executable" &gt;&gt; $NOTFNDLOG 2&gt; /dev/null
echo "NOT_FOUND"
else
echo "$mypath"
fi
}
##############################################################################
#
# Function : findCmds
#
# Parameters : None
#
# Output : None
#
# Notes : Goes and find each of the commands I want to use and
# stores the information into the various variables which
# is the uppercase version of the command itself.
#
# I need this as not all linux distros have the files
# in the same location.
#
##############################################################################
function findCmds
{
# Standard commands
AWK=$(mywhich awk )
BASENAME=$(mywhich basename )
CAT=$(mywhich cat )
CHKCONFIG=$(mywhich chkconfig )
CP=$(mywhich cp )
CUT=$(mywhich cut )
CHMOD=$(mywhich chmod )
DATE=$(mywhich date )
DF=$(mywhich df )
DMESG=$(mywhich dmesg )
ECHO=$(mywhich echo )
FILE=$(mywhich file )
FIND=$(mywhich find )
FREE=$(mywhich free )
GREP=$(mywhich grep )
EGREP=$(mywhich egrep )
LS=$(mywhich ls )
MKDIR=$(mywhich mkdir )
LAST=$(mywhich last )
LOCALE=$(mywhich locale )
PSTREE=$(mywhich pstree )
PS=$(mywhich ps )
RM=$(mywhich rm )
SLEEP=$(mywhich sleep )
MOUNT=$(mywhich mount )
MV=$(mywhich mv )
SORT=$(mywhich sort )
LN=$(mywhich ln )
SYSTEMCTL=$(mywhich systemctl )
TAIL=$(mywhich tail )
UNAME=$(mywhich uname )
UPTIME=$(mywhich uptime )
WHO=$(mywhich who )
ZIP=$(mywhich zip )
GZIP=$(mywhich gzip )
GAWK=$(mywhich gawk )
SED=$(mywhich sed )
GUNZIP=$(mywhich gunzip )
# Selinux
SESTATUS=$(mywhich sestatus )
GETSEBOOL=$(mywhich getsebool )
SEMANAGE=$(mywhich semanage )
# Systemd
SYSTEMD=$(mywhich systemd )
SYSTEMCTL=$(mywhich systemctl )
SYSTEMDCGLS=$(mywhich systemd-cgls )
SYSTEMDLOGINCTL=$(mywhich systemd-loginctl)
# GPG
GPG_BIN=$(mywhich gpg)
# Samba
TESTPARM=$(mywhich testparm )
WBINFO=$(mywhich wbinfo )
# Apache
APACHECTL=$(mywhich apachectl )
APACHE2CTL=$(mywhich apache2ctl )
# Packages
APTCONFIG=$(mywhich apt-config )
RPM=$(mywhich rpm )
ZYPPER=$(mywhich zypper )
DPKG=$(mywhich dpkg )
DPKG_QUERY=$(mywhich dpkg-query )
EMERGE=$(mywhich emerge )
YUM=$(mywhich yum )
# Kernel Info
MODINFO=$(mywhich modinfo )
SYSCTL=$(mywhich sysctl )
KSYMS=$(mywhich ksyms )
# H/W Info
ACPI=$(mywhich acpi )
CARDCTL=$(mywhich cardclt )
DUMPE2FS=$(mywhich dumpe2fs )
DMIDECODE=$(mywhich dmidecode )
FDISK=$(mywhich fdisk )
BLKID=$(mywhich blkid )
HDPARM=$(mywhich hdparm )
HOSTNAME=$(mywhich hostname )
HWINFO=$(mywhich hwinfo )
HWCLOCK=$(mywhich hwclock )
LSMOD=$(mywhich lsmod )
LSPCI=$(mywhich lspci )
LSPNP=$(mywhich lspnp )
IPVSADM=$(mywhich ipvsadm )
LSUSB=$(mywhich lsusb )
LSDEV=$(mywhich lsdev )
LSHAL=$(mywhich lshal )
LSRAID=$(mywhich lsraid )
MDADM=$(mywhich mdadm )
PROCINFO=$(mywhich procinfo )
POWERMT=$(mywhich powermt )
SMARTCTL=$(mywhich smartclt )
SFDISK=$(mywhich sfdisk )
HWPARM=$(mywhich hwparm )
SCSI_ID=$(mywhich scsi_id )
ISCSIADM=$(mywhich iscsiadm )
MULTIPATH=$(mywhich multipath )
DMSETUP=$(mywhich dmsetup )
NTPQ=$(mywhich ntpq )
SYSP=$(mywhich sysp )
_3DDIAG=$(mywhich 3Ddiag )
LSHW=$(mywhich lshw )
SYSTOOL=$(mywhich systool )
SWAPON=$(mywhich swapon )
# Disks
LVM=$(mywhich lvm )
LVDISPLAY=$(mywhich lvdisplay )
VGS=$(mywhich vgs )
PVSCAN=$(mywhich pvs )
VGSCAN=$(mywhich vgscan )
VGDISPLAY=$(mywhich vgdisplay )
LVMDISKSCAN=$(mywhich lvmdiskscan )
PVSCAN=$(mywhich pvscan )
DEBUGREISERFS=$(mywhich debugreiserfs )
HDPARM=$(mywhich hdparm )
EXPORTFS=$(mywhich exportfs )
REPQUOTA=$(mywhich repquota )
TUNE2FS=$(mywhich tune2fs )
# Veritas FS
PVDISPLAY=$(mywhich pvdisplay )
VXDG=$(mywhich vxdg )
VXDISK=$(mywhich vxdisk )
VXPRINT=$(mywhich vxprint )
VXLICREP=$(mywhich vxlicrep )
# Veritas Cluster
HASTATUS=$(mywhich hastatus )
HARES=$(mywhich hares )
HAGRP=$(mywhich hagrp )
HATYPE=$(mywhich hatype )
HAUSER=$(mywhich hauser )
LLTSTAT=$(mywhich lltstat )
GABCONFIG=$(mywhich gabconfig )
HACF=$(mywhich hacf )
# Redhat Cluster
CLUSTAT=$(mywhich clustat )
CLUSVCADM=$(mywhich clusvcadm )
MKQDISK=$(mywhich mkqdisk )
# CRM Cluster
CRM=$(mywhich crm )
CRM_MON=$(mywhich crm_mon )
CRM_VERIFY=$(mywhich crm_verify)
CIBADMIN=$(mywhich cibadmin )
# Network
IFCONFIG=$(mywhich ifconfig )
IWCONFIG=$(mywhich iwconfig )
NETSTAT=$(mywhich netstat )
NFSSTAT=$(mywhich nfsstat )
ROUTE=$(mywhich route )
YPWHICH=$(mywhich ypwhich )
IP=$(mywhich ip )
ARP=$(mywhich arp )
MIITOOL=$(mywhich mii-tool )
IPTABLES=$(mywhich iptables )
IPCHAINS=$(mywhich ipchains )
ETHTOOL=$(mywhich ethtool )
BRCTL=$(mywhich brctl )
# Tuning
IOSTAT=$(mywhich iostat )
VMSTAT=$(mywhich vmstat )
IPCS=$(mywhich ipcs )
MODPROBE=$(mywhich modprobe )
DEPMOD=$(mywhich depmod )
# Other
RUNLEVEL=$(mywhich runlevel )
LSOF=$(mywhich lsof )
LPQ=$(mywhich lpq )
TAR=$(mywhich tar )
XVINFO=$(mywhich xvinfo )
POSTCONF=$(mywhich postconf )
# Virtual Server
XM=$(mywhich xm )
VIRSH=$(mywhich virsh )
# Gentoo
RC_UPDATE=$(mywhich rc-update)
}
##############################################################################
# Get the command line options
##############################################################################
while getopts "d:vhgV" OPT
do
case "$OPT" in
d) if [ $OPTARG = "/" ] ; then
echo "ERROR: root directory selected as target! "
echo "Exiting."
exit 1
elif [ $OPTARG != "" ] ; then
TOPDIR=${OPTARG%%/}
fi
;;
g)
GPG=1
;;
v) VERBOSE=1
;;
s) FULLSOFT=1
;;
h) ShowUsage
;;
V) echo
echo "LINUXexplo Version : $MYVERSION"
echo
exit 0
;;
esac
done
##############################################################################
# MAIN
##############################################################################
# Go away and find ALL my commands for this script
findCmds
if [[ ${GPG} -eq 1 ]] &amp;&amp; [ ! -x ${GPG_BIN} ]; then
echo "Sorry your system doesn't have GPG support. Install it before."
exit 1
fi
LOGTOP="${TOPDIR}/linux"
LOGDIR="${LOGTOP}/explorer.${HOSTID}.${MYSHORTNAME}-${MYDATE}"
TARFILE="${LOGDIR}.tgz"
NOTFNDLOG="${LOGDIR}/command_not_found.out"
if [ ! -d $LOGDIR ] ; then
/bin/mkdir -p $LOGDIR
fi
echo
echo "$MYNAME - $MYVERSION"
echo
echo "This program will gather system information and can take several"
echo "minutes to finish."
echo
echo "You must complete some questions before start."
echo "It will produce a .tgz or .tgz.gpg file output and a directory"
echo "on your /opt/LINUXexplo/linux/ directory".
echo
echo "Please follow the support instruction for submit this information"
echo "For contact the support please send a email to &lt;$SUPPORT&gt;"
echo
echo "**********************************************************************"
echo "Personal information"
echo "**********************************************************************"
read -p "Company: " COMPANY
read -p "Your name: " NAME
read -p "Email: " EMAIL
read -p "Telephone: " TELEPHONE
read -p "Movil: " MOVIL
read -p "City: " CITY
read -p "Zipcode: " ZIPCODE
read -p "Country: " COUNTRY
echo
echo "**********************************************************************"
echo "System information"
echo "**********************************************************************"
read -p "Server type (physical/virtual): " SERVER
read -p "Linux distribution: " LINUX
read -p "Problem description (small): " PROBLEM
read -p "System description (small): " SYSTEM
read -p "Enviroment (testing/production/workstation): " ENVIROMENT
echo
read -p "Are you sure to continue? (Y/n)" REPLY
if [[ "$REPLY" = [Yy] ]]; then
echo
Echo "Starting support gathering process."
else
Echo "Aborting."
exit 0
fi
echo
cat &lt;&lt; EOF &gt; /tmp/README
-----------------------------------------------------------------------------
$MYNAME - $MYVERSION
-----------------------------------------------------------------------------
This directory contains system configuration information.
Information was gathered on $MYDATE
Contact support made by: $NAME from $COMPANY
-----------------------------------------------------------------------------
CONTACT INFORMATION
-----------------------------------------------------------------------------
Company : $COMPANY
Name : $NAME
Email : $EMAIL
Telephone: $TELEPHONE
Movil : $MOVIL
City : $CITY
Zipcode : $ZIPCODE
Country : $COUNTRY
----------------------------------------------------------------------------
SYSTEM INFORMATION
----------------------------------------------------------------------------
Date : $($DATE "+%Y.%m.%d.%H.%M")
Command Line : $0 $@
Hostname : $MYHOSTNAME
Host Id : $HOSTID
System type : $SERVER
Linux distribution : $LINUX
System platafform : $($UNAME -m)
Kernel Version : $($UNAME -r)
Eviroment : $ENVIROMENT
System description : $SYSTEM
Problem description: $PROBLEM
----------------------------------------------------------------------------
Uptime:
$(${UPTIME})
swapon -s:
$($SWAPON -s | $GREP -v "Filename")
vmstat:
$($VMSTAT -t 2&gt; /dev/null || $VMSTAT 2&gt; /dev/null)
----------------------------------------------------------------------------
EOF
Echo "[*] Creating Explorer Directory: $LOGDIR"
if [ -d "$LOGTOP" ]; then
if [[ "${LOGTOP}" != "/" &amp;&amp; "${LOGTOP}" != "/var" &amp;&amp; "${LOGTOP}" != "/usr" ]]; then
if [ ${VERBOSE} -gt 0 ]; then echo "[*] Removing ${LOGTOP}"; fi
$RM -rf ${LOGTOP}
fi
fi
# make sure this is a linux system
if [ "$($UNAME -s)" != "Linux" ]; then
echo "ERROR: This script is only for Linux systems "
exit 1
fi
# Make the directory I'm going to store my files
if [ ! -d $LOGDIR ]; then
$MKDIR -p $LOGDIR
if [ $? -ne 0 ]; then
echo "ERROR: Creating directory $LOGDIR"
exit 1
else
$CHMOD 750 $LOGDIR
fi
fi
mv /tmp/README ${LOGDIR}/README
echo "$MYVERSION" &gt; ${LOGDIR}/rev
# Create the default directories I'm going to use.
for Dir in etc system disks lp var logs hardware boot clusters virtual
do
if [ ! -d ${LOGDIR}/${Dir} ]; then
$MKDIR -p ${LOGDIR}/${Dir}
if [ $? -ne 0 ]; then
echo "ERROR: Creating directory $LOGDIR"
exit 1
else
$CHMOD 750 ${LOGDIR}/${Dir}
fi
fi
done
##############################################################################
# We need the password file and the group file so that we can work out who
# owns what file.
# Notice we are not copying the shadow file !!
##############################################################################
$CP -p /etc/passwd ${LOGDIR}/etc/passwd
$CP -p /etc/group ${LOGDIR}/etc/group
if [ -f /etc/sudoers ]; then
$CP -p /etc/sudoers ${LOGDIR}/etc/sudoers
fi
##############################################################################
# Release Section
##############################################################################
Echo "[*] Release Section"
if [ -f "/etc/debian_version" ] || [ -f "/etc/redhat-release" ]; then
$CP -p "/etc/debian_version" ${LOGDIR}/system 2&gt; /dev/null || $CP -p /etc/redhat-release ${LOGDIR}/system 2&gt; /dev/null
fi
if [ -f /etc/issue ]; then
$CP -p "/etc/issue" ${LOGDIR}/system/issue
fi
if [ -f /etc/issue.net ]; then
$CP -p "/etc/issue.net" ${LOGDIR}/etc/issue.net
fi
if [ -f /etc/motd ]; then
$CP -p "/etc/motd" ${LOGDIR}/etc/motd
fi
#############################################################################
# Installation kickstart and log copy
#############################################################################
if [ -f "/root/anaconda-ks.cfg" ]; then
$MKDIR -p "${LOGDIR}/Installation"
$CP -p "/root/anaconda-ks.cfg" ${LOGDIR}/Installation/anaconda-ks.cfg
fi
##############################################################################
# Hardware/Proc Section
##############################################################################
Echo "[*] Hardware/Proc Section"
# Collecting information from the proc directory
$MKDIR -p ${LOGDIR}/proc
$FIND /proc -type f -print 2&gt;/dev/null | \
$GREP -v "/proc/kcore" | \
$GREP -v "/proc/bus/usb" | \
$GREP -v "/proc/xen/xenbus" | \
$GREP -v "/proc/acpi/event" | \
$GREP -v "pagemap" | \
$GREP -v "clear_refs" | \
$GREP -v "/proc/kmsg" &gt; $TMPFILE
for i in $($CAT $TMPFILE)
do
Dirname=$(dirname $i)
Filename=$(basename $i)
if [ ! -d ${LOGDIR}${Dirname} ]; then
$MKDIR -p ${LOGDIR}${Dirname}
fi
if [ -e "$i" ] ; then
$CAT "$i" &gt; ${LOGDIR}${Dirname}/${Filename} 2&gt;&amp;1
fi
done
$RM -f $TMPFILE
##############################################################################
# Device Information
##############################################################################
if [ -x $CARDCTL ]; then
$CARDCTL info &gt; ${LOGDIR}/hardware/cardctl-info.out 2&gt;&amp;1
$CARDCTL status &gt; ${LOGDIR}/hardware/cardctl-status.out 2&gt;&amp;1
# $CARDCTL ident&gt; ${LOGDIR}/hardware/cardctl-ident.out 2&gt;&amp;1
fi
if [ -x $LSPCI ]; then
$LSPCI &gt; ${LOGDIR}/hardware/lspci.out 2&gt;&amp;1
$LSPCI -n &gt; ${LOGDIR}/hardware/lspci-n.out 2&gt;&amp;1
$LSPCI | while read line
do
Bus=$(/bin/echo $line 2&gt;/dev/null | awk '{ print $1 }')
$LSPCI -vv -s $Bus &gt; ${LOGDIR}/hardware/lspci_-vv_-s_${Bus}.out 2&gt;&amp;1
done
fi
# Get the port names from the HDA cards
for i in /sys/class/scsi_host/host*/device/fc_host\:host*/port_name
do
if [ -f $i ]; then
name=$( echo $i | sed 's/\//_/g' | sed 's/^_//g')
echo "Port Name : $(cat $i )" &gt;&gt; ${LOGDIR}/hardware/cat_${name}.out
fi
done
# Get a listing of the /dev directory
$MKDIR ${LOGDIR}/dev
$LS -laR /dev &gt; ${LOGDIR}/dev/ls_-laR_dev.out
if [ -x "$LSUSB" ]; then
$LSUSB -xv &gt; ${LOGDIR}/hardware/lsusb_-xv.out 2&gt;&amp;1
$LSUSB -tv &gt; ${LOGDIR}/hardware/lsusb_-tv.out 2&gt;&amp;1
fi
if [ -x "$LSDEV" ]; then
$LSDEV -type adaptor &gt; ${LOGDIR}/hardware/lsdev_-type_adaptor.out 2&gt;&amp;1
fi
if [ -x "$ACPI" ]; then
$ACPI -V &gt; ${LOGDIR}/hardware/acpi-V.out 2&gt;&amp;1
fi
if [ -x $FREE ]; then
$FREE &gt; ${LOGDIR}/hardware/free.out
$FREE -k &gt; ${LOGDIR}/hardware/free_-k.out
fi
$LS -laR /dev &gt; ${LOGDIR}/hardware/ls-laR_dev.out
if [ -d /udev ]; then
$LS -laR /udev &gt; ${LOGDIR}/hardware/ls-laR_udev.out
fi
# Tape information
if [ -f /etc/stinit.def ]; then
$CP -p /etc/stinit.def ${LOGDIR}/etc/stinit.def
fi
# Global Devices list
if [ -x "$LSHAL" ]; then
$LSHAL &gt; ${LOGDIR}/hardware/lshal.out
fi
if [ -x /usr/share/rhn/up2date_client/hardware.py ]; then
/usr/share/rhn/up2date_client/hardware.py &gt; ${LOGDIR}/hardware/hardware.py.out 2&gt;&amp;1
fi
if [ -x "$SMARTCTL" ]; then
for device in $( $LS /dev/hd[a-z] /dev/sd[a-z] /dev/st[0-9] /dev/sg[0-9] 2&gt; /dev/null)
do
name=$( echo $device | sed 's/\//_/g' )
${SMARTCTL} -a $device 2&gt;/dev/null 1&gt; ${LOGDIR}/hardware/smartctl-a_${name}.out
done
fi
##############################################################################
# Collect Hardware information from the hwinfo program if installed
##############################################################################
if [ -x $HWINFO ]; then
$HWINFO &gt; ${LOGDIR}/hardware/hwinfo.out 2&gt;&amp;1
$HWINFO --isapnp &gt; ${LOGDIR}/hardware/hwinfo_--isapnp.out 2&gt;&amp;1
$HWINFO --scsi &gt; ${LOGDIR}/hardware/hwinfo_--scsi.out 2&gt;&amp;1
$HWINFO --framebuffer &gt; ${LOGDIR}/hardware/hwinfo_--framebuffer.out 2&gt;&amp;1
fi
if [ -x "$PROCINFO" ]; then
$PROCINFO &gt; ${LOGDIR}/hardware/procinfo.out 2&gt;&amp;1
fi
if [ -x "$DMIDECODE" ]; then
$DMIDECODE &gt; ${LOGDIR}/hardware/dmidecode.out 2&gt;&amp;1
fi
if [ -x $LSHW ]; then
$LSHW &gt; ${LOGDIR}/hardware/lshw.out 2&gt;&amp;1
fi
##############################################################################
# Boot Section
##############################################################################
Echo "[*] Boot Section"
if [ -x "/sbin/lilo" ]; then
/sbin/lilo -q &gt; $LOGDIR/system/lilo_-q 2&gt;&amp;1
fi
$LS -alR /boot &gt; ${LOGDIR}/system/ls-alR_boot.out 2&gt;&amp;1
$MKDIR -p ${LOGDIR}/boot/grub
for i in /boot/grub/menu.lst /boot/grub/grub.conf \
/boot/grub.conf /boot/grub/device.map
do
if [ -f ${i} ]; then
$CP -p ${i} ${LOGDIR}/${i}
fi
done
if [ -f /etc/inittab ]; then
$CP -p /etc/inittab ${LOGDIR}/etc/inittab
fi
##############################################################################
# /etc Config Files Section
##############################################################################
Echo "[*] /etc Config Files Section"
for i in $( $FIND /etc -name "*.conf" -o -name "*.cf" -o -name "*.cnf" )
do
dirname="$(dirname $i)"
filename="$(basename $i)"
if [ ! -d ${LOGDIR}/${dirname} ]; then
$MKDIR -p ${LOGDIR}/${dirname}
fi
$CP -p $i ${LOGDIR}/${dirname}/${filename}
done
if [ -f /etc/nologin.txt ]; then
$CP -p /etc/nologin.txt ${LOGDIR}/etc/nologin.txt
fi
$CP -p /etc/securetty ${LOGDIR}/etc/securetty
$CP -p /etc/shells ${LOGDIR}/etc/shells
if [ -f /etc/krb.realms ]; then
$CP -p /etc/krb.realms ${LOGDIR}/etc/krb.realms
fi
##############################################################################
# Copy the /etc/profile.d scripts
##############################################################################
if [ -d /etc/profile.d ]; then
$CP -Rp /etc/profile.d ${LOGDIR}/etc
fi
##############################################################################
# Copy the /etc/modprobe.d scripts
##############################################################################
if [ -d /etc/profile.d ]; then
$CP -Rp /etc/modprobe.d ${LOGDIR}/etc
fi
##############################################################################
# New in Fedora 9
##############################################################################
if [ -d /etc/event.d ]; then
$CP -Rp /etc/event.d ${LOGDIR}/etc
fi
##############################################################################
# Get all the pcmcia config information
##############################################################################
if [ -d /etc/pcmcia ]; then
if [ ! -d ${LOGDIR}/pcmcia ]; then
$MKDIR -p ${LOGDIR}/etc/pcmcia
fi
$CP -R -p /etc/pcmcia/*.opts ${LOGDIR}/etc/pcmcia
fi
##############################################################################
# Performance/System Section
##############################################################################
Echo "[*] Performance/System Section"
if [ -e /proc/loadavg ]; then
$CAT /proc/loadavg &gt; ${LOGDIR}/system/loadavg.out
fi
if [ -e /proc/stat ]; then
$CAT /proc/stat &gt; ${LOGDIR}/system/stat.out
fi
$DATE &gt; ${LOGDIR}/system/date.out
$FREE &gt; ${LOGDIR}/system/free.out
$PS auxw &gt; ${LOGDIR}/system/ps_auxw.out
$PS -lef &gt; ${LOGDIR}/system/ps_-elf.out
$PSTREE &gt; ${LOGDIR}/system/pstree.out
$HOSTNAME &gt; ${LOGDIR}/system/hostname.out
$IPCS -a &gt; ${LOGDIR}/system/ipcs_-a.out
$IPCS -u &gt; ${LOGDIR}/system/ipcs_-u.out
$IPCS -l &gt; ${LOGDIR}/system/ipcs_-l.out
$UPTIME &gt; ${LOGDIR}/system/uptime.out
ulimit -a &gt; ${LOGDIR}/system/ulimit_-a.out
if [ -x $VMSTAT ]; then
$VMSTAT -s &gt; ${LOGDIR}/system/vmstat_-s.out
fi
##############################################################################
# OK not sure where this should go so I've put it here instead
##############################################################################
if [ "$LSOF" != "" ]; then
$LSOF &gt; ${LOGDIR}/system/lsof.out 2&gt;&amp;1
fi
##############################################################################
# Kernel Section
##############################################################################
Echo "[*] Kernel Section"
$SYSCTL -A&gt; ${LOGDIR}/etc/sysctl_-A.out 2&gt;&amp;1
$UNAME -a &gt; ${LOGDIR}/system/uname_-a.out 2&gt;&amp;1
$RUNLEVEL &gt; ${LOGDIR}/system/runlevel.out 2&gt;&amp;1
$WHO -r &gt; ${LOGDIR}/system/who_-r.out 2&gt;&amp;1
if [ -f /etc/conf.modules ]; then
$CP -p /etc/conf.modules ${LOGDIR}/etc/conf.modules
fi
if [ ! -d ${LOGDIR}/kernel/info ]; then
$MKDIR -p ${LOGDIR}/kernel/info
fi
$LSMOD | while read line
do
kernmod=$( echo $line | $AWK '{ print $1 }' )
$MODINFO $kernmod &gt; ${LOGDIR}/kernel/info/${kernmod}.out 2&gt;&amp;1
done
$LSMOD &gt; ${LOGDIR}/kernel/lsmod.out 2&gt;&amp;1
if [ -x $KSYMS ]; then
$KSYMS &gt; ${LOGDIR}/kernel/ksyms.out 2&gt;&amp;1
fi
$CP -p /lib/modules/$($UNAME -r)/modules.dep ${LOGDIR}/kernel/modules.dep
$MODPROBE -n -l -v &gt; ${LOGDIR}/kernel/modprobe_-n-l-v.out 2&gt;&amp;1
$DEPMOD -av &gt; ${LOGDIR}/kernel/depmod_-av.out 2&gt;&amp;1
$CAT /proc/modules &gt; ${LOGDIR}/kernel/modules.out 2&gt;&amp;1
##############################################################################
# Just incase we have a debian system
##############################################################################
if [ -f /etc/kernel-pkg.conf ]; then
$CP -p /etc/kernel-pkg.conf ${LOGDIR}/etc/kernel-pkg.conf
fi
if [ -f /etc/kernel-img.conf ]; then
$CP -p /etc/kernel-img.conf ${LOGDIR}/etc/kernel-img.conf
fi
##############################################################################
# Get the kernel configuration details from a 2.6 kernel
##############################################################################
if [ -f /proc/config.gz ]; then
gunzip -c /proc/config.gz &gt; ${LOGDIR}/kernel/config
fi
##############################################################################
# Hot Plug Section
##############################################################################
Echo "[*] Hot Plug Section"
if [ -d /etc/hotplug ]; then
if [ ! -d ${LOGDIR}/etc/hotplug ]; then
$MKDIR -p ${LOGDIR}/etc/hotplug
fi
cd /etc/hotplug
$CP -Rp * ${LOGDIR}/etc/hotplug/
fi
##############################################################################
# Disk Section
##############################################################################
Echo "[*] Disk Section"
# Check to see what is mounted
$DF -k &gt; ${LOGDIR}/disks/df_-k.out 2&gt;&amp;1
$DF -h &gt; ${LOGDIR}/disks/df_-h.out 2&gt;&amp;1
$DF -ki &gt; ${LOGDIR}/disks/df_-ki.out 2&gt;&amp;1
$DF -aki &gt; ${LOGDIR}/disks/df_-aki.out 2&gt;&amp;1
$DF -akih &gt; ${LOGDIR}/disks/df_-akih.out 2&gt;&amp;1
if [ -x $SWAPON ]; then
$SWAPON -s &gt; ${LOGDIR}/disks/swapon_-s.out 2&gt;&amp;1
fi
$MOUNT &gt; ${LOGDIR}/disks/mount.out 2&gt;&amp;1
$MOUNT -l &gt; ${LOGDIR}/disks/mount_-l.out 2&gt;&amp;1
$CAT /proc/mounts &gt; ${LOGDIR}/disks/mounts.out 2&gt;&amp;1
# fstab Information
$CP -p /etc/fstab ${LOGDIR}/disks/fstab 2&gt;&amp;1
# Display any quotas that my have been set
$REPQUOTA -av &gt; ${LOGDIR}/disks/repquota_-av 2&gt;&amp;1
##############################################################################
# Disk Format Information
##############################################################################
DISKLIST=$($FDISK -l 2&gt;/dev/null | grep "^/dev" | sed 's/[0-9]//g' | awk '{ print $1 }' | sort -u)
if [ -x $FDISK ]; then
$FDISK -l &gt; ${LOGDIR}/disks/fdisk_-l.out 2&gt;&amp;1
fi
if [ -x $SFDISK ]; then
$SFDISK -d &gt; ${LOGDIR}/disks/sfdisk_-d.out 2&gt;&amp;1
$SFDISK -l &gt; ${LOGDIR}/disks/sfdisk_-l.out 2&gt;&amp;1
$SFDISK -s &gt; ${LOGDIR}/disks/sfdisk_-s.out 2&gt;&amp;1
fi
if [ -x $BLKID ]; then
$BLKID &gt; ${LOGDIR}/disks/blkid.out 2&gt;&amp;1
fi
for DISK in $DISKLIST
do
NEWDISK=$(/bin/echo $DISK | sed s'/\/dev\///g' )
if [ -x $HDPARM ]; then $HDPARM -vIi $DISK &gt; ${LOGDIR}/disks/hdparm_-vIi_${NEWDISK}.out 2&gt;&amp;1; fi
if [ -x $SFDISK ]; then $SFDISK -l $DISK &gt; ${LOGDIR}/disks/sfdisk_-l_-${NEWDISK}.out 2&gt;&amp;1; fi
if [ -x $FDISK ]; then $FDISK -l $DISK &gt; ${LOGDIR}/disks/fdisk_-l_-${NEWDISK}.out 2&gt;&amp;1; fi
done
if [ -x "$DUMPE2FS" ]; then
PARTS=$($FDISK -l 2&gt;/dev/null | grep "^/dev" | awk '{ print $1 }')
for parts in $PARTS; do
name=$(/bin/echo $parts | sed 's/\//_/g')
$DUMPE2FS $parts &gt; ${LOGDIR}/disks/dumpe2fs${name}.out 2&gt;&amp;1
done
fi
##############################################################################
# Collect Detailed SCSI information about the disks
##############################################################################
if [ -x "$SCSI_ID" ]; then
for i in $($LS sd[a-z] 2&gt;/dev/null)
do
if [ -b /dev/${i} ] ; then
disk_name=$(/bin/echo /dev/${i} | sed 's/\//_/g')
$SCSI_ID -g -p 0x80 -d /dev/${i} -s /block/${i} \
&gt; ${LOGDIR}/disks/scsi_id_-g_-p_0x80_${disk_name}.out 2&gt;&amp;1
$SCSI_ID -g -p 0x83 -d /dev/${i} -s /block/${i} \
&gt; ${LOGDIR}/disks/scsi_id_-g_-p_0x83_${disk_name}.out 2&gt;&amp;1
fi
done
fi
if [ -x $SYSTOOL ]; then
$SYSTOOL -c scsi_host -v &gt; ${LOGDIR}/disks/systool_-c_scsi_host_-v.out 2&gt;&amp;1
fi
##############################################################################
# If we are using multi-pathings then print out the
# multi-pathing information
##############################################################################
if [ -x "$MULTIPATH" ]; then
$MULTIPATH -ll &gt; ${LOGDIR}/disks/multipath_-ll.out 2&gt;&amp;1
$MULTIPATH -v2 &gt; ${LOGDIR}/disks/multipath_-v2.out 2&gt;&amp;1
fi
if [ -x "$DMSETUP" ]; then
$DMSETUP ls &gt; ${LOGDIR}/disks/dmsetup_ls.out 2&gt;&amp;1
$DMSETUP ls --tree &gt; ${LOGDIR}/disks/dmsetup_ls--info.out 2&gt;&amp;1
$DMSETUP info &gt; ${LOGDIR}/disks/dmsetup_info.out 2&gt;&amp;1
$DMSETUP info &gt; ${LOGDIR}/disks/dmsetup_info-C.out 2&gt;&amp;1
$DMSETUP deps &gt; ${LOGDIR}/disks/dmsetup_deps.out 2&gt;&amp;1
$DMSETUP targets &gt; ${LOGDIR}/disks/dmsetup_targets.out 2&gt;&amp;1
fi
# Check to see what iscsi devices have
if [ -x "$ISCSIADM" ]; then
$ISCSIADM -m session &gt; ${LOGDIR}/disks/iscsiadm_-m_session.out 2&gt;&amp;1
fi
# Check to see what emc powerpath devices we have
if [ -x "$POWERMT" ]; then
mkdir -p ${LOGDIR}/disks/emcpower
$POWERMT check_registration &gt;${LOGDIR}/disks/emcpower/powermt_check_registration.out 2&gt;&amp;1
$POWERMT display path &gt;${LOGDIR}/disks/emcpower/powermt_display_path.out 2&gt;&amp;1
$POWERMT display ports &gt;${LOGDIR}/disks/emcpower/powermt_display_ports.out 2&gt;&amp;1
$POWERMT display paths class=all &gt;${LOGDIR}/disks/emcpower/powermt_display_paths_class=all.out 2&gt;&amp;1
$POWERMT display ports dev=all &gt;${LOGDIR}/disks/emcpower/powermt_display_ports_dev=all.out 2&gt;&amp;1
$POWERMT display dev=all &gt;${LOGDIR}/disks/emcpower/powermt_display_dev=all.out 2&gt;&amp;1
# Get the partition details for the EMC devices
for emcdevice in $(ls /dev/emcpower*)
do
emc_disk_name=$(/bin/echo ${emcdevice} | sed 's/\//_/g')
$FDISK -l $emcdevice &gt; ${LOGDIR}/disks/emcpower/fdisk_-l_${emc_disk_name}.out 2&gt;&amp;1
done
fi
##############################################################################
# Veritas Volume Manager / Symantec Veritas Storage Foundation Information
##############################################################################
#
# Changes - "Vincent S. Cojot" - 04-11-2008
# added licence checks
# VxVM/VxFS Configuration Backups
# Some minor bug fixes
#
##############################################################################
if [ -d /etc/vx/licenses/lic ]; then
Echo "[*] Veritas Volume Manager / Symantec Veritas Storage Foundation Section"
Echo "[*] VxVM/VxFS/VCS/VVR licensing Section"
if [ ! -d ${LOGDIR}/etc/vx/licenses/lic ]; then
$MKDIR -p ${LOGDIR}/etc/vx/licenses/lic
fi
$CP -Rp /etc/vx/licenses/lic ${LOGDIR}/etc/vx/licenses/
$VXLICREP -e &gt; ${LOGDIR}/system/vxlicrep_-e.out 2&gt;&amp;1
fi
if [ -d /etc/vx/cbr/bk ]; then
Echo "[*] VxVM/VxFS Configuration Backups"
if [ ! -d ${LOGDIR}/etc/vx/cbr/bk ]; then
$MKDIR -p ${LOGDIR}/etc/vx/cbr/bk
fi
$CP -Rp /etc/vx/cbr/bk ${LOGDIR}/etc/vx/cbr/
fi
if [ -d /dev/vx ]; then
Echo "[*] VxVM live configuration"
if [ ! -d ${LOGDIR}/disks/vxvm ]; then
$MKDIR -p ${LOGDIR}/disks/vxvm
$MKDIR -p ${LOGDIR}/disks/vxvm/logs
$MKDIR -p ${LOGDIR}/disks/vxvm/disk_groups
fi
$LS -laR /dev/vx &gt; ${LOGDIR}/disks/vxvm/ls-lR_dev_vx.out 2&gt;&amp;1
if [ -x $VXDISK ]; then
$VXDISK list &gt; ${LOGDIR}/disks/vxvm/vxdisk_list.out 2&gt;&amp;1
$VXDISK -o alldgs list &gt; ${LOGDIR}/disks/vxvm/vxdisk_-o_alldgs_list.out 2&gt;&amp;1
$VXPRINT -Ath &gt; ${LOGDIR}/disks/vxvm/vxprint_-Ath.out 2&gt;&amp;1
$VXPRINT -h &gt; ${LOGDIR}/disks/vxvm/vxprint_-h.out 2&gt;&amp;1
$VXPRINT -hr &gt; ${LOGDIR}/disks/vxvm/vxprint_-hr.out 2&gt;&amp;1
$VXPRINT -th &gt; ${LOGDIR}/disks/vxvm/vxprint_-th.out 2&gt;&amp;1
$VXPRINT -thrL &gt; ${LOGDIR}/disks/vxvm/vxprint_-thrL.out 2&gt;&amp;1
fi
if [ -x $VXDG ]; then
$VXDG -q list &gt; ${LOGDIR}/disks/vxvm/vxdg_-q_-list.out 2&gt;&amp;1
fi
#------------------------------------------------------------------------
# Collect individual volume information
#------------------------------------------------------------------------
for i in $($VXDG -q list|awk '{print $1}')
do
$VXDG list $i &gt; ${LOGDIR}/disks/vxvm/disk_groups/vxdg_list_${i}.out
$VXDG -g $i free &gt; ${LOGDIR}/disks/vxvm/disk_groups/vxdg_-g_free_${i}.out
$VXPRINT -vng $i &gt; ${LOGDIR}/disks/vxvm/disk_groups/vxprint_-vng_${i}.out
VOL=$(cat ${LOGDIR}/disks/vxvm/disk_groups/vxprint_-vng_${i}.out)
$VXPRINT -hmQqg $i $VOL \
&gt; ${LOGDIR}/disks/vxvm/disk_groups/vxprint_-hmQqg_4vxmk=${i}.out 2&gt;&amp;1
$VXPRINT -hmQqg $i \
&gt; ${LOGDIR}/disks/vxvm/disk_groups/vxprint_-hmQqg=${i}.out 2&gt;&amp;1
done
fi
##############################################################################
# Get the filesystems Characteristics
##############################################################################
for i in $($DF -kl | grep ^/dev | awk '{ print $1 }')
do
if [ -x $TUNE2FS ]; then
name=$(/bin/echo $i | sed 's/\//_/g')
$TUNE2FS -l $i &gt; ${LOGDIR}/disks/tunefs_-l_${name}.out 2&gt;&amp;1
fi
done
##############################################################################
# NFS Information
##############################################################################
# Copy NFS config files around
if [ -f /etc/auto.master ]; then
$CP -p /etc/auto* ${LOGDIR}/etc
fi
# lets see what we have really exported
if [ -x $EXPORTFS ]; then
$EXPORTFS -v &gt; ${LOGDIR}/disks/exportfs_-v.out 2&gt;&amp;1
fi
# This is what we have configured to be exported
if [ -f /etc/exports ]; then
$CP -p /etc/exports ${LOGDIR}/etc/exports
fi
if [ -x "$NFSSTAT" ]; then
$NFSSTAT -a &gt; ${LOGDIR}/disks/nfsstat_-a.out 2&gt;&amp;1
fi
##############################################################################
# Raid Information
##############################################################################
if [ -f /etc/raidtab ]; then
$CP -p /etc/raidtab ${LOGDIR}/etc/raidtab
fi
$MKDIR ${LOGDIR}/disks/raid
if [ -x "$LSRAID" ]; then
for i in $( $LS /dev/md[0-9]* 2&gt;/dev/null )
do
name=$(/bin/echo $i | sed 's/\//_/g')
$LSRAID -a $i &gt; ${LOGDIR}/disks/raid/lsraid_-a_${name}.out &gt; /dev/null 2&gt;&amp;1
done
fi
if [ -x "$MDADM" ]; then
for i in $( $LS /dev/md[0-9]* 2&gt;/dev/null )
do
name=$( echo $i | sed 's/\//_/g' )
$MDADM --detail /dev/$i &gt; ${LOGDIR}/disks/raid/mdadm_--detail_${name}.out &gt; /dev/null 2&gt;&amp;1
if [ ! -s ${LOGDIR}/disks/raid/mdadm--detail_${name}.out ]; then
$RM -f ${LOGDIR}/disks/raid/mdadm--detail_${name}.out
fi
done
fi
##############################################################################
# LVM Information
##############################################################################
LVMDIR=${LOGDIR}/disks/lvm
$MKDIR -p ${LVMDIR}
if [ -x "$LVDISPLAY" ]; then
$LVDISPLAY -vv &gt; ${LVMDIR}/lvdisplay_-vv.out 2&gt;&amp;1
$VGDISPLAY -vv &gt; ${LVMDIR}/vgdisplay_-vv.out 2&gt;&amp;1
$VGSCAN -vv &gt; ${LVMDIR}/vgscan_-vv.out 2&gt;&amp;1
$LVMDISKSCAN -v &gt; ${LVMDIR}/lvmdiskscan_-v.out 2&gt;&amp;1
$PVSCAN -v &gt; ${LVMDIR}/pvscan_-v.out 2&gt;&amp;1
$PVDISPLAY -v &gt; ${LVMDIR}/pvdisplay_-v.out 2&gt;&amp;1
$VGS -v &gt; ${LVMDIR}/vgs-v.out 2&gt;&amp;1
$PVSCAN -v &gt; ${LVMDIR}/pvscan-v.out 2&gt;&amp;1
fi
if [ -x "$LVM" ]; then
$LVM dumpconfig &gt; ${LVMDIR}/lvm_dumpconfig.out 2&gt;&amp;1
$LVM lvs &gt; ${LVMDIR}/lvm_lvs.out 2&gt;&amp;1
# Map every DM device to a disk
$LVDISPLAY | $AWK '/LV Name/{n=$3} /Block device/{d=$3; sub(".*:","dm-",d); print d,n;}' &gt; ${LVMDIR}/devices.out 2&gt;&amp;1
fi
##############################################################################
# DM Information
##############################################################################
# Work out which dm device is being used by each filesystem
grep dm-[0-9] /proc/diskstats | awk '{print $1, $2, $3}' | while read line
do
Major=$(echo $line | awk '{print $1}')
Minor=$(echo $line | awk '{print $2}')
Device=$(echo $line | awk '{print $3}')
List=$(ls -la /dev/mapper | grep "${Major}, ${Minor}" | awk '{print $(NF)}')
echo "$Device = $List " &gt;&gt; ${LOGDIR}/disks/dm-info.out
done
##############################################################################
# Software Section
##############################################################################
Echo "[*] Software Section"
$MKDIR -p ${LOGDIR}/software/rpm-packages
#
# Systemd
#
if [ -x "$SYSTEMCTL" ]; then
$MKDIR ${LOGDIR}/software/systemd
# systemd checks
$SYSTEMD --dump-configuration-items &gt; ${LOGDIR}/software/systemd/systemd_--dump-configuration-items.out 2&gt;&amp;1
$SYSTEMD --test &gt; ${LOGDIR}/software/systemd/systemd_--test.out 2&gt;&amp;1
# systemd-cgls tree
if [ -x "$SYSTEMDCGLS" ]; then
$SYSTEMDCGLS &gt; ${LOGDIR}/software/systemd/systemd-cgls.out 2&gt;&amp;1
fi
if [ -x "$SYSTEMDLOGINCTL" ]; then
$SYSTEMDLOGINCTL --all &gt; ${LOGDIR}/software/systemd/systemd-loginctl_--all.out 2&gt;&amp;1
$SYSTEMDLOGINCTL show-seat &gt; ${LOGDIR}/software/systemd/systemd-loginctl_show-seat.out 2&gt;&amp;1
$SYSTEMDLOGINCTL show-user &gt; ${LOGDIR}/software/systemd/systemd-loginctl_show_user.out 2&gt;&amp;1
fi
# Now systemctl checks
$SYSTEMCTL --version &gt; ${LOGDIR}/software/systemd/systemctl_--version.out 2&gt;&amp;1
$SYSTEMCTL &gt; ${LOGDIR}/software/systemd/systemctl.out 2&gt;&amp;1
$SYSTEMCTL --all &gt; ${LOGDIR}/software/systemd/systemctl_--all.out 2&gt;&amp;1
$SYSTEMCTL list-unit-files &gt; ${LOGDIR}/software/systemd/systemctl_list-unit-files.out 2&gt;&amp;1
$SYSTEMCTL list-jobs &gt; ${LOGDIR}/software/systemd/systemctl_list-jobs.out 2&gt;&amp;1
$SYSTEMCTL dump &gt; ${LOGDIR}/software/systemd/systemctl_dump.out 2&gt;&amp;1
$SYSTEMCTL show-environment &gt; ${LOGDIR}/software/systemd/systemctl_show-environment.out 2&gt;&amp;1
if [ -d ${LOGDIR}/etc/systemd ]; then
$LN -s ${LOGDIR}/etc/systemd ${LOGDIR}/software/systemd/etc-systemd 2&gt;&amp;1
fi
fi
if [ -x "$RPM" ]; then
if [ -x "$CHKCONFIG" ]; then
$CHKCONFIG --list &gt; ${LOGDIR}/software/chkconfig--list.out 2&gt;&amp;1
fi
# Short Description of all packages installed
echo "Package_Name Version Size Description" &gt; ${LOGDIR}/software/rpm-qa--queryformat.out
echo "===================================================================================" &gt;&gt; ${LOGDIR}/software/rpm-qa--queryformat.out
$RPM -qa --queryformat '%-25{NAME} %-16{VERSION} %-10{RELEASE} %-10{DISTRIBUTION} %-10{SIZE} %-10{INSTALLTIME:date} %{SUMMARY}\n' | sort &gt;&gt; ${LOGDIR}/software/rpm-qa--queryformat.out 2&gt;&amp;1
# Long Description of all packages installed
$RPM -qa &gt; ${LOGDIR}/software/rpm_-qa 2&gt;&amp;1
$CAT ${LOGDIR}/software/rpm_-qa | while read line
do
$RPM -qi $line &gt; ${LOGDIR}/software/rpm-packages/${line}.out 2&gt;&amp;1
if [ $? -ne 0 ]; then
echo "ERROR: ${line} problem"
fi
done
# print a list os installed packages sorted by install time:
$RPM -qa -last | tac &gt; ${LOGDIR}/software/rpm-packages/rpm_-qa_-last.out
#############################################################
# If you enable verification then this then it's going to
# take a some time to complete........
#############################################################
if [ ${FULLSOFT} -gt 0 ]; then
$RPM -Va &gt; ${LOGDIR}/software/rpm-Va.out 2&gt;&amp;1
fi
fi
if [ -f /usr/lib/rpm/rpmrc ]; then
$CP -p /usr/lib/rpm/rpmrc ${LOGDIR}/software/rpmrc
fi
# Make a copy of the yum config files so that we can compare them
YUMDIR=${LOGDIR}/software/yum
if [ -d /etc/yum.repos.d ]; then
$MKDIR -p $YUMDIR/yum.repos.d
$CP /etc/yum.repos.d/* $YUMDIR/yum.repos.d/
fi
if [ -x "$YUM" ]; then
$YUM list installed &gt; ${YUMDIR}/yum_list_installed.out 2&gt;&amp;1
$YUM info installed &gt; ${YUMDIR}/yum_info_installed.out 2&gt;&amp;1
$YUM repolist all &gt; ${YUMDIR}/yum_repolist_all.out 2&gt;&amp;1
$YUM repolist enabled &gt; ${YUMDIR}/yum_repolist_enabled.out 2&gt;&amp;1
$YUM repolist disabled &gt; ${YUMDIR}/yum_repolist_disabled.out 2&gt;&amp;1
$YUM -v repolist all &gt; ${YUMDIR}/yum_-v_repolist_all.out 2&gt;&amp;1
$YUM -v repolist enabled &gt; ${YUMDIR}/yum_-v_repolist_enabled.out 2&gt;&amp;1
$YUM -v repolist disabled &gt; ${YUMDIR}/yum_-v_repolist_disabled.out 2&gt;&amp;1
fi
##############################################################################
# Some Debian specific info here for packages
##############################################################################
if [ -f /var/lib/dpkg/available ]; then
$MKDIR -p ${LOGDIR}/var/lib/dpkg
if [ -d /etc/apt ]; then
$MKDIR -p ${LOGDIR}/etc/apt
fi
if [ -f /etc/apt/sources.list ]; then
$CP -p /etc/apt/sources.list ${LOGDIR}/etc/apt/sources.list
fi
if [ -f /etc/apt/apt.conf ]; then
$CP -p /etc/apt/apt.conf ${LOGDIR}/etc/apt/apt.conf
fi
if [ -f /etc/apt/apt.conf ]; then
$CP -p /etc/apt/apt.conf ${LOGDIR}/etc/apt/apt.conf
fi
if [ -f /var/lib/dpkg/status ]; then
$CP -p /var/lib/dpkg/status ${LOGDIR}/var/lib/dpkg/status
fi
if [ -x "$DPKG" ]; then
$DPKG --list &gt; ${LOGDIR}/software/dpkg_--list.out
$DPKG -all &gt; ${LOGDIR}/software/dpkg_-al.out
$DPKG --get-selections &gt; ${LOGDIR}/software/dpkg_-get-selections.out
fi
if [ -x "$DPKG_QUERY" ]; then
$DPKG_QUERY -W &gt; ${LOGDIR}/software/dpkg-query_-W.out
fi
if [ -x /usr/bin/apt-config ]; then
/usr/bin/apt-config dump &gt; ${LOGDIR}/software/apt-config_dump.out
fi
fi
##############################################################################
# Some SuSE specific info here for packages
##############################################################################
if [ -x "$ZYPPER" ]; then
$ZYPPER repos &gt; ${LOGDIR}/software/zypper_repos 2&gt;&amp;1
$ZYPPER locks &gt; ${LOGDIR}/software/zypper_locks 2&gt;&amp;1
$ZYPPER patches &gt; ${LOGDIR}/software/zypper_patches 2&gt;&amp;1
$ZYPPER packages &gt; ${LOGDIR}/software/zypper_packages 2&gt;&amp;1
$ZYPPER patterns &gt; ${LOGDIR}/software/zypper_patterns 2&gt;&amp;1
$ZYPPER products &gt; ${LOGDIR}/software/zypper_products 2&gt;&amp;1
$ZYPPER services &gt; ${LOGDIR}/software/zypper_services 2&gt;&amp;1
$ZYPPER licenses &gt; ${LOGDIR}/software/zypper_licenses 2&gt;&amp;1
$ZYPPER targetos &gt; ${LOGDIR}/software/zypper_targetos 2&gt;&amp;1
$ZYPPER list-updates &gt; ${LOGDIR}/software/zypper_list-updates 2&gt;&amp;1
fi
##############################################################################
# This Section is for Gentoo - so we can work out what packages are installed
# Provided by Adam Bills
##############################################################################
GENTOPKGS=${LOGDIR}/software/gento_kgs.out
if [ -d /var/db/pkg ]; then
( find /var/db/pkg -type f -name environment.bz2 | while read x; do bzcat $x | \
awk -F= '{
if ($1 == "CATEGORY"){
printf "%s ", $2;
}
if ($1 == "PN"){
printf "%s ",$2;
}
if ($1 == "PV"){
print $2;
}
}'; done
) &gt;&gt; $GENTOPKGS
fi
# Show the bootup info
if [ -x $RC_UPDATE ]; then
$RC_UPDATE show &gt;&gt; ${LOGDIR}/software/rc-update_show.out
fi
##############################################################################
# sysconfig Section
##############################################################################
Echo "[*] Sysconfig Section"
if [ -d /etc/sysconfig ]; then
if [ ! -d ${LOGDIR}/etc/sysconfig ]; then
$MKDIR -p ${LOGDIR}/etc/sysconfig
fi
$CP -p -R /etc/sysconfig/* ${LOGDIR}/etc/sysconfig
fi
##############################################################################
# RHN Section
##############################################################################
if [ -d /etc/sysconfig/rhn ]; then
Echo "[*] RedHat Network Section"
RDIR=${LOGDIR}/rhn
$MKDIR -p ${RDIR}
if [ -d /etc/rhn ]; then
$CP -pR /etc/rhn/ ${LOGDIR}/etc/rhn/
if [ -f /etc/sysconfig/rhn/systemid ]; then
if [ -x /usr/bin/xsltproc ]; then
/usr/bin/xsltproc $UTILDIR/text.xsl $RDIR/systemid \
&gt; $ROOT/$RHNDIR/systemid 2&gt;&amp;1
fi
fi
fi
fi
##############################################################################
# Systems Log Section
##############################################################################
Echo "[*] Systems Log Section"
$CP -R -p /var/log/* ${LOGDIR}/logs
$DMESG &gt; ${LOGDIR}/logs/dmesg.out
$LAST &gt; ${LOGDIR}/logs/lastlog
##############################################################################
# SELINUX
##############################################################################
Echo "[*] SElinux Section"
SELINUXDIR=${LOGDIR}/selinux
$MKDIR -p ${SELINUXDIR}
if [ -x $SESTATUS ]; then
$SESTATUS &gt; ${SELINUXDIR}/sestatus.out
$SESTATUS -bv &gt; ${SELINUXDIR}/sestatus_-bv.out 2&gt;&amp;1
fi
if [ -x $SEMANAGE ]; then
$SEMANAGE fcontext -l | tee ${SELINUXDIR}/semanage_fcontext_-l.out &amp;&gt; /dev/null
$SEMANAGE port -l | tee ${SELINUXDIR}/semanage_port_-l.out &amp;&gt; /dev/null
$SEMANAGE login -l | tee ${SELINUXDIR}/semanage_login_-l.out &amp;&gt; /dev/null
$SEMANAGE user -l | tee ${SELINUXDIR}/semanage_user_-l.out &amp;&gt; /dev/null
$SEMANAGE node -l | tee ${SELINUXDIR}/semanage_node_-l.out &amp;&gt; /dev/null
$SEMANAGE interface -l| tee ${SELINUXDIR}/semanage_interface_-l.out &amp;&gt; /dev/null
$SEMANAGE boolean -l | tee ${SELINUXDIR}/semanage_boolean_-l.out &amp;&gt; /dev/null
fi
if [ -x $GETSEBOOL ]; then
$GETSEBOOL -a &gt; ${LOGDIR}/selinux/getsebool_-a.out 2&gt;&amp;1
else
echo "getsebool not installed" &gt; ${LOGDIR}/selinux/getsebool_-a.out 2&gt;&amp;1
fi
##############################################################################
# Virtual Servers Information
##############################################################################
VIRT=${LOGDIR}/virtual
#------------------------------------------------------------------------
# Xen
#------------------------------------------------------------------------
if [ -d /etc/xen ]; then
Echo "[*] Xen Section"
$MKDIR -p ${VIRT}/xen
XENETC=${LOGDIR}/xen
if [ ! -d $XENETC ]; then
mkdir -p $XENETC
fi
$CP -Rp /etc/xen/* ${XENETC}/
$MKDIR -p ${VIRT}/xen
if [ -x $XM ]; then
$XM list &gt; $VIRT/xen/xm_list.out 2&gt;&amp;1
$XM info &gt; $VIRT/xen/xm_info.out 2&gt;&amp;1
$XM logs &gt; $VIRT/xen/xm_log.out 2&gt;&amp;1
$XM dmesg &gt; $VIRT/xen/xm_dmesg.out 2&gt;&amp;1
$XM vcpu-list &gt; $VIRT/xen/xm_vcpu-list.out 2&gt;&amp;1
for myHost in $($XM list 2&gt;/dev/null | egrep -v "VCPUs |^Domain-0")
do
$XM network-list $myHost&gt; $VIRT/xen/xm_network-list_${myHost}.out 2&gt;&amp;1
$XM uptime $myHost &gt; $VIRT/xen/xm_uptime_${myHost}.out 2&gt;&amp;1
$VIRSH dominfo $myHost &gt; $VIRT/xen/virsh_dominfo_${myHost}.out 2&gt;&amp;1
done
fi
fi
##############################################################################
# VirtLib Information
##############################################################################
#------------------------------------------------------------------------
# Virtlib
#------------------------------------------------------------------------
if [ -x $VIRSH ]; then
Echo "[*] LibVirt Section"
$MKDIR -p ${VIRT}/libvirt
$VIRSH list --all 2&gt;/dev/null | \
grep -v "Id Name" | \
egrep -v "\--|^$" | \
awk '{print $2}' | while read line
do
$VIRSH dominfo $line &gt;&gt; ${VIRT}/libvirt/virsh_dominfo_${line}.out 2&gt;&amp;1
$VIRSH dumpxml $line &gt;&gt; ${VIRT}/libvirt/virsh_dumpxml_${line}.out 2&gt;&amp;1
done
$VIRSH list --all &gt; ${VIRT}/libvirt/virsh_list_--all.out 2&gt;&amp;1
fi
##############################################################################
# yp services
##############################################################################
Echo "[*] YP Services Section"
YPDIR=${LOGDIR}/yp
$MKDIR -p ${YPDIR}
if [ -x "$YPWHICH" ]; then
$YPWHICH -m &gt; ${YPDIR}/ypwhich-m.out 2&gt;&amp;1
fi
if [ -f /etc/domainname ]; then
$CP -p /etc/domainname ${LOGDIR}/etc/
$LS -lR /var/yp/$(cat /etc/domainname) &gt; ${YPDIR}/ls_-lR.out 2&gt;&amp;1
fi
##############################################################################
# Networking Section
##############################################################################
Echo "[*] Networking Section"
for i in $($LS -d /etc/host* )
do
filename=$(basename $i)
$CP -p $i ${LOGDIR}/etc/${filename}
done
for i in $( $LS -d /etc/ftp* 2&gt;/dev/null )
do
filename=$(basename $i)
$CP -p $i ${LOGDIR}/etc/$filename
done
$CP -p /etc/services ${LOGDIR}/etc/services
if [ -f /etc/HOSTNAME ]; then
$CP -p /etc/HOSTNAME ${LOGDIR}/etc/HOSTNAME
fi
if [ -f /etc/hostname ]; then
$CP -p /etc/hostname ${LOGDIR}/etc/hostname
fi
if [ -f /etc/networks ]; then
$CP -p /etc/networks ${LOGDIR}/etc/networks
fi
if [ -f /etc/hosts.allow ]; then
$CP -p /etc/hosts.allow ${LOGDIR}/etc/hosts.allow
fi
if [ -f /etc/hosts.deny ]; then
$CP -p /etc/hosts.deny ${LOGDIR}/etc/hosts.deny
fi
if [ -f /etc/shells ]; then
$CP -p /etc/shells ${LOGDIR}/etc/shells
fi
if [ -f /etc/network/interfaces ]; then
if [ ! -d ${LOGDIR}/etc/network/interfaces ]; then
$MKDIR -p ${LOGDIR}/etc/network/interfaces
fi
$CP -p /etc/network/interfaces ${LOGDIR}/etc/network/interfaces
fi
$MKDIR -p ${LOGDIR}/network
$IFCONFIG -a &gt; ${LOGDIR}/network/ifconfig_-a.out 2&gt;&amp;1
$ARP -an &gt; ${LOGDIR}/network/arp_-an.out 2&gt;&amp;1
if [ -f "${LOGDIR}/etc/resolv.conf" ]; then
$LN -s ${LOGDIR}/etc/resolv.conf ${LOGDIR}/network/resolv.conf 2&gt;&amp;1
fi
$NETSTAT -rn &gt; ${LOGDIR}/network/netstat_-rn.out 2&gt;&amp;1
$NETSTAT -lan &gt; ${LOGDIR}/network/netstat_-lan.out 2&gt;&amp;1
$NETSTAT -lav &gt; ${LOGDIR}/network/netstat_-lav.out 2&gt;&amp;1
$NETSTAT -tulpn &gt; ${LOGDIR}/network/netstat_-tulpn.out 2&gt;&amp;1
$NETSTAT -ape &gt; ${LOGDIR}/network/netstat_-ape.out 2&gt;&amp;1
$NETSTAT -uan &gt; ${LOGDIR}/network/netstat_-uan.out 2&gt;&amp;1
$NETSTAT -s &gt; ${LOGDIR}/network/netstat_-s.out 2&gt;&amp;1
$NETSTAT -in &gt; ${LOGDIR}/network/netstat_-in.out 2&gt;&amp;1
$ROUTE -nv &gt; ${LOGDIR}/network/route_-nv.out 2&gt;&amp;1
if [ -x "$IP" ]; then
$IP add &gt; ${LOGDIR}/network/ip_add.out 2&gt;&amp;1
$IP route&gt; ${LOGDIR}/network/ip_route.out 2&gt;&amp;1
$IP link &gt; ${LOGDIR}/network/ip_link.out 2&gt;&amp;1
$IP rule &gt; ${LOGDIR}/network/ip_rule.out 2&gt;&amp;1
fi
if [ -x "$IWCONFIG" ]; then
$IWCONFIG &gt; ${LOGDIR}/network/iwconfig.out 2&gt;&amp;1
fi
if [ -x "${MIITOOL}" ]; then
${MIITOOL} &gt; ${LOGDIR}/network/mii-tool.out 2&gt;&amp;1
fi
# Collect bridging information
if [ -x "${BRCTL}" ]; then
$BRCTL show &gt; ${LOGDIR}/network/brctl_show.out 2&gt;&amp;1
for myBridge in $($BRCTL show | grep -v "STP enabled" | grep ^[a-zA-Z] | awk '{ print $1}')
do
$BRCTL showmacs $myBridge &gt; ${LOGDIR}/network/btctl_showmacs_${myBridge}.out 2&gt;&amp;1
$BRCTL showstp $myBridge &gt; ${LOGDIR}/network/btctl_showstp_${myBridge}.out 2&gt;&amp;1
done
fi
##############################################################################
# Get the iptable information
##############################################################################
if [ -x "$IPTABLES" ]; then
$IPTABLES -L &gt; ${LOGDIR}/network/iptables-L.out
$IPTABLES -t filter -nvL &gt; ${LOGDIR}/network/iptables-t_filter-nvL.out
$IPTABLES -t mangle -nvL &gt; ${LOGDIR}/network/iptables-t_mangle-nvL.out
$IPTABLES -t nat -nvL &gt; ${LOGDIR}/network/iptables_-t_nat_-nvL.out
else
echo "no iptables in kernel" &gt; ${LOGDIR}/network/iptables-NO-IP-TABLES
fi
##############################################################################
# List the ipchains rules
##############################################################################
if [ -x "$IPCHAINS" ]; then
$IPCHAINS -L -n &gt; ${LOGDIR}/network/ipchains_-L_-n.out
fi
##############################################################################
# Lets now check the network cards speeds
##############################################################################
if [ -x "$ETHTOOL" ]; then
for version in 4 6
do
INTERFACES=$( cat /proc/net/dev | grep "[0-9]:" | awk -F: '{print $1 }' )
for i in $INTERFACES
do
$ETHTOOL $i &gt; ${LOGDIR}/network/ethtool_ipv${version}_${i}.out 2&gt;&amp;1
$ETHTOOL -i $i &gt;&gt; ${LOGDIR}/network/ethtool_ipv${version}_-i_${i}.out 2&gt;&amp;1
$ETHTOOL -S $i &gt;&gt; ${LOGDIR}/network/ethtool_ipv${version}_-S_${i}.out 2&gt;&amp;1
done
done
fi
##############################################################################
# xinetd Section
##############################################################################
Echo "[*] xinetd Section"
if [ -d /etc/xinet.d ]; then
XINETD=${LOGDIR}/etc/xinet.d
$MKDIR -p ${XINETD}
for i in $($LS -d /etc/xinetd.d/* )
do
filename=$(basename $i)
$CP -p $i ${XINETD}/$filename
done
fi
if [ -f /etc/xinetd.log ]; then
$CP -p /etc/xinetd.log ${LOGDIR}/etc/xinetd.log
fi
##############################################################################
# DNS Section
##############################################################################
Echo "[*] DNS Section"
if [ -f /etc/named.boot ]; then
$CP -p /etc/named.boot ${LOGDIR}/etc/named.boot
fi
DNSDIR=""
if [ "${DNSDIR}" != "" ]; then
if [ ! -d ${LOGDIR}${DNSDIR} ]; then
$MKDIR -p ${LOGDIR}${DNSDIR}
fi
cd ${DNSDIR}
$TAR cf - . 2&gt;/dev/null | ( cd ${LOGDIR}${DNSDIR} ; tar xpf - ) &gt; /dev/null 2&gt;&amp;1
fi
##############################################################################
# Cluster Section
##############################################################################
CLUSTERDIR=${LOGDIR}/clusters
Echo "[*] Cluster Section"
#--------------------------------------------------------------------
# Oracles OCFS2 cluster filesystems
#--------------------------------------------------------------------
if [ -f /etc/ocfs2/cluster.conf ]; then
if [ ! -d ${LOGDIR}/etc/ocfs2 ]; then
$MKDIR -p ${LOGDIR}/etc/ocfs2
fi
$CP -p /etc/ocfs2/cluster.conf ${LOGDIR}/etc/ocfs2/cluster.conf
$MKDIR -p ${CLUSTERDIR}/ocfs2
$CP -p /etc/ocfs2/cluster.conf ${CLUSTERDIR}/ocfs2/cluster.conf
fi
#--------------------------------------------------------------------
# Redhat Cluster
#--------------------------------------------------------------------
if [ -x $CLUSTAT ]; then
Echo "[*] Veritas Cluster Section"
MyClusterDir=${CLUSTERDIR}/redhat
mkdir -p ${CLUSTERDIR}/redhat
$CLUSTAT &gt; $MyClusterDir/clustat.out 2&gt;&amp;1
$CLUSTAT -f &gt; $MyClusterDir/clustat_-f.out 2&gt;&amp;1
$CLUSTAT -l &gt; $MyClusterDir/clustat_-l.out 2&gt;&amp;1
$CLUSTAT -I &gt; $MyClusterDir/clustat_-I.out 2&gt;&amp;1
$CLUSTAT -v &gt; $MyClusterDir/clustat_-v.out 2&gt;&amp;1
$CLUSTAT -x &gt; $MyClusterDir/clustat_-x.out 2&gt;&amp;1
$CLUSVCADM -v &gt; $MyClusterDir/clusvcadm_-x.out 2&gt;&amp;1
$CLUSVCADM -S &gt; $MyClusterDir/clusvcadm_-S.out 2&gt;&amp;1
fi
# List out Quorum devices
if [ -x $MKQDISK ] ; then
$MKQDISK -L &gt;&gt; $MyClusterDir/mkqdisk_-L.out 2&gt;&amp;1
fi
# Copy the cluster config files over
if [ -f /etc/cluster.xml ]; then
$CP -p /etc/cluster.xml ${LOGDIR}/etc/cluster.xml
$CP -p /etc/cluster.xml $MyClusterDir/cluster.xml
fi
if [ -d /etc/cluster ]; then
$CP -Rp /etc/cluster/* ${LOGDIR}/etc/cluster/
$CP -p /etc/cluster/* $MyClusterDir/
fi
#--------------------------------------------------------------------
# Veritas Cluster
#--------------------------------------------------------------------
if [ -f /etc/VRTSvcs/conf/config/main.cf ]; then
Echo "[*] Veritas Cluster Section"
VCSDIR=${CLUSTERDIR}/veritas
if [ ! -d $VCSDIR ]; then
$MKDIR -p ${VCSDIR}
fi
$MKDIR -p ${LOGDIR}/etc/VRTSvcs/conf/config
$CP -p /etc/VRTSvcs/conf/config/* ${LOGDIR}/etc/VRTSvcs/conf/config
if [ -d /var/VRTSvcs/log ]; then
$MKDIR -p ${LOGDIR}/var/VRTSvcs/log
$CP -p /var/VRTSvcs/log/* ${LOGDIR}/var/VRTSvcs/log
fi
$HASTATUS -sum&gt; ${VCSDIR}/hastatus_-sum.out 2&gt;&amp;1
$HARES -list &gt; ${VCSDIR}/hares_-list.out 2&gt;&amp;1
$HAGRP -list &gt; ${VCSDIR}/hagrp_-list.out 2&gt;&amp;1
$HATYPE -list &gt; ${VCSDIR}/hatype_-list.out 2&gt;&amp;1
$HAUSER -list &gt; ${VCSDIR}/hauser_-list.out 2&gt;&amp;1
$LLTSTAT -vvn &gt; ${VCSDIR}/lltstat_-vvn.out 2&gt;&amp;1
$GABCONFIG -a &gt; ${VCSDIR}/gabconfig_-a.out 2&gt;&amp;1
$HACF -verify /etc/VRTSvcs/conf/config/main.cf &gt; ${VCSDIR}/hacf-verify.out 2&gt;&amp;1
$CP -p /etc/llthosts ${LOGDIR}/etc
$CP -p /etc/llttab ${LOGDIR}/etc
$CP -p /etc/gabtab ${LOGDIR}/etc
fi
#--------------------------------------------------------------------
# CRM/PaceMaker Cluster
#--------------------------------------------------------------------
Echo "[*] CRM Cluster Section"
CRMDIR=${CLUSTERDIR}/crm
if [ -x $CRM_MON ]; then
$MKDIR -p ${CRMDIR}
$CRM_MON --version &gt; ${CRMDIR}/crm_mon_--version.out
if [ -x $CRM ]; then
$CRM status &gt; ${CRMDIR}/crm_status.out
$CRM configure show &gt; ${CRMDIR}/crm_configure_show.out
$CRM configure show xml &gt; ${CRMDIR}/crm_configure_show_xml.out
$CRM ra classes &gt; ${CRMDIR}/crm_ra_classes.out
$CRM ra list ocf heartbeat &gt; ${CRMDIR}/crm_ra_list_ocf_heartbeat.out
$CRM ra list ocf pacemaker &gt; ${CRMDIR}/crm_ra_list_ocf_pacemaker.out
fi
if [ -x $CRM_VERIFY ]; then $CRM_VERIFY -L &gt; ${CRMDIR}/crm_verify_-L.out; fi
if [ -x $CIBADMIN ]; then $CIBADMIN -Ql &gt; ${CRMDIR}/cibadmin_-Ql.out; fi
fi
##############################################################################
# Crontab Section
##############################################################################
Echo "[*] Crontab Section"
$MKDIR -p ${LOGDIR}/etc/cron
$CP -R -p /etc/cron* ${LOGDIR}/etc
if [ -d /var/spool/cron ]; then
$MKDIR -p ${LOGDIR}/var/spool/cron
cd /var/spool/cron
$TAR cf - . | ( cd ${LOGDIR}/var/spool/cron ; tar xpf - )
fi
##############################################################################
# Printer Section
##############################################################################
Echo "[*] Printer Sectiona"
PRINTDIR=${LOGDIR}/lp
$MKDIR -p ${PRINTDIR}
$MKDIR -p ${PRINTDIR}/general
$MKDIR -p ${LOGDIR}/etc/printcap
if [ -x /usr/bin/lpstat ]; then
/usr/bin/lpstat -t &gt; ${PRINTDIR}/lpstat_-t.out 2&gt;&amp;1
fi
if [ -x /usr/sbin/lpc ]; then
/usr/sbin/lpc status &gt; ${PRINTDIR}/lpstat_status.out 2&gt;&amp;1
fi
if [ -f /etc/printcap ]; then
$CP /etc/printcap ${LOGDIR}/etc/printcap
fi
if [ -d /etc/cups ]; then
$MKDIR -p ${LOGDIR}/etc/cups
$CP -p -R /etc/cups/* ${LOGDIR}/etc/cups
fi
/usr/bin/lpq &gt; ${PRINTDIR}/general/lpq.out 2&gt;&amp;1
if [ -x /usr/bin/lpq.cups ]; then
/usr/bin/lpq.cups &gt; ${PRINTDIR}/lpq.cups.out 2&gt;&amp;1
fi
##############################################################################
# openldap Section
##############################################################################
Echo "[*] Openldap Section"
if [ -d /etc/openldap ]; then
$MKDIR -p ${LOGDIR}/etc/openldap
$CP -p -R /etc/openldap/* ${LOGDIR}/etc/openldap
fi
##############################################################################
# pam Section
##############################################################################
Echo "[*] PAM Section"
$MKDIR -p ${LOGDIR}/etc/pam
$CP -p -R /etc/pam.d/* ${LOGDIR}/etc/pam/
##############################################################################
# Sendmail Section
##############################################################################
Echo "[*] Sendmail Section"
$MKDIR -p ${LOGDIR}/etc/mail
if [ -f /etc/sendmail.cf ]; then
$CP -p /etc/sendmail.cf ${LOGDIR}/etc/sendmail.cf
fi
if [ -f /etc/sendmail.cw ]; then
$CP -p /etc/sendmail.cw ${LOGDIR}/etc/sendmail.cw
fi
if [ -d /etc/mail ]; then
for i in $($LS -d /etc/mail/* | $GREP -v \.db) ; do
$CP -R -p $i ${LOGDIR}/etc/mail
done
fi
if [ -f /etc/aliases ]; then
$CP -p /etc/aliases ${LOGDIR}/etc/aliases
fi
if [ -f /etc/mail/aliases ]; then
$CP -p /etc/mail/aliases ${LOGDIR}/etc/mail/aliases
fi
##############################################################################
# Postfix Section
##############################################################################
Echo "[*] Postfix Section"
if [ -d /etc/postfix ]; then
POSTDIR=${LOGDIR}/etc/postfix
$MKDIR -p $POSTDIR
$CP -p -R /etc/postfix/* ${POSTDIR}
$POSTCONF -v &gt; ${POSTDIR}/postconf_-v.out 2&gt;&amp;1
$POSTCONF -l &gt; ${POSTDIR}/postconf_-l.out 2&gt;&amp;1
fi
##############################################################################
# Exim Section
##############################################################################
Echo "[*] Exim Section"
if [ -d /etc/exim ]; then
EXIMDIR=${LOGDIR}/etc
$CP -p -R /etc/exim ${EXIMDIR}
fi
##############################################################################
# Time Section
##############################################################################
Echo "[*] Time Section"
TIMEDIR=${LOGDIR}/etc/time
if [ ! -d ${TIMEDIR} ]; then
$MKDIR -p ${TIMEDIR}
fi
$DATE &gt; ${TIMEDIR}/date
if [ -f /etc/timezone ]; then
$CP -p /etc/timezone ${TIMEDIR}/timezone
fi
if [ -f /usr/share/zoneinfo ]; then
$CP -p /usr/share/zoneinfo ${TIMEDIR}/zoneinfo
fi
if [ -f /etc/ntp.drift ]; then
$CP -p /etc/ntp.drift ${TIMEDIR}/ntp.drift
fi
if [ -x $HWCLOCK ]; then
$HWCLOCK --show &gt; ${TIMEDIR}/hwclock_--show.out
fi
if [ -x $NTPQ ]; then
$NTPQ -p &gt; ${TIMEDIR}/ntpq_-p.out 2&gt;&amp;1
fi
if [ -f /etc/ntp/step-tickers ]; then
$CP -p /etc/ntp/step-tickers ${LOGDIR}/etc
fi
if [ -f /etc/ntp/ntpservers ]; then
$CP -p /etc/ntp/ntpservers ${LOGDIR}/etc
fi
##############################################################################
# PPP Section
##############################################################################
Echo "[*] PPP Section"
PPPDIR=${LOGDIR}/etc/ppp
if [ ! -d ${PPPDIR} ]; then
$MKDIR -p ${PPPDIR}
$MKDIR -p ${PPPDIR}/peers
fi
if [ -d /etc/ppp ]; then
$CP -R -p /etc/ppp/* ${PPPDIR} 2&gt;&amp;1
fi
if [ -d /etc/wvdial ] ; then
$CP -p /etc/ppp/options.* ${PPPDIR} &gt; /dev/null 2&gt;&amp;1
$CP -p -R /etc/ppp/peers/* ${PPPDIR}/peers &gt; /dev/null 2&gt;&amp;1
fi
##############################################################################
# Apache Section
##############################################################################
Echo "[*] Apache Section"
if [ -d /etc/httpd ]; then
APACHEDIR=${LOGDIR}/httpd
else
APACHEDIR=${LOGDIR}/apache
fi
if [ ! -d $APACHEDIR ]; then
$MKDIR -p ${APACHEDIR}
fi
if [ -x $APACHECTL ]; then
$APACHECTL status &gt; ${APACHEDIR}/apachectl_status.out 2&gt;&amp;1
fi
if [ -x $APACHE2CTL ]; then
$APACHE2CTL status &gt; ${APACHEDIR}/apache2ctl_status.out 2&gt;&amp;1
fi
##############################################################################
# Samba Section
##############################################################################
Echo "[*] Samba Section"
SAMBADIR=${LOGDIR}/disks/samba
if [ ! -d ${SAMBADIR} ]; then
$MKDIR -p ${SAMBADIR}
fi
if [ -x $TESTPARM ]; then
echo "y" | $TESTPARM &gt; ${SAMBADIR}/testparm.out 2&gt;&amp;1
fi
if [ -x $WBINFO ]; then
$WBINFO -g &gt; ${SAMBADIR}/wbinfo_-g.out 2&gt;&amp;1
$WBINFO -u &gt; ${SAMBADIR}/wbinfo_-g.out 2&gt;&amp;1
fi
##############################################################################
# OpenSSH Section
##############################################################################
Echo "[*] OpenSSH Section"
SSHDIR=${LOGDIR}/etc/ssh
$MKDIR -p ${SSHDIR}
if [ -f /etc/nologin ]; then
$CP -p /etc/nologin ${LOGDIR}/etc/nologin
fi
if [ -d /etc/ssh/ssh_config ]; then
$CP -p /etc/ssh/ssh_config ${SSHDIR}/ssh_config
fi
if [ -d /etc/ssh/sshd_config ]; then
$CP -p /etc/ssh/sshd_config ${SSHDIR}/sshd_config
fi
##############################################################################
# X11 Section
##############################################################################
Echo "[*] X11 Section"
XDIR=${LOGDIR}/X
$MKDIR -p $XDIR
if [ -d /etc/X11 ]; then
$CP -R -p /etc/X11 ${LOGDIR}/etc
fi
if [ -x $SYSP ]; then
$SYSP -c &gt; ${XDIR}/sysp_-c.out
$SYSP -s mouse &gt; ${XDIR}/sysp_-s_mouse.out
$SYSP -s keyboard &gt; ${XDIR}/sysp_-s_keyboard.out
fi
if [ -x $_3DDIAG ]; then
$_3DDIAG &gt; ${XDIR}/3Ddiag.out
fi
##############################################################################
# This section is for removing any information
# about hardcoded passwords inserted in files.
##############################################################################
if [ -f /etc/wvdial.conf ]; then
$CAT /etc/wvdial.conf | sed -e /^Password/d &gt; ${LOGDIR}/etc/wvdial.conf
fi
##############################################################################
# Tar Up Support Directory | GPG support
##############################################################################
cd ${LOGTOP}
$TAR czf ${TARFILE} . &gt; /dev/null 2&gt;&amp;1
if [[ ${GPG} -eq "1" ]]; then
#--------------------------------------------------------------------------
# Import GPG public key: (0x57260789)
# Facundo M. de la Cruz
# [ [email protected] ]
#--------------------------------------------------------------------------
echo "[*] Importing GPG public key: $GPG_ID"
gpg --import &lt;&lt; EOF
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.12 (GNU/Linux)
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
AAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0
NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKT
lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl
5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL
/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB
CSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpj
ZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIR
AxEAPwD3kzqO9R/alOenFUGuDiq5nBZ+e/8ASlcVy/PfBAMAE+lVGvi3OMCqF3cb
SuK4Xxh8TNM8Kt9mffd6gRn7NGQNo7bm7fqfagZ6E93l1wcnOBWRf+KdLsJfKu9Q
s4pP7jzqGJ+hNfN3iDx3rniqcm5uPs9oPuW0D7V/Hux+v6VzE0pib5CMemKQ7H1R
b+MNM1CUx2tzA5H9yVX/AJE4qK61q3i1C3gYjdNnaQOCQM18sJdTRuHjYq6nIZeC
D61al1jU7ySMz3k7kNkZc9aLAfVMd0knKKMeopzTZ7V5p8NPGC6pBNp13L/pcbbk
LH/WL7fTFdz+63Sbldzu4yGbsPXigRcMmelRlqjTAHEYjHpx/SgHLt7YH9f60DGc
G5YgDIQfjk//AFqeeaanJdvVv5cf40+gBhUUmwU/FGKAIjHRUtFAHW7hjrVfcN8n
+9/Snbhgcj8qhBy0n+9/QUEHP+NNdTw9oE+olQ7xriNCfvOTgD86+XrmW81fVpri
ZnnupnLu2OpP9K9x+N5kXwvZOpOwXY3D/gLYrz3wdpoS2W5KZklOcn0qZS5Vc2pQ
53Yy7fwpqNwisUWMH0GcVYvPCEllbrLcS7mb7oNepWkICruYeuBWd4i05r6GN4V3
FD90dawVRtnXKhFLQ8yOlCJBhQeccjpWdcWwjTf3zxXYXSLtIxtYHJB+lc9fpiIL
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
EHvKMZD4F6S7F7vVQw==
=kL5L
-----END PGP PUBLIC KEY BLOCK-----
EOF
$GPG_BIN -e -r ${GPG_ID} ${TARFILE}
TARFILE="${TARFILE}.gpg"
fi
if [ -t 0 ]; then
$CAT &lt;&lt;- EOF
**********************************************************************
The Tar file ${TARFILE}
has been created for support purposes.
You can email the tar file to those providing you
with technical support to &lt;$SUPPORT&gt;
**********************************************************************
EOF
fi
</pre>
<pre class="brush:plain">
Permisos: chmod 700 LINUXexplo.bash &lt;/br&gt;
Ejecución: # ./LINUXexplo.bash [ parámetros ] (Requiere privilegios de root) &lt;/br&gt;
El script tardará unos minutos en recolectar la información y creará un log y un .tgz en la ruta:&lt;/br&gt;
/opt/LINUXexplo/linux/ &lt;/br&gt;
NOTA: Se debe reemplazar la llave pública GPG por la del administrador o usuario que ejecute el script.
</pre>
<pre class="brush:plain"> </pre>
<hr/><pre class="brush:bash">#!/bin/bash
# FlashVideo Downloader
# Code By Kypzkore Kodeinfect
# http://kode-labs.blogspot.com
lsof | grep '/tmp/Flash[^ ]*' | awk '{ print "/proc/" $2 "/fd/" $4 }' | sed 's/[rwu]$//' </pre>
<hr/><pre class="brush:bash">chmod +x flashvids.sh</pre>
<hr/><pre class="brush:bash">alias flashtmp='sh /home/use/flashvids.sh'</pre>
<hr/><pre class="brush:bash">/proc/7254/fd/19</pre>
<hr/><pre class="brush:bash">cp /proc/7254/fd/19 /home/user/Videos</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
function message() {
case $mensage in
game_banner) #tput cup 1 $cols
echo
tput rev
echo "$(tput setaf 4)EL JUEGO DEL AHORCADO EN BASH SCRIPT$(tput sgr0)"
echo
echo "$(tput setaf 7)$(tput bold)Contiene $(tput setaf 1)$(( $long_palabra-$espacios ))$(tput setaf 7) caracteres sin contar los espacios"
echo "$(tput setaf 7)Puedes usar los comodines. Dispones de $(tput setaf 1)$comodines$(tput setaf 7). Para usarlos pulsa $(tput setaf 1)+"
[[ $(( 6-intentos )) -lt 2 ]] &amp;&amp; vida="vida" || vida="vidas"
echo "$(tput setaf 7)Dispones de $(tput setaf 1)$(( 6-intentos )) $vida"
#echo "$(tput setaf 7)El nombre de este país es $(tput setaf 1)$palabra"¡
echo
echo "$(tput setaf 7)El nombre de este país es: $(tput setaf 1)$word"
echo -n "$(tput setaf 7)Vidas: $(tput setaf 1)"
for (( i=1; i&lt;=$(( 6-intentos )); i++ )); do echo -n $'\342\231\245'; done; echo
echo -n "$(tput setaf 7)Comodines: $(tput setaf 1)"
for (( i=1; i&lt;=$comodines; i++ )); do echo -n $'\342\230\245'; done; echo
echo "$(tput setaf 7)Caracteres restantes: $(tput setaf 1)$(( ($long_palabra-$espacios)-$aciertos ))"
echo "$(tput setaf 7)Puntuación: $(tput setaf 1)$score";;
game_over) echo "$(tput setaf 2)Fenomenal, eres un crack";;
game_read) read -n1 -p "$(tput setaf 7)Vida $(tput setaf 1)$intentos $(tput setaf 7)de $(tput setaf 1)5$(tput setaf 7). Introduce una letra: $(tput setaf 1)" caracter
echo;;
salir) echo
tput rev
echo "$(tput setaf 1)GameOver$(tput sgr0)"
echo "$(tput setaf 7)$(tput bold)Tu mejor puntuación es: $(tput setaf 1)$best_score"
echo "$(tput setaf 7)Tu puntuación acumulada es: $(tput setaf 1)$acumulado"
echo
echo "$(tput setaf 7)La solución es: $(tput setaf 1)$palabra"
echo "$(tput setaf 7)Que deseas hacer?"
read -n1 -p "$(tput setaf 7)Pulsa $(tput setaf 1)Q $(tput setaf 7)para $(tput setaf 1)salir $(tput setaf 7)o $(tput setaf 1)G $(tput setaf 7)para $(tput setaf 1)volver a jugar$(tput setaf 7). Introduce una letra: $(tput setaf 1)" caracter
echo "$(tput setaf 7)";;
comodines_restantes) echo "$(tput setaf 4)Te dispones a usar un comodín. Suerte, sólo dispones de $(tput setaf 1)$comodines"
echo "$(tput setaf 2)Comodín = $(tput setaf 1)$caracter";;
comodines_finalizados) echo "$(tput setaf 4)Ups, has gastado todos los comodines";;
continuar) read -n1 -p "$(tput setaf 1)Pulsar cualquier tecla para continuar$(tput setaf 7)";;
acierto_mal) echo "$(tput setaf 4)Has fallado, ahora tienes un intento menos";;
#acierto_letra) echo "$(tput setaf 7)Letra introducida: $(tput setaf 1)$letra";;
acierto_bien) echo "$(tput setaf 2)Muy bien, ya casi lo tienes";;
acierto_repetido) echo "$(tput setaf 3)Upps, Esa letra ya la has introducido";;
esac
}
function init {
#file="diccionario"
file="paises"
max=$(cat $file | wc -l)
num=$(( $RANDOM%$max ))
palabra=$(head -$num $file | tail -1)
aciertos=0
#diccionario
#palabra=$(echo ${palabra%% *,,} | sed 's/á/a/g;s/é/e/g;s/í/i/g;s/ó/o/g;s/ú/u/g')
palabra=$(echo ${palabra,,} | sed 's/á/a/g;s/é/e/g;s/í/i/g;s/ó/o/g;s/ú/u/g;s/-/ /g;s/Á/a/g')
long_palabra=${#palabra}
comodines=$(( long_palabra/4 ))
score=$(( (comodines*50)+500 ))
#PROVISIONAL
###########################
#[[ $long_palabra -lt 15 ]] &amp;&amp; main;
###########################
unset array[*]
i=0; espacios=0; unset word
while [[ $i -le $(( $long_palabra-1 )) ]]
do
caracter="${palabra:$i:1}"
if [[ $caracter = " " ]]
then
(( espacios++ ))
caracter=" "
else
array=( ${array[*]} $caracter )
caracter="-"
fi
word="$word $caracter"
(( i++ ))
done
}
function comodin {
if [[ $comodines -gt 0 ]]
then
long_array=$(( ${#array[*]}-1 ))
index=$(( $RANDOM%${#array[*]} ))
caracter=${array[$index]}
i=0
while [[ $i -le $long_array ]]
do
if [[ ${array[$i]} = $caracter ]]
then
unset array[$i]
array2=( ${array2[*]} $caracter )
(( aciertos++ ))
score=$(( score+50 ))
fi
(( i++ ))
done
array=( ${array[*]} )
array2=( ${array2[*]} )
(( comodines-- ))
(( intentos-- ))
mensage="comodines_restantes"; message mensage
else
(( intentos-- ))
mensage="comodines_finalizados"; message mensage
fi
mensage="continuar"; message mensage
game
}
function acierto {
unset find
long_array=$(( ${#array[*]}-1 ))
i=0
while [[ $i -le $long_array ]]
do
if [[ ${array[$i]} = $caracter ]]
then
unset array[$i]
find="true"
array2=( ${array2[*]} $caracter )
(( aciertos++ ))
score=$(( score+100 ))
fi
(( i++ ))
done
if [[ $find = "true" ]]
then
mensage="acierto_bien"; message mensage
(( intentos-- ))
else
long_array2=$(( ${#array2[*]}-1 ))
i=0
while [[ $i -le $long_array2 ]]
do
if [[ ${array2[$i]} = $caracter ]]
then
find="true"
fi
(( i++ ))
done
if [[ $find = "true" ]]
then
mensage="acierto_repetido"; message mensage
(( intentos-- ))
score=$(( score-10 ))
else
mensage="acierto_mal"; message mensage
score=$(( score-50 ))
fi
fi
array=( ${array[*]} )
array2=( ${array2[*]} )
mensage="continuar"; message mensage
game
}
function game {
clear
lines=$(( $(tput lines)/10 ))
cols=$(( $(tput cols)/10 ))
i=0; unset word;
while [[ $i -le $(( $long_palabra-1 )) ]]
do
letra="${palabra:$i:1}"
if [[ $letra = " " ]]
then
letra=" "
else
unset letra_acertada
for x in ${array2[*]}
do
if [[ $x = $letra ]]
then
letra_acertada="true"
fi
done
if [[ $letra_acertada != "true" ]]
then
letra="-"
fi
fi
word="$word $letra"
(( i++ ))
done
(( intentos++ ))
mensage="game_banner"; message mensage
dibujo
if [[ $intentos -gt 5 ]]
then
[[ $best_score -eq 0 ]] &amp;&amp; best_score=0
[[ $acumulado -eq 0 ]] &amp;&amp; acumulado=0
salir
fi
if [[ -z ${array[*]} ]]
then
[[ $score -gt $best_score ]] &amp;&amp; best_score=$score
acumulado=$(( acumulado+score ))
mensage="game_over"; message mensage
salir
fi
mensage="game_read"; message mensage
if [[ $caracter = "+" ]]
then
comodin
fi
acierto
}
function dibujo {
case $intentos in
1) echo "________________ "
echo " | "
echo " | "
echo " O "
echo;;
2) echo "________________ "
echo " | "
echo " | "
echo " O "
echo " | "
echo " | "
echo;;
3) echo "________________ "
echo " | "
echo " | "
echo " O "
echo " \| "
echo " | "
echo;;
4) echo "________________ "
echo " | "
echo " | "
echo " O "
echo " \|/"
echo " | "
echo;;
5) echo "________________ "
echo " | "
echo " | "
echo " O "
echo " \|/"
echo " | "
echo " / "
echo;;
*) echo "________________ "
echo " | "
echo " | "
echo " O "
echo " \|/"
echo " | "
echo " / \\"
echo;;
esac
}
function salir {
mensage="salir"; message mensage
case $caracter in
q) clear;exit;;
g) unset word; unset intentos; unset comodines; unset aciertos; unset score; unset array[*]; unset array2[*];main;;
*) clear; mensage="game_banner"; message mensage; dibujo; salir;;
esac
clear
}
function main {
init
game
}
main
</pre>
<pre class="brush:plain">
Permisos: chmod 700 ahorcado.bash &lt;/br&gt;
Ejecución: ./ahorcado.bash &lt;/br&gt;
Y a jugar! :D &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# Add user to Samba
USER=${1}
GROUP=repositorio
if [ -z ${1} ]; then
printf "Use: addsmbuser [username]\n"
exit 1
fi
if [ ! $(grep ${1} /etc/passwd) ]; then
/usr/sbin/useradd ${1} -n -s /sbin/nologin -g ${GROUP}
else
printf "User exist in /etc/passwd\n"
fi
/usr/sbin/smbpasswd -a -e ${1}
exit $?
</pre>
<pre class="brush:plain">
Permisos: chmod 700 addsmbuser.bash &lt;/br&gt;
Ejecución: ./addsmbuser.bash [ nombre de usuario ] &lt;/br&gt;
</pre>
<pre class="brush:perl">
#!/usr/bin/perl -w
# findshell v1.0 == code taken/modified from traps.darkmindz.com
#usage: ./findshell.pl [ sensitivity 1-50 ] [ directory to scan ]
use strict;
use File::Find;
my $sens = shift || 10;
my $folder = shift || './';
find(\&amp;backdoor, "$folder");
sub backdoor {
if ((/\.(php|txt)/)){
open (my $IN,"&lt;$_") || die "can not open datei $File::Find::name: $!";
my @file = &lt;$IN&gt;;
#maybe evil stuffs
my $score = grep (/function_exists\(|phpinfo\(|safe_?mode|shell_exec\(|popen\(|passthru\(|system\(|myshellexec\(|exec\(|getpwuid\(|getgrgid \(|fileperms\(/i,@file);
#probably evil stuffs
my $tempscore = grep(/\`\$\_(post|request|get).{0,20}\`|(include|require|eval|system|passthru|shell_exec).{0,10}\$\_(post|request|get)|eval.{0,10}base64_decode|back_connect|backdoor|r57|PHPJackal|PhpSpy|GiX|Fx29SheLL|w4ck1ng|milw0rm|PhpShell|k1r4|FeeLCoMz|FaTaLisTiCz|Ve_cENxShell|UnixOn|C99madShell|Spamfordz|Locus7s|c100|c99|x2300|cgitelnet|webadmin|cybershell|STUNSHELL|Pr!v8|PHPShell|KaMeLeOn|S4T|oRb|tryag|sniper|noexecshell|\/etc\/passwd|revengans/i, @file);
$score += 50 * $tempscore;
print "$score - Possible backdoor : $File::Find::name\n" if ($score &gt; $sens-1 );
close $IN;
}elsif((/\.(jpg|jpeg|gif|png|tar|zip|gz|rar|pdf)/)){
open (my $IN,"&lt;$_") || (print "can not open datei $File::Find::name: $!" &amp;&amp; next);
print "5000 - Possible backdoor (php in non-php file): $File::Find::name\n" if grep /(\&lt;\?php|include(\ |\())/i, &lt;$IN&gt;;
close $IN;
}
}
</pre>
<pre class="brush:plain">
Permisos: chmod 700 findshell.pl &lt;/br&gt;
Ejecución: ./findhsell.pl [ sensibilidad del escaneo 1-50 ] [ directorio a escanear ]
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# -------------------------------------------------------------------------------------------------------
# set -x
# Shell script to monitor or watch the disk space
# It will send an email to $ADMIN, if the (free available) percentage of space is &gt;= 90%.
# -------------------------------------------------------------------------------------------------------
# Set admin email so that you can get email.
ADMIN="[email protected]"
# set alert level 90% is default
ALERT=90
# Exclude list of unwanted monitoring, if several partions then use "|" to separate the partitions.
# An example: EXCLUDE_LIST="/dev/sdb1|/dev/sdc5"
EXCLUDE_LIST=""
#
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#
date=$(date "+%D %H:%m:%S")
function main_prog()
{
while read output;
do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
partition=$(echo $output | awk '{print $2}')
if [[ $usep -ge $ALERT ]] ; then
echo -e "ALERT: $date \n\t Running out of space $partition ($usep%) on server: $(hostname)" | \
mail -s "AACREA Alert: $(hostname) Almost out of disk space $usep%" $ADMIN
logger -p local7.warn "Running out of space $partition ($usep) - Email sent to $ADMIN"
fi
done
}
if [ "$EXCLUDE_LIST" != "" ] ; then
df -H | grep -vE "^Filesystem|tmpfs|cdrom|${EXCLUDE_LIST}" | awk '{print $5 " " $6}' | main_prog
else
df -H | grep -vE "^Filesystem|tmpfs|cdrom" | awk '{print $5 " " $6}' | main_prog
fi
</pre>
<pre class="brush:plain">
Permisos: chmod 700 email-alertfs.bash &lt;/br&gt;
Ejecución: ./email-alertfs.bash
</pre>
<hr/><pre class="brush:bash">
#!/bin/sh
# Check all hosts within the network
# BSD license
PING=/sbin/ping
SEQ=gseq
NET=192.168.2
ME=192.168.0.2
i=1;
while [ $i -le 254 ] ;
do
$PING -v -D -s 8 -t 1 -w 1 -c 1 -I $ME $NET.$i 1&gt;/dev/null
printf "$?"
i=`expr $i + 1` ;
done
printf "\n"
</pre>
<pre class="brush:plain">
Permisos: chmod 700 CheckHostAlive.bash &lt;/br&gt;
Ejecución: ./CheckHostAlive.bash.&lt;/br&gt;
Nota: El script mandará el ping del primer nódo al último [ 0-254 ]
</pre>
<hr/><pre class="brush:bash">$ django_backup /path/to/my/proj
$ django_backup --db-only /path/to/my/proj</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# (C) 2009 Guy Rutenberg
# Backup Django sites
BACKUP_DIR=
FTP_HOST=
FTP_USER=
FTP_PASS=
FTP_BACKUP_DIR=
# end of user configurable section
PROG=`basename "$0"`
print_usage () {
echo "USAGE: $0 [options] PROJ_ROOT"
echo "Backup a Django project located in PROJ_ROOT"
}
print_help () {
print_usage
cat &amp;lt;&amp;lt; EOF
Options:
-h, --help show this help message and exit
--db-only only backup the database
EOF
}
TEMP=`getopt -o h --long help,db-only -n "$PROG" -- "$@"`
if (($?)); then
print_usage
exit 1
fi
eval set -- "$TEMP"
DB_ONLY=0
while true ; do
case "$1" in
-h|--help) print_help; exit ;;
--db-only) DB_ONLY="1" ; shift ;;
--) shift; break;;
esac
done
if [ -z "$1" ]
then
print_usage &amp;gt; /dev/stderr
exit 1
fi
PROJECT_DIR=$1
# extract database variables from settings.py
cd "$PROJECT_DIR"
DB_ENGINE=`python -c "from settings import *; print DATABASE_ENGINE"`
if [ "$DB_ENGINE" != "mysql" ]; then
echo $DB_ENGINE
echo "Only mysql databases are supported!"&amp;gt;/dev/stderr
exit 1
fi
DB_NAME=`python -c "from settings import *; print DATABASE_NAME"`
DB_USER=`python -c "from settings import *; print DATABASE_USER"`
DB_PASS=`python -c "from settings import *; print DATABASE_PASSWORD"`
DB_HOST=`python -c "from settings import *; print DATABASE_HOST"`
#TODO find how to use it
DB_PORT=`python -c "from settings import *; print DATABASE_PORT"`
# set optional parameters: host, port
HOST_ARGS=''
if [ -n "$DB_HOST" ]; then
HOST_ARGS="--host $DB_HOST"
fi
PORT_ARGS=''
if [ -n "$DB_PORT" ]; then
PORT_ARGS="--port $DB_HOST"
fi
SITE_DIR=`dirname "$PROJECT_DIR"`/`basename "$PROJECT_DIR"`
BACKUP_DIR=`dirname "$BACKUP_DIR"`/`basename "$BACKUP_DIR"`
echo -n "dumping database... "
DUMP_NAME=${DB_NAME}-$(date +%Y%m%d).sql.bz2
mysqldump --user=${DB_USER} --password=${DB_PASS} $HOST_ARGS \
$PORT_ARGS --databases ${DB_NAME} \
| bzip2 -c &amp;gt; ${BACKUP_DIR}/${DUMP_NAME}
if (($?)); then
echo "failed!"
exit 1
fi
echo "done"
PUT_TARBALL_FTP=""
if [ "$DB_ONLY" -eq "0" ]; then
echo -n "Creating tarball... "
TAR_NAME=${SITE_DIR##*/}-$(date +%Y%m%d).tar.bz2
tar -cjf ${BACKUP_DIR}/${SITE_DIR##*/}-$(date +%Y%m%d).tar.bz2 ${SITE_DIR}
if (($?)); then
echo "failed!"
exit 2
fi
echo "done"
PUT_TARBALL_FTP="put \"${BACKUP_DIR}/${TAR_NAME}\""
fi
echo -n "Uploading backup to FTP... "
lftp -u ${FTP_USER},${FTP_PASS} ${FTP_HOST} &lt;eof "${backup_dir}="" "${ftp_backup_dir}"="" "done"="" "failed!"="" ${dump_name}"="" ${put_tarball_ftp}="" (($?));="" 3="" &lt;="" cd="" echo="" eof="" exit="" fi="" if="" pre="" put="" then=""&gt;&lt;/eof&gt;</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# Print the current Internet IP address
#--- CONFIG HERE ---
CURL='/usr/bin/curl'
NC='/usr/bin/netcat'
SERVER='http://checkip.dyndns.org/'
PORT=80
#--------------------
[ -e ${CURL} ] &amp;&amp; ( ${CURL} -s ${SERVER} | tr '&gt;' '\n' | tr '&lt;' '\n' | grep 'Current IP Address:' ; exit $? )
[ -e ${NC} ] &amp;&amp; ( echo -ne "GET /index.html HTTP/1.0\n\n" | \
${NC} ${SERVER} ${PORT} | tr '&gt;' '\n' | tr '&lt;' '\n' | \
grep 'Current IP Address:' | sed 's|Current IP Address:|inet ip:|g'; exit $? )
</pre>
<pre class="brush:plain">
Permisos: chmod 700 show2.bash &lt;/br&gt;
Ejecución: ./show2.bash &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
case ${1#*.}
in
c)
GCC=`which gcc`
$GCC "$1" -o "${1%%.*}" &amp;&amp; {
Xdialog --msgbox "Archivo compilado correctamente: \n${1%%.*}" 10 50
exit 0;
} || {
Xdialog --msgbox "Compilación fallida" 10 30
exit 1;
}
;;
cpp)
GPP=`which g++`
$GPP "$1" -o "${1%%.*}" &amp;&amp; {
Xdialog --msgbox "Archivo compilado correctamente: \n${1%%.*}" 10 50
exit 0;
} || {
Xdialog --msgbox "Compilación fallida" 10 30
exit 1;
}
;;
*)
echo -e "Error, código fuente no C ó C++";
exit 1;
esac
</pre>
<hr/><pre class="brush:bash">chmod +x ./Compilar.sh</pre>
<hr/><pre class="brush:bash">~/.gnome2/nautilus-scripts</pre>
<hr/><pre class="brush:bash">
#!/bin/sh
IP=/bin/ip
SED=/bin/sed
CUT=/usr/bin/cut
IF=en0
if [ ! -z ${1} ]
then
IF=${1}
fi
$IP addr show dev $IF | $SED -n 3p | $SED -e 's/\ \+/\ /g' -e 's/\/.*$//g' | $CUT -d ' ' -f 3
</pre>
<pre class="brush:plain">
Permisos: chmod 700 show.bash &lt;/br&gt;
Ejecución: ./show.bash &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
echo "Resizing jpg. This may take some time. Please stand-by."
for img in `ls *.JPG`
do
echo "processing" $img
convert $img -resize 1600x1200 file-$img
rm $img
done
echo "Done. Have a nice day!"</pre>
<pre class="brush:plain">~/.gnome2/nautilus-scripts</pre>
<hr/><pre class="brush:bash">#!/bin/bash
function doCompress() {
if [ $overwritable -eq 1 ] &amp;amp;&amp;amp; [ ! -e "_compressed" ]; then
mkdir "_compressed"
if [ ! $? -eq 0 ]; then
zenity --error --title="Compress image" --text="Can not create destination folder"
exit 1
fi
fi
failedCount=0
tmp=$IFS
IFS=$'\n'
for f in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
s=$( identify -format "%m" "$f" )
if [ "$s" == "JPEG" ]; then
if [ $overwritable -eq 1 ]; then
dest="_compressed/$( basename "$f" )"
else
dest=$f
fi
echo "Proccessing $f"
convert "$f" -quality $ratio "$dest"
if [ ! $? -eq 0 ]; then
let failedCount++
fi
else
let failedCount++
fi
done
IFS=$tmp
if [ $failedCount -eq 0 ]; then
zenity --info --title="Compress image" --text="All files was compressed successfully"
else
zenity --warning --title="Compress image" --text="There were $failedCount files failed"
fi
}
# checking input file &amp;amp; get 1 file to preview simple
imgAvailable=0
tmp=$IFS
IFS=$'\n'
for f in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
s=$( identify -format "%m" "$f" )
if [ "$s" == "JPEG" ]; then
imgAvailable=1
previewFile=$f
break
fi
done
IFS=$tmp
if [ $imgAvailable -eq 0 ]; then
zenity --error --title="Compress images" --text="Please select JPEG file(s)"
exit 1
fi
zenity --question --title="Compress images" --text="Overwrite the original file?"
overwritable=$?
zenity --question --title="Compress images" --text="Preview?"
previewable=$?
stopable=0
ratio=90
while [ $stopable -eq 0 ]; do
# Ask for compress ratio
ratio=$( zenity --scale --title="Compress images ratio" --text="High number make high quality image but big file size" --min-value=1 --max-value=100 --value=$ratio )
if [ $? -eq 0 ]; then
if [ $previewable -eq 0 ]; then
previewedFile=$( echo "/tmp/$( basename "$previewFile" )")
if [ -e "$previewedFile" ]; then
rm "$previewedFile"
fi
convert "$previewFile" -quality $ratio "$previewedFile" | zenity --progress --title="Making preview..." --auto-close --no-cancel --pulsate
gvfs-open "$previewedFile"
zenity --question --title="Agree with ratio $ratio?" --text="Origin: $( du -h "$previewFile" ). Result: $( du -h "$previewedFile" )."
if [ $? -eq 0 ]; then
doCompress | zenity --progress --title="Compressing..." --auto-close --no-cancel --pulsate
stopable=1
fi
rm "$previewedFile"
else
doCompress | zenity --progress --title="Compressing..." --auto-close --no-cancel --pulsate
stopable=1
fi
else
stopable=1
fi
done</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# A simple shell script to clean (delete) ~/.known_hosts file hostname entry.
# This is useful when remote server reinstalled or ssh keys are changed!
# -------------------------------------------------------------------------
# Copyright (c) 2007 nixCraft project [http://cyberciti.biz/fb/]
# 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.
# -------------------------------------------------------------------------
host="$1"
[[ $# -eq 0 ]] &amp;&amp; { echo "Usage: $0 host.name.com"; exit 1;}
ips=$(host "$host" | awk -F'address' '{ print $2}' | sed -e 's/^ //g')
ssh-keygen -R "$host"
for i in $ips
do
ssh-keygen -R "$i"
done
exit $?
</pre>
<pre class="brush:plain">
Permisos de ejecución: chmod 700 revoke-ssh.bash &lt;/br&gt;
Ejecución del script: ./revoke-ssh.bash nombre.dominio o ./revoke-ssh.bash IP.
</pre>
<hr/><pre class="brush:bash">$ python respaldo.py</pre>
<pre class="brush:plain">pg_restore -d db -U postgres db.tar</pre>
<pre class="brush:python"></pre>
<pre class="brush:python"></pre>
<pre class="brush:python"></pre>
<pre class="brush:python">#!/usr/bin/env python
import time
import datetime
import os
def nombre_archivo():
'''
Permite Crear el nombre del archivo que tendra el respaldo
tomando como nombre la fecha dd-mm-aa y la hora hh:mm:ss
Quedando de la siguiente manera suponiendo que fue realizado
en la siguiente fecha (24/12/2011 10:30:00) , el resultado seria
el siguiente: 24_12_2011_103000
t = time.localtime()
dia = t.tm_mday
mes = t.tm_mon
ano = t.tm_year
hora = t.tm_hour
minutos = t.tm_min
seg = t.tm_sec
nombre = '%s-%s-%s_%s:%s:%s' % (dia, mes, ano, hora, minutos, seg)
'''
t = datetime.datetime.now()
nombre = t.strftime('%d_%m_%Y_%I%M%S')
return nombre
def leer_config():
'''
Toma los valores del archivo de configuracion llamado config.cfg y los
guarda en un diccionario {clave:valor} el cual retorna al finalizar.
Informacion del archivo config.cfg:
ipservidor=10.121.6.4
nombrebasedatos=bdhcoromoto
usuariobasedatos=admhc
rutarespaldo=/media/respaldo
nombrearchivo=pg_bdhcoromoto_
'''
diccionario = {}
ruta = "/home/cgarcia/desarrollo/python/respaldo-potgres/config/config.cfg"
for linea in file(ruta):
if linea[0] != '#':
separar = linea.split('=')
if len(separar) &amp;gt; 1:
dicc_clave = separar[0]
dicc_valor = separar[1].rstrip() # rstrip elimina el retor d c
diccionario[dicc_clave] = dicc_valor
return diccionario
def respaldo_pg():
'''
Toma los parametros del diccionario con el cual se arma el nombre y
la ruta que tendra el archivo del respaldo asi como tambien arma
el comando final a ejecutar
'''
diccio = leer_config()
dic_ipservidor = diccio['ipservidor']
dic_nombrebasedatos = diccio['nombrebasedatos']
dic_usuariobasedatos = diccio['usuariobasedatos']
dic_rutarespaldo = diccio['rutarespaldo']
dic_nombrearchivo = diccio['nombrearchivo']
archivofinal = os.path.join(dic_rutarespaldo, dic_nombrearchivo + \
nombre_archivo() + '.tar')
comando = 'pg_dump'
'''
-Parametros a pasar(Estos tambien se pudieran colocar dentro del
archivo config.cfg),
- pero por ahora lo dejaremos asi directo como texto
-Ft Significa Format tar
-b Inclute campos Blobs
-h es el host o la ip del servidor
-W password
'''
comando_a_ejecutar = '%s -Ft -b -h %s %s -U %s &amp;gt; %s' % \
(comando, dic_ipservidor, dic_nombrebasedatos, dic_usuariobasedatos,\
archivofinal)
return comando_a_ejecutar
if __name__ == '__main__':
print 'Espere un momento ejecutando Proceso de Respaldo...'
respaldar = respaldo_pg()
print respaldar
os.system(respaldar)
print '*** Respaldo Realizado con Exito ***'</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# A sample shell script to print domain ip address hosting information such as
# Location of server, city, ip address owner, country and network range.
# This is useful to track spammers or research purpose.
# -------------------------------------------------------------------------
# Copyright (c) 2006 nixCraft project [http://cyberciti.biz/fb/]
# 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.
# -------------------------------------------------------------------------
# Last updated on Mar/05/2010
# -------------------------------------------------------------------------
# Get all domains
_dom=$@
# Die if no domains are given
[ $# -eq 0 ] &amp;&amp; { echo "Usage: $0 domain1.com domain2.com ..."; exit 1; }
for d in $_dom
do
_ip=$(host $d | grep 'has add' | head -1 | awk '{ print $4}')
[ "$_ip" == "" ] &amp;&amp; { echo "Error: $d is not valid domain or dns error."; continue; }
echo "Getting information for domain: $d [ $_ip ]..."
whois "$_ip" | egrep -w 'OrgName:|City:|Country:|OriginAS:|NetRange:'
echo ""
done
</pre>
<pre class="brush:plain">
Establecemos permisos de ejecución &lt;/br&gt;
chmod +x dom.bash&lt;/br&gt;
Ejecutamos el script pasando como parámetro un dominio o varios&lt;/br&gt;
./dom.bash cyberciti.biz google.com &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
FCONF=/etc/myip
MAIL=tu_direccion_de_correo
SERVER=servidor_smtp
# Get your ip
ip=`getip eth0 | head -n 1 | cut -d ":" -f 2`;
# Get your old ip
oldip=`head -n 1 $FCONF`
# If ip has changed, send email
# and save new ip in config file
if [ $ip != $oldip ];
then
sendEmail -f $MAIL -t $MAIL -u "Your ip: ${ip}" -m " " -s $SERVER
echo $ip &amp;gt; $FCONF;
fi</pre>
<hr/><pre class="brush:bash">sudo touch /etc/myip
sudo chmod a+w /etc/myip</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
#
# The BSD License (http://www.opensource.org/licenses/bsd-license.php)
# specifies the terms and conditions of use for checksec.sh:
#
# Copyright (c) 2009-2011, Tobias Klein.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# * Neither the name of Tobias Klein nor the name of trapkit.de may be
# used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
# DAMAGE.
#
# Name : checksec.sh
# Version : 1.5
# Author : Tobias Klein
# Date : November 2011
# Download: http://www.trapkit.de/tools/checksec.html
# Changes : http://www.trapkit.de/tools/checksec_changes.txt
#
# Description:
#
# Modern Linux distributions offer some mitigation techniques to make it
# harder to exploit software vulnerabilities reliably. Mitigations such
# as RELRO, NoExecute (NX), Stack Canaries, Address Space Layout
# Randomization (ASLR) and Position Independent Executables (PIE) have
# made reliably exploiting any vulnerabilities that do exist far more
# challenging. The checksec.sh script is designed to test what *standard*
# Linux OS and PaX (http://pax.grsecurity.net/) security features are being
# used.
#
# As of version 1.3 the script also lists the status of various Linux kernel
# protection mechanisms.
#
# Credits:
#
# Thanks to Brad Spengler (grsecurity.net) for the PaX support.
# Thanks to Jon Oberheide (jon.oberheide.org) for the kernel support.
# Thanks to Ollie Whitehouse (Research In Motion) for rpath/runpath support.
#
# Others that contributed to checksec.sh (in no particular order):
#
# Simon Ruderich, Denis Scherbakov, Stefan Kuttler, Radoslaw Madej,
# Anthony G. Basile, Martin Vaeth and Brian Davis.
#
# global vars
have_readelf=1
verbose=false
# SELinux prefix
# Set where the script must search for the SELinux bin files.
se_prefix='/usr/sbin'
# FORTIFY_SOURCE vars
FS_end=_chk
FS_cnt_total=0x
FS_cnt_checked=0
FS_cnt_unchecked=0
FS_chk_func_libc=0
FS_functions=0
FS_libc=0
# version information
version() {
echo "checksec v1.5, Tobias Klein, www.trapkit.de, November 2011"
echo
}
# help
help() {
echo "Usage: checksec [OPTION]"
echo
echo "Options:"
echo
echo " --file &lt;executable-file&gt;"
echo " --dir &lt;directory&gt; [-v]"
echo " --proc &lt;process name | process ID&gt;"
echo " --proc-all"
echo " --proc-libs &lt;process ID&gt;"
echo " --kernel"
echo " --fortify-file &lt;executable-file&gt;"
echo " --fortify-proc &lt;process ID&gt;"
echo " --version"
echo " --help"
echo
echo "For more information, see:"
echo " http://www.trapkit.de/tools/checksec.html"
echo
}
# check if command exists
command_exists () {
type $1 &gt; /dev/null 2&gt;&amp;1;
}
# check if directory exists
dir_exists () {
[ -d $1 ] || return 1
}
# check user privileges
root_privs () {
[ $UID -eq 0 ] || return 1
}
# check if input is numeric
isNumeric () {
echo "$@" | grep -q -v "[^0-9]" &amp;&amp; return 0
}
# check if input is a string
isString () {
echo "$@" | grep -q -v "[^A-Za-z]" &amp;&amp; return 0
}
# check file(s)
filecheck() {
# check for RELRO support
if readelf -l $1 2&gt;/dev/null | grep -q 'GNU_RELRO'; then
if readelf -d $1 2&gt;/dev/null | grep -q 'BIND_NOW'; then
echo -n -e '\033[32mFull RELRO \033[m '
else
echo -n -e '\033[33mPartial RELRO\033[m '
fi
else
echo -n -e '\033[31mNo RELRO \033[m '
fi
# check for stack canary support
if readelf -s $1 2&gt;/dev/null | grep -q '__stack_chk_fail'; then
echo -n -e '\033[32mCanary found \033[m '
else
echo -n -e '\033[31mNo canary found\033[m '
fi
# check for NX support
if readelf -W -l $1 2&gt;/dev/null | grep 'GNU_STACK' | grep -q 'RWE'; then
echo -n -e '\033[31mNX disabled\033[m '
else
echo -n -e '\033[32mNX enabled \033[m '
fi
# check for PIE support
if readelf -h $1 2&gt;/dev/null | grep -q 'Type:[[:space:]]*EXEC'; then
echo -n -e '\033[31mNo PIE \033[m '
elif readelf -h $1 2&gt;/dev/null | grep -q 'Type:[[:space:]]*DYN'; then
if readelf -d $1 2&gt;/dev/null | grep -q '(DEBUG)'; then
echo -n -e '\033[32mPIE enabled \033[m '
else
echo -n -e '\033[33mDSO \033[m '
fi
else
echo -n -e '\033[33mNot an ELF file\033[m '
fi
# check for rpath / run path
if readelf -d $1 2&gt;/dev/null | grep -q 'rpath'; then
echo -n -e '\033[31mRPATH \033[m '
else
echo -n -e '\033[32mNo RPATH \033[m '
fi
if readelf -d $1 2&gt;/dev/null | grep -q 'runpath'; then
echo -n -e '\033[31mRUNPATH \033[m '
else
echo -n -e '\033[32mNo RUNPATH \033[m '
fi
}
# check process(es)
proccheck() {
# check for RELRO support
if readelf -l $1/exe 2&gt;/dev/null | grep -q 'Program Headers'; then
if readelf -l $1/exe 2&gt;/dev/null | grep -q 'GNU_RELRO'; then
if readelf -d $1/exe 2&gt;/dev/null | grep -q 'BIND_NOW'; then
echo -n -e '\033[32mFull RELRO \033[m '
else
echo -n -e '\033[33mPartial RELRO \033[m '
fi
else
echo -n -e '\033[31mNo RELRO \033[m '
fi
else
echo -n -e '\033[31mPermission denied (please run as root)\033[m\n'
exit 1
fi
# check for stack canary support
if readelf -s $1/exe 2&gt;/dev/null | grep -q 'Symbol table'; then
if readelf -s $1/exe 2&gt;/dev/null | grep -q '__stack_chk_fail'; then
echo -n -e '\033[32mCanary found \033[m '
else
echo -n -e '\033[31mNo canary found \033[m '
fi
else
if [ "$1" != "1" ] ; then
echo -n -e '\033[33mPermission denied \033[m '
else
echo -n -e '\033[33mNo symbol table found\033[m '
fi
fi
# first check for PaX support
if cat $1/status 2&gt; /dev/null | grep -q 'PaX:'; then
pageexec=( $(cat $1/status 2&gt; /dev/null | grep 'PaX:' | cut -b6) )
segmexec=( $(cat $1/status 2&gt; /dev/null | grep 'PaX:' | cut -b10) )
mprotect=( $(cat $1/status 2&gt; /dev/null | grep 'PaX:' | cut -b8) )
randmmap=( $(cat $1/status 2&gt; /dev/null | grep 'PaX:' | cut -b9) )
if [[ "$pageexec" = "P" || "$segmexec" = "S" ]] &amp;&amp; [[ "$mprotect" = "M" &amp;&amp; "$randmmap" = "R" ]] ; then
echo -n -e '\033[32mPaX enabled\033[m '
elif [[ "$pageexec" = "p" &amp;&amp; "$segmexec" = "s" &amp;&amp; "$randmmap" = "R" ]] ; then
echo -n -e '\033[33mPaX ASLR only\033[m '
elif [[ "$pageexec" = "P" || "$segmexec" = "S" ]] &amp;&amp; [[ "$mprotect" = "m" &amp;&amp; "$randmmap" = "R" ]] ; then
echo -n -e '\033[33mPaX mprot off \033[m'
elif [[ "$pageexec" = "P" || "$segmexec" = "S" ]] &amp;&amp; [[ "$mprotect" = "M" &amp;&amp; "$randmmap" = "r" ]] ; then
echo -n -e '\033[33mPaX ASLR off\033[m '
elif [[ "$pageexec" = "P" || "$segmexec" = "S" ]] &amp;&amp; [[ "$mprotect" = "m" &amp;&amp; "$randmmap" = "r" ]] ; then
echo -n -e '\033[33mPaX NX only\033[m '
else
echo -n -e '\033[31mPaX disabled\033[m '
fi
# fallback check for NX support
elif readelf -W -l $1/exe 2&gt;/dev/null | grep 'GNU_STACK' | grep -q 'RWE'; then
echo -n -e '\033[31mNX disabled\033[m '
else
echo -n -e '\033[32mNX enabled \033[m '
fi
# check for PIE support
if readelf -h $1/exe 2&gt;/dev/null | grep -q 'Type:[[:space:]]*EXEC'; then
echo -n -e '\033[31mNo PIE \033[m '
elif readelf -h $1/exe 2&gt;/dev/null | grep -q 'Type:[[:space:]]*DYN'; then
if readelf -d $1/exe 2&gt;/dev/null | grep -q '(DEBUG)'; then
echo -n -e '\033[32mPIE enabled \033[m '
else
echo -n -e '\033[33mDynamic Shared Object\033[m '
fi
else
echo -n -e '\033[33mNot an ELF file \033[m '
fi
}
# check mapped libraries
libcheck() {
libs=( $(awk '{ print $6 }' /proc/$1/maps | grep '/' | sort -u | xargs file | grep ELF | awk '{ print $1 }' | sed 's/:/ /') )
printf "\n* Loaded libraries (file information, # of mapped files: ${#libs[@]}):\n\n"
for element in $(seq 0 $((${#libs[@]} - 1)))
do
echo " ${libs[$element]}:"
echo -n " "
filecheck ${libs[$element]}
printf "\n\n"
done
}
# check for system-wide ASLR support
aslrcheck() {
# PaX ASLR support
if !(cat /proc/1/status 2&gt; /dev/null | grep -q 'Name:') ; then
echo -n -e ':\033[33m insufficient privileges for PaX ASLR checks\033[m\n'
echo -n -e ' Fallback to standard Linux ASLR check'
fi
if cat /proc/1/status 2&gt; /dev/null | grep -q 'PaX:'; then
printf ": "
if cat /proc/1/status 2&gt; /dev/null | grep 'PaX:' | grep -q 'R'; then
echo -n -e '\033[32mPaX ASLR enabled\033[m\n\n'
else
echo -n -e '\033[31mPaX ASLR disabled\033[m\n\n'
fi
else
# standard Linux 'kernel.randomize_va_space' ASLR support
# (see the kernel file 'Documentation/sysctl/kernel.txt' for a detailed description)
ASLR=$(/sbin/sysctl -n kernel.randomize_va_space 2&gt; /dev/null)
printf " (Address Space Layout Randomization): "
if [ ! -z $ASLR ] ; then
if [ $ASLR -ge 2 ]; then
echo -n -e '\033[32mOn (Setting: 2)\033[m\n\n'
printf " Description - Make the addresses of mmap base, heap, stack and VDSO page randomized.\n"
printf " This, among other things, implies that shared libraries will be loaded to random \n"
printf " addresses. Also for PIE-linked binaries, the location of code start is randomized.\n\n"
elif [ $ASLR -eq 1 ]; then
echo -n -e '\033[33mOn (Setting: 1)\033[m\n\n'
printf " Description - Make the addresses of mmap base, stack and VDSO page randomized.\n"
printf " This, among other things, implies that shared libraries will be loaded to \n"
printf " random addresses. Also for PIE-linked binaries, the location of code start\n"
printf " is randomized. Heap addresses are *not* randomized.\n\n"
elif [ $ASLR -eq 0 ]; then
echo -n -e '\033[31mOff (Setting:0)\033[m\n'
fi
else
echo -n -e '\033[31mNot kernel support\033[m\n'
fi
printf " See the kernel file 'Documentation/sysctl/kernel.txt' for more details.\n\n"
fi
}
# check cpu nx flag
nxcheck() {
if grep -q nx /proc/cpuinfo; then
echo -n -e '\033[32mYes\033[m\n\n'
else
echo -n -e '\033[31mNo\033[m\n\n'
fi
}
# check for kernel protection mechanisms
kernelcheck() {
printf " Description - List the status of kernel protection mechanisms. Rather than\n"
printf " inspect kernel mechanisms that may aid in the prevention of exploitation of\n"
printf " userspace processes, this option lists the status of kernel configuration\n"
printf " options that harden the kernel itself against attack.\n\n"
printf " Kernel version: \033[33m%s\033[m - OS architecture: \033[33m%s\033[m\n" $(/bin/uname -r) $(/bin/uname -m)
printf " Kernel config : "
if [ -f /proc/config.gz ] ; then
kconfig="zcat /proc/config.gz"
printf "\033[32m/proc/config.gz\033[m\n\n"
elif [ -f /boot/config-`uname -r` ] ; then
kconfig="cat /boot/config-`uname -r`"
printf "\033[33m/boot/config-`uname -r`\033[m\n\n"
printf " Warning: The config on disk may not represent running kernel config!\n\n";
elif [ -f "${KBUILD_OUTPUT:-/usr/src/linux}"/.config ] ; then
kconfig="cat ${KBUILD_OUTPUT:-/usr/src/linux}/.config"
printf "\033[33m%s\033[m\n\n" "${KBUILD_OUTPUT:-/usr/src/linux}/.config"
printf " Warning: The config on disk may not represent running kernel config!\n\n";
else
printf "\033[31mNOT FOUND\033[m\n\n"
exit 0
fi
printf " GCC stack protector support: "
if $kconfig | grep -qi 'CONFIG_CC_STACKPROTECTOR=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Strict user copy checks: "
if $kconfig | grep -qi 'CONFIG_DEBUG_STRICT_USER_COPY_CHECKS=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Enforce read-only kernel data: "
if $kconfig | grep -qi 'CONFIG_DEBUG_RODATA=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Restrict /dev/mem access: "
if $kconfig | grep -qi 'CONFIG_STRICT_DEVMEM=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Restrict /dev/kmem access: "
if $kconfig | grep -qi 'CONFIG_DEVKMEM=y'; then
printf "\033[31mDisabled\033[m\n"
else
printf "\033[32mEnabled\033[m\n"
fi
printf "\n"
printf "* grsecurity / PaX: "
if $kconfig | grep -qi 'CONFIG_GRKERNSEC=y'; then
if $kconfig | grep -qi 'CONFIG_GRKERNSEC_HIGH=y'; then
printf "\033[32mHigh GRKERNSEC\033[m\n\n"
elif $kconfig | grep -qi 'CONFIG_GRKERNSEC_MEDIUM=y'; then
printf "\033[33mMedium GRKERNSEC\033[m\n\n"
elif $kconfig | grep -qi 'CONFIG_GRKERNSEC_LOW=y'; then
printf "\033[31mLow GRKERNSEC\033[m\n\n"
else
printf "\033[33mCustom GRKERNSEC\033[m\n\n"
fi
printf " Non-executable kernel pages: "
if $kconfig | grep -qi 'CONFIG_PAX_KERNEXEC=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Prevent userspace pointer deref: "
if $kconfig | grep -qi 'CONFIG_PAX_MEMORY_UDEREF=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Prevent kobject refcount overflow: "
if $kconfig | grep -qi 'CONFIG_PAX_REFCOUNT=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Bounds check heap object copies: "
if $kconfig | grep -qi 'CONFIG_PAX_USERCOPY=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Disable writing to kmem/mem/port: "
if $kconfig | grep -qi 'CONFIG_GRKERNSEC_KMEM=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Disable privileged I/O: "
if $kconfig | grep -qi 'CONFIG_GRKERNSEC_IO=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Harden module auto-loading: "
if $kconfig | grep -qi 'CONFIG_GRKERNSEC_MODHARDEN=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
printf " Hide kernel symbols: "
if $kconfig | grep -qi 'CONFIG_GRKERNSEC_HIDESYM=y'; then
printf "\033[32mEnabled\033[m\n"
else
printf "\033[31mDisabled\033[m\n"
fi
else
printf "\033[31mNo GRKERNSEC\033[m\n\n"
printf " The grsecurity / PaX patchset is available here:\n"
printf " http://grsecurity.net/\n"
fi
printf "\n"
printf "* Kernel Heap Hardening: "
if $kconfig | grep -qi 'CONFIG_KERNHEAP=y'; then
if $kconfig | grep -qi 'CONFIG_KERNHEAP_FULLPOISON=y'; then
printf "\033[32mFull KERNHEAP\033[m\n\n"
else
printf "\033[33mPartial KERNHEAP\033[m\n\n"
fi
else
printf "\033[31mNo KERNHEAP\033[m\n\n"
printf " The KERNHEAP hardening patchset is available here:\n"
printf " https://www.subreption.com/kernheap/\n\n"
fi
# Check SELinux support, status and configuration.
printf " SELinux support:"
if $kconfig | grep -qi 'CONFIG_SECURITY_SELINUX=y'; then
if [ ! -e ${se_prefix}/sestatus ] || [ ! -e ${se_prefix}/getenforce ]; then
printf "\033[31m SELinux kernel support but no utils installed\033[m\n\n"
exit
else
printf "\033[32m SELinux kernel support\033[m\n"
fi
if ( $kconfig 1&gt; /dev/null ); then
printf " SELinux mode: "
se_status=$($se_prefix/getenforce)
[ $se_status = 'Enforcing' ] &amp;&amp; printf "\033[32m Enforcing\033[m\n"
[ $se_status = 'Permissive' ] &amp;&amp; printf "\033[33m Permissive\033[m\n"
[ $se_status = 'Disabled' ] &amp;&amp; printf "\033[31m Disabled\033[m\n"
printf " SELinux policy:"
se_policy=$($se_prefix/sestatus | grep "Policy from config file" | awk -F: {'print $2'})
[ $se_policy = 'targeted' ] &amp;&amp; printf "\033[33m Targeted \033[m\n\n"
[ $se_policy = 'stric' ] &amp;&amp; printf "\033[32m Stric\033[m\n\n"
fi
printf " Warning: The config may represent the running SELinux config!\n\n"
else
printf "\033[31m No Kernel SELinux support\033[m\n\n"
fi
}
# --- FORTIFY_SOURCE subfunctions (start) ---
# is FORTIFY_SOURCE supported by libc?
FS_libc_check() {
printf "* FORTIFY_SOURCE support available (libc) : "
if [ "${#FS_chk_func_libc[@]}" != "0" ] ; then
printf "\033[32mYes\033[m\n"
else
printf "\033[31mNo\033[m\n"
exit 1
fi
}
# was the binary compiled with FORTIFY_SOURCE?
FS_binary_check() {
printf "* Binary compiled with FORTIFY_SOURCE support: "
for FS_elem_functions in $(seq 0 $((${#FS_functions[@]} - 1)))
do
if [[ ${FS_functions[$FS_elem_functions]} =~ _chk ]] ; then
printf "\033[32mYes\033[m\n"
return
fi
done
printf "\033[31mNo\033[m\n"
exit 1
}
FS_comparison() {
echo
printf " ------ EXECUTABLE-FILE ------- . -------- LIBC --------\n"
printf " FORTIFY-able library functions | Checked function names\n"
printf " -------------------------------------------------------\n"
for FS_elem_libc in $(seq 0 $((${#FS_chk_func_libc[@]} - 1)))
do
for FS_elem_functions in $(seq 0 $((${#FS_functions[@]} - 1)))
do
FS_tmp_func=${FS_functions[$FS_elem_functions]}
FS_tmp_libc=${FS_chk_func_libc[$FS_elem_libc]}
if [[ $FS_tmp_func =~ ^$FS_tmp_libc$ ]] ; then
printf " \033[31m%-30s\033[m | __%s%s\n" $FS_tmp_func $FS_tmp_libc $FS_end
let FS_cnt_total++
let FS_cnt_unchecked++
elif [[ $FS_tmp_func =~ ^$FS_tmp_libc(_chk) ]] ; then
printf " \033[32m%-30s\033[m | __%s%s\n" $FS_tmp_func $FS_tmp_libc $FS_end
let FS_cnt_total++
let FS_cnt_checked++
fi
done
done
}
FS_summary() {
echo
printf "SUMMARY:\n\n"
printf "* Number of checked functions in libc : ${#FS_chk_func_libc[@]}\n"
printf "* Total number of library functions in the executable: ${#FS_functions[@]}\n"
printf "* Number of FORTIFY-able functions in the executable : %s\n" $FS_cnt_total
printf "* Number of checked functions in the executable : \033[32m%s\033[m\n" $FS_cnt_checked
printf "* Number of unchecked functions in the executable : \033[31m%s\033[m\n" $FS_cnt_unchecked
echo
}
# --- FORTIFY_SOURCE subfunctions (end) ---
if !(command_exists readelf) ; then
printf "\033[31mWarning: 'readelf' not found! It's required for most checks.\033[m\n\n"
have_readelf=0
fi
# parse command-line arguments
case "$1" in
--version)
version
exit 0
;;
--help)
help
exit 0
;;
--dir)
if [ "$3" = "-v" ] ; then
verbose=true
fi
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
if [ -z "$2" ] ; then
printf "\033[31mError: Please provide a valid directory.\033[m\n\n"
exit 1
fi
# remove trailing slashes
tempdir=`echo $2 | sed -e "s/\/*$//"`
if [ ! -d $tempdir ] ; then
printf "\033[31mError: The directory '$tempdir' does not exist.\033[m\n\n"
exit 1
fi
cd $tempdir
printf "RELRO STACK CANARY NX PIE RPATH RUNPATH FILE\n"
for N in [A-Za-z]*; do
if [ "$N" != "[A-Za-z]*" ]; then
# read permissions?
if [ ! -r $N ]; then
printf "\033[31mError: No read permissions for '$tempdir/$N' (run as root).\033[m\n"
else
# ELF executable?
out=`file $N`
if [[ ! $out =~ ELF ]] ; then
if [ "$verbose" = "true" ] ; then
printf "\033[34m*** Not an ELF file: $tempdir/"
file $N
printf "\033[m"
fi
else
filecheck $N
if [ `find $tempdir/$N \( -perm -004000 -o -perm -002000 \) -type f -print` ]; then
printf "\033[37;41m%s%s\033[m" $2 $N
else
printf "%s%s" $tempdir/ $N
fi
echo
fi
fi
fi
done
exit 0
;;
--file)
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
if [ -z "$2" ] ; then
printf "\033[31mError: Please provide a valid file.\033[m\n\n"
exit 1
fi
# does the file exist?
if [ ! -e $2 ] ; then
printf "\033[31mError: The file '$2' does not exist.\033[m\n\n"
exit 1
fi
# read permissions?
if [ ! -r $2 ] ; then
printf "\033[31mError: No read permissions for '$2' (run as root).\033[m\n\n"
exit 1
fi
# ELF executable?
out=`file $2`
if [[ ! $out =~ ELF ]] ; then
printf "\033[31mError: Not an ELF file: "
file $2
printf "\033[m\n"
exit 1
fi
printf "RELRO STACK CANARY NX PIE RPATH RUNPATH FILE\n"
filecheck $2
if [ `find $2 \( -perm -004000 -o -perm -002000 \) -type f -print` ] ; then
printf "\033[37;41m%s%s\033[m" $2 $N
else
printf "%s" $2
fi
echo
exit 0
;;
--proc-all)
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
cd /proc
printf "* System-wide ASLR"
aslrcheck
printf "* Does the CPU support NX: "
nxcheck
printf " COMMAND PID RELRO STACK CANARY NX/PaX PIE\n"
for N in [1-9]*; do
if [ $N != $$ ] &amp;&amp; readlink -q $N/exe &gt; /dev/null; then
printf "%16s" `head -1 $N/status | cut -b 7-`
printf "%7d " $N
proccheck $N
echo
fi
done
if [ ! -e /usr/bin/id ] ; then
printf "\n\033[33mNote: If you are running 'checksec.sh' as an unprivileged user, you\n"
printf " will not see all processes. Please run the script as root.\033[m\n\n"
else
if !(root_privs) ; then
printf "\n\033[33mNote: You are running 'checksec.sh' as an unprivileged user.\n"
printf " Too see all processes, please run the script as root.\033[m\n\n"
fi
fi
exit 0
;;
--proc)
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
if [ -z "$2" ] ; then
printf "\033[31mError: Please provide a valid process name.\033[m\n\n"
exit 1
fi
cd /proc
printf "* System-wide ASLR"
aslrcheck
printf "* Does the CPU support NX: "
nxcheck
printf " COMMAND PID RELRO STACK CANARY NX/PaX PIE\n"
for N in `ps -Ao pid,comm | grep $2 | cut -b1-6`; do
if [ -d $N ] ; then
printf "%16s" `head -1 $N/status | cut -b 7-`
printf "%7d " $N
# read permissions?
if [ ! -r $N/exe ] ; then
if !(root_privs) ; then
printf "\033[31mNo read permissions for '/proc/$N/exe' (run as root).\033[m\n\n"
exit 1
fi
if [ ! `readlink $N/exe` ] ; then
printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n"
exit 1
fi
exit 1
fi
proccheck $N
echo
fi
done
exit 0
;;
--proc-libs)
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
if [ -z "$2" ] ; then
printf "\033[31mError: Please provide a valid process ID.\033[m\n\n"
exit 1
fi
if !(isNumeric "$2") ; then
printf "\033[31mError: Please provide a valid process ID.\033[m\n\n"
exit 1
fi
cd /proc
printf "* System-wide ASLR"
aslrcheck
printf "* Does the CPU support NX: "
nxcheck
printf "* Process information:\n\n"
printf " COMMAND PID RELRO STACK CANARY NX/PaX PIE\n"
N=$2
if [ -d $N ] ; then
printf "%16s" `head -1 $N/status | cut -b 7-`
printf "%7d " $N
# read permissions?
if [ ! -r $N/exe ] ; then
if !(root_privs) ; then
printf "\033[31mNo read permissions for '/proc/$N/exe' (run as root).\033[m\n\n"
exit 1
fi
if [ ! `readlink $N/exe` ] ; then
printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n"
exit 1
fi
exit 1
fi
proccheck $N
echo
libcheck $N
fi
exit 0
;;
--kernel)
cd /proc
printf "* Kernel protection information:\n\n"
kernelcheck
exit 0
;;
--fortify-file)
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
if [ -z "$2" ] ; then
printf "\033[31mError: Please provide a valid file.\033[m\n\n"
exit 1
fi
# does the file exist?
if [ ! -e $2 ] ; then
printf "\033[31mError: The file '$2' does not exist.\033[m\n\n"
exit 1
fi
# read permissions?
if [ ! -r $2 ] ; then
printf "\033[31mError: No read permissions for '$2' (run as root).\033[m\n\n"
exit 1
fi
# ELF executable?
out=`file $2`
if [[ ! $out =~ ELF ]] ; then
printf "\033[31mError: Not an ELF file: "
file $2
printf "\033[m\n"
exit 1
fi
if [ -e /lib/libc.so.6 ] ; then
FS_libc=/lib/libc.so.6
elif [ -e /lib64/libc.so.6 ] ; then
FS_libc=/lib64/libc.so.6
elif [ -e /lib/i386-linux-gnu/libc.so.6 ] ; then
FS_libc=/lib/i386-linux-gnu/libc.so.6
elif [ -e /lib/x86_64-linux-gnu/libc.so.6 ] ; then
FS_libc=/lib/x86_64-linux-gnu/libc.so.6
else
printf "\033[31mError: libc not found.\033[m\n\n"
exit 1
fi
FS_chk_func_libc=( $(readelf -s $FS_libc | grep _chk@@ | awk '{ print $8 }' | cut -c 3- | sed -e 's/_chk@.*//') )
FS_functions=( $(readelf -s $2 | awk '{ print $8 }' | sed 's/_*//' | sed -e 's/@.*//') )
FS_libc_check
FS_binary_check
FS_comparison
FS_summary
exit 0
;;
--fortify-proc)
if [ $have_readelf -eq 0 ] ; then
exit 1
fi
if [ -z "$2" ] ; then
printf "\033[31mError: Please provide a valid process ID.\033[m\n\n"
exit 1
fi
if !(isNumeric "$2") ; then
printf "\033[31mError: Please provide a valid process ID.\033[m\n\n"
exit 1
fi
cd /proc
N=$2
if [ -d $N ] ; then
# read permissions?
if [ ! -r $N/exe ] ; then
if !(root_privs) ; then
printf "\033[31mNo read permissions for '/proc/$N/exe' (run as root).\033[m\n\n"
exit 1
fi
if [ ! `readlink $N/exe` ] ; then
printf "\033[31mPermission denied. Requested process ID belongs to a kernel thread.\033[m\n\n"
exit 1
fi
exit 1
fi
if [ -e /lib/libc.so.6 ] ; then
FS_libc=/lib/libc.so.6
elif [ -e /lib64/libc.so.6 ] ; then
FS_libc=/lib64/libc.so.6
elif [ -e /lib/i386-linux-gnu/libc.so.6 ] ; then
FS_libc=/lib/i386-linux-gnu/libc.so.6
elif [ -e /lib/x86_64-linux-gnu/libc.so.6 ] ; then
FS_libc=/lib/x86_64-linux-gnu/libc.so.6
else
printf "\033[31mError: libc not found.\033[m\n\n"
exit 1
fi
printf "* Process name (PID) : %s (%d)\n" `head -1 $N/status | cut -b 7-` $N
FS_chk_func_libc=( $(readelf -s $FS_libc | grep _chk@@ | awk '{ print $8 }' | cut -c 3- | sed -e 's/_chk@.*//') )
FS_functions=( $(readelf -s $2/exe | awk '{ print $8 }' | sed 's/_*//' | sed -e 's/@.*//') )
FS_libc_check
FS_binary_check
FS_comparison
FS_summary
fi
exit 0
;;
*)
if [ "$#" != "0" ] ; then
printf "\033[31mError: Unknown option '$1'.\033[m\n\n"
fi
help
exit 1
;;
esac
</pre>
<pre class="brush:plain">
Establecemos permisos de ejecución:&lt;/br&gt;
chmod +x checksec.sh&lt;/br&gt;
Ejecutamos el script de acuerdo a los parámetros que tiene (ver función "help"). &lt;br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# (C) 2008 Guy Rutenberg - http://www.guyrutenberg.com
# This is a script that creates backups of blogs.
DB_NAME=
DB_USER=
DB_PASS=
DB_HOST=
#no trailing slash
BLOG_DIR=
BACKUP_DIR=
echo -n "dumping database... "
mysqldump --user=${DB_USER} --password=${DB_PASS} --host=${DB_HOST} ${DB_NAME} \
| bzip2 -c &gt; ${BACKUP_DIR}/${DB_NAME}-$(date +%Y%m%d).sql.bz2
if [ "$?" -ne "0" ]; then
echo -e "\nmysqldump failed!"
exit 1
fi
echo "done"
echo -n "Creating tarball... "
tar -cjf ${BACKUP_DIR}/${BLOG_DIR##*/}-$(date +%Y%m%d).tar.bz2 ${BLOG_DIR}
if [ "$?" -ne "0" ]; then
echo -e "\ntarball creation failed!"
exit 1
fi
echo "done"</pre>
<pre class="brush:perl">
#!/usr/bin/perl -w
# Copyright 2000 George Shaffer ([email protected])
# Anyone may use or modify this code for any purpose PROVIDED
# that as long as it is recognizably derived from this code,
# that the copyright notice, this comment and the immediately
# following comments on passwords remain intact and unchanged.
# No warrantees of any kind are expressed or implied.
# Please feel free to change anything from this point forward.
# I experimented at considerable length to find seed logic that
# was very random on Windows NT which generates a very small
# universe of process ID numbers ($$) compared to Unix.
srand(time() ^ ($$ + $$ &lt;&lt; 21));
# USER CHANGEABLE CONSTANTS FOLLOW
# Change $howMany to change the number of generated passwords.
$howMany = 10;
# Increase the default 7 to change the generated password size
# and extra letters will be added to the end. Decrease and
# you'll lose some or all of the second string of letters.
# Depending on the value of $addConsonants the actual
# password length may range from $siz to $siz + 2.
# Size interacts with other choices. If $addConsonants is false
# size will be fixed length and is achieved by truncation after
# checking for upper case and digits so short sizes (3 - 5) may
# not have the variability you desire.
$siz = 7;
# A $siz less than 3 creates an endless loop.
$siz = 3 if ($siz &lt; 3);
# Change $addConsonats to 0 to prevent some extra consonants
# from being tacked on to letter sequences. Leave $addConsonants
# at 1 to sometimes add an extra consonant to letter sequences.
# If left at 1 the password size will vary from $siz to $siz+2.
$addConsonants = 1;
# Change $firstUpper to 0 to prevent the first character of each
# letter sequence from being upper case. Leave it as 1 if you
# want some of the first characters to be upper case.
$firstUpper = 1;
# Change $mixedCase to 1 to mix the case of all letters.
# $mixedCase is not random as subsequent checks force at
# least one upper and one lower case letter in each password.
# Leave it at 0 so all letters will be lower case or only
# the first or each letter sequence may be upper case.
$mixedCase = 0;
# By changing $symbolOdds from 0 to 10 you change the likelihood
# of having two numbers or a number and a symbol. At 0 you will
# always get 2 digits. At 1 you will usually only get one digit
# but will sometimes get a second digit or a symbol. At 10 you
# will always get two numbers or a number and a symbol with the
# about even chances that one of the two characters will be a
# symbol. The odds are affected by what characters are added to
# or removed from the $sym initialization string.
# The default is 7.
$symbolOdds = 7;
# Change $across to a 1 to print passwords across the screen.
# Leave $across as a 0 to print a single column down the screen.
$across = 0;
# Add or remove symbols to make passwords easier or harder
# to type. Delete the second set of digits to increase
# the relative frequency of symbols and punctuation.
# Add some vowels or consonants to really change the patterns
# but these will also get much harder to remember.
# If you change the symbol list you need to change the matching
# regular expression near the bottom of the program.
$sym = "~`!@#$%^&amp;*()-_+=,.&lt;&gt;";
$numb = "12345678901234567890" . $sym;
$lnumb = length($numb);
# USER CHANGEABLE CONSTANTS END - Changing the constants as
# specified above has been fairly well tested. Any changes
# below here and you are changing the logic of the program.
# You should be familiar with programming if you make changes
# after this point.
# Unless you plan to change the logic in the loop below,
# leave this next alone and control case with $firstUpper and
# $mixedCase above. $mixedCase supercedes if both are true.
$upr = "BCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz";
$cons = "bcdfghjklmnpqrstvwxyz";
if ($mixedCase) {
$vowel = "AEIOUaeiou";
$cons = $upr;
} else {
$vowel = "aeiou";
}
$upr = $cons unless ($firstUpper);
$lvowel = length($vowel);
$lcons = length($cons);
$lupr = length($upr);
$realSize = $siz;
$realSize += 2 if ($addConsonants);
($across) ? ($down = " ") : ($down = "\n");
$linelen = 0;
for ($j=0; $j&lt;=$howMany; $j++) {
$pass = "";
$k = 0;
for ($i=0; $i&lt;=$siz; $i++) {
# The basic password structure is cvc99cvc. Depending on
# how $cons and $upr have been initialized above case will
# be all lower, first upper or random.
if ($i==0 or $i==2 or $i==5 or $i==7) {
if ($i==0 or $i==5) {
$pass .= substr($upr,int(rand($lupr)),1);
} else {
$pass .= substr($cons,int(rand($lcons)),1);
}
# The next will conditionally add up to 2 consonants
# pseudo randomly after the four "standard" consonants.
if ($addConsonants and (int(rand(4)) == 3) and $k &lt; 2) {
$pass .= substr($cons,int(rand($lcons)),1);
$k++;
}
}
# Pad the password with letters if $siz is over 7.
if ($i &gt; 7) {
if (int(rand(26)) &lt;= 5) {
$pass .= substr($vowel,int(rand($lvowel)),1);
} else {
$pass .= substr($cons,int(rand($lcons)),1);
}
}
# Put the vowels in cvc99cvc. Case depends on how $vowel
# was initialized above.
$pass .= substr($vowel,int(rand($lvowel)),1)
if ($i==1 or $i==6);
# Change $symbolOdds initialization above to affect the
# number of numbers and symbols and their ratio.
if ($i==3 or $i==4) {
# If $symbolOdds is non zero take any character
# from the $numb string which has digits, symbols
# and punctuation.
if ($symbolOdds) {
$pass .= substr($numb,int(rand($lnumb)),1)
if (int(rand(10)) &lt;= $symbolOdds);
} else {
# If $symbolOdds is zero keep trying until a
# a digit is found.
$n = "";
until ($n =~ /[0-9]/) {
$n = substr($numb,int(rand($lnumb)),1);
}
$pass .= $n;
}
}
}
# Plan to use this password unless . . .
$skipThisOne = 0;
# Don't include two consecutive symbols or puntuation.
$skipThisOne = 1 if ($pass =~ /[~`!@#$%^&amp;*()\-_+=,.&lt;&gt;]{2}/);
# Include at least one digit.
$skipThisOne = 1 unless ($pass =~ /[0-9]/);
# Include at least one lower case letter.
$skipThisOne = 1 unless ($pass =~ /[a-z]/);
# Conditionally insure at least one upper case character.
$skipThisOne = 1
if (!($pass =~ /[A-Z]/) and ($firstUpper or $mixedCase));
# If any test fails get another password.
if ($skipThisOne) {
$j--;
next;
}
# Check the password length.
$pass = substr($pass,0,$realSize) if (length($pass) &gt; $realSize);
# Print the passwords in a single column or across
# the screen based on $down which is set based on the
# the value of $across.
if ($down ne "\n") {
# Don't wrap passwords or trailing whitespace.
if ($linelen + length($pass) + length($down) &gt; 79) {
print "\n";
$linelen = 0;
}
$linelen += length($pass) + length($down);
}
print "$pass$down";
}
# Be sure to end the last line with an end of line.
print "\n" if $down ne "\n";
</pre>
<pre class="brush:plain">
Asignamos permiso de ejecución: chmod +x Password.pl &lt;/br&gt;
Ejecutamos el Script: ./Password.pl &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
CONF_FILE="/etc/firewall.conf"
# Configuracion Internet
INET_IF="eth0"
INET_TCP_PORTS="22 80 443 10050"
INET_UDP_PORTS="123"
PORT_FORWARDING="" # Formato: ExtPort:IntIP:IntPort:Protocol
# Configuracion LAN
LAN_IF="eth1"
LAN_NET="192.168.10.0/24"
PROXY="192.168.10.1:3128"
[ -f $CONF_FILE ] &amp;&amp; source $CONF_FILE
IPTABLES=$(which iptables)
MODPROBE=$(which modprobe)
MODULES="ip_tables ip_conntrack ip_conntrack_ftp ip_conntrack_irc iptable_nat ip_nat_ftp"
case "$1" in
start)
echo "Setting firewall rules..."
# Cargamos los modulos necesarios
echo -n " * Loading kernel modules: "
for module in $MODULES; do
$MODPROBE $module
done
echo "done"
# Activamos el IP forwarding
echo -n " * Activating IP Forwarding support: "
echo "1" &gt; /proc/sys/net/ipv4/ip_forward
echo "done"
# Eliminamos las reglas anteriores
echo -n " * Deleting firewall rules: "
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
echo "done"
# Ponemos que tipo de conexiones que vengan de inet aceptamos
echo -n " * Setting firewall port rules: "
for port in $INET_TCP_PORTS; do
$IPTABLES -A INPUT -i $INET_IF -p tcp --dport $port -j ACCEPT
done
for port in $INET_UDP_PORTS; do
$IPTABLES -A INPUT -i $INET_IF -p udp --dport $port -j ACCEPT
done
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Acepto VPN y LAN
$IPTABLES -A INPUT -i $LAN_IF -j ACCEPT
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A INPUT -i tun+ -j ACCEPT
# Acepto ICMP
$IPTABLES -A INPUT -p icmp -j ACCEPT
# No permito conexiones a los demas puertos desde inet
$IPTABLES -A INPUT -j REJECT
echo "done"
echo -n " * Activating Port Forwarding: "
if [[ -n "$PORT_FORWARDING" ]]; then
for i in $PORT_FORWARDING; do
extport=$(echo $i | awk -F ':' '{ print $1 }')
intip=$(echo $i | awk -F ':' '{ print $2 }')
intport=$(echo $i | awk -F ':' '{ print $3 }')
proto=$(echo $i | awk -F ':' '{ print $4 }')
$IPTABLES -t nat -A PREROUTING -p $proto -i $INET_IF --dport $extport -j DNAT --to $intip:$intport
done
fi
echo "done"
# Activamos el NAT
echo -n " * Activating NAT: "
$IPTABLES -t nat -A POSTROUTING -o $INET_IF -j MASQUERADE
$IPTABLES -A FORWARD -i $LAN_IF -j ACCEPT
$IPTABLES -t mangle -A FORWARD -m tcp -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
echo "done"
if [[ -n "$PROXY" ]]; then
echo -n " * Activating Transparent Proxy: "
$IPTABLES -t nat -A PREROUTING -i $LAN_IF ! -d $LAN_NET -p tcp -m tcp --dport 80 -j DNAT --to-destination $PROXY
echo "done"
fi
# HTB-GEN
#echo -n " * Activating bandwidth control: "
#/usr/local/bin/htb-gen all
#echo "done"
;;
stop)
echo -n " * Stopping firewall: "
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
echo "done"
;;
restart)
$0 stop
echo -n " * Sleeping a few seconds before setting the rules again: "
sleep 2
echo "done"
$0 start
;;
status)
$IPTABLES -L
$IPTABLES --table nat --list --exact --verbose --numeric --line-numbers
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
UbicacionISO=$1
echo "Ingrese el path con la iso incluida (ej /home/usuario/cd.iso): "
read iso
echo "Ingrese el dispositivo cd-rw|dvd-rw (ej /dev/sr0 /dev/scd0 etc):"
read dispositivo
if [ -e "$iso" ]; then
if [ -r $dispositivo ]; then
if [ -z $(which wodim) ];then
echo "Wodim no esta instalado"
exit
else
root=`id | cut -d= -f2 | cut -d'(' -f1`
if [ "$root" -eq 0 ]; then
echo "Grabando $UbicacionISO"
ionice -c1 wodim -v -eject dev="$dispositivo" -data "$iso"
else
echo "Debe ser root para grabar la imagen usando prioridad de e/s"
echo "Desea grabar de todas maneras sin usar prioridad de e/s (s/n)"
read op
if [ "$op" = s ]; then
wodim -v -eject dev="$dispositivo" -data "$iso"
fi
fi
fi
else
echo "No tiene permisos sobre el dispositivo"
fi
else
echo "Iso no existe"/
fi
</pre>
<pre class="brush:plain">
Asignamos permiso de ejecución &lt;/br&gt;
chmod +x grabaiso.bash &lt;/br&gt;
Ejecutamos el script &lt;/br&gt;
./grabaiso.bash
</pre>
<hr/><pre class="brush:bash">#!/bin/sh
#
# syslock.cl
# Copyright GPL V.3
# 06/03/2010
# Version: 1.0.10
#
# ---------------------------------------------------------------------
#
NOW="$(date +"%Y%m%d")"
MyUSER="" #USUARIO
MyPASS="" # PASSWORD
MyHOST="localhost" # HOST
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
DEST="/home/mysqldump/unaxuna" #DIR DE DESTINO
MBD="$DEST/$NOW"
HOST="$(hostname)"
FILE=""
DBS=""
OMITE="test" # OMITIR BASE PARA RESPALDO
[ ! -d $MBD ] &amp;amp;&amp;amp; mkdir -p $MBD || :
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
for db in $DBS
do
skipdb=-1
if [ "$OMITE" != "" ];
then
for i in $OMITE
do
[ "$db" == "$i" ] &amp;amp;&amp;amp; skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$NOW.$db.gz"
$MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 &amp;gt; $FILE
fi
done</pre>
<hr/><pre class="brush:bash">#!/bin/bash
umask 0
mkdir -p /shared/tools/gcc/gcc-4.6.2
cd /shared/tools/gcc/gcc-4.6.2
wget http://projects.joelinoff.com/gcc-4.6.2/bld.sh
chmod a+x bld.sh
./bld.sh 2&gt;&amp;1 | tee bld.log
</pre>
<hr/><pre class="brush:bash">
#!/bin/sh
# chkconfig: 2345 99 01
# Description: Sends an email at system start and shutdown
#############################################
# #
# Send an email on system start/stop to #
# a user. #
# #
#############################################
EMAIL="[email protected]"
RESTARTSUBJECT="["`hostname`"] - System Startup"
SHUTDOWNSUBJECT="["`hostname`"] - System Shutdown"
RESTARTBODY="This is an automated message to notify you that "`hostname`" started successfully.
Start up Date and Time: "`date`
SHUTDOWNBODY="This is an automated message to notify you that "`hostname`" is shutting down.
Shutdown Date and Time: "`date`
LOCKFILE=/var/lock/subsys/SystemEmail
RETVAL=0
# Source function library.
. /etc/init.d/functions
stop()
{
echo -n $"Sending Shutdown Email: "
echo "${SHUTDOWNBODY}" | mail -s "${SHUTDOWNSUBJECT}" ${EMAIL}
RETVAL=$?
if [ ${RETVAL} -eq 0 ]; then
rm -f ${LOCKFILE}
success
else
failure
fi
echo
return ${RETVAL}
}
start()
{
echo -n $"Sending Startup Email: "
echo "${RESTARTBODY}" | mail -s "${RESTARTSUBJECT}" ${EMAIL}
RETVAL=$?
if [ ${RETVAL} -eq 0 ]; then
touch ${LOCKFILE}
success
else
failure
fi
echo
return ${RETVAL}
}
case $1 in
stop)
stop
;;
start)
start
;;
*)
esac
exit ${RETVAL}
</pre>
<pre class="brush:plain">
Damos los permisos necesarios &lt;/br&gt;
chmod u+x /etc/init.d/mailme &lt;/br&gt;
Para probarlo podemos ejecutar: &lt;/br&gt;
/etc/init.d/mailme start &lt;/br&gt;
/etc/init.d/mailme stop &lt;/br&gt;
Configuramos con chkconfig para que corra en un nivel determinado del sistema &lt;/br&gt;
chkconfig --levels 3 mailme on &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
ifnetcat=`type -p netcat`
if [ -z $ifnetcat ]; then
echo -e "\n\nNetcat necesita estar instalado\n"
exit 0
fi
echo "Realizando escaneo"
IFS=$'\n' &amp;&amp; for f in `find . -type f -exec md5sum "{}" \;`; do echo $f | sed -r 's/^[^ ]+/Checking:/'; echo $f | cut -f1 -d' ' | nc hash.cymru.com 43 ; done
echo "Escaneo finalizado"
exit 0
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
</pre>
<pre class="brush:plain">
Damos permisos de ejecución &lt;br/&gt;
chmod +x flush.bash &lt;br/&gt;
Tiramos el firewall &lt;br/&gt;
./flush.bash &lt;br/&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Script de borrado interactivo.
# Leo Gutiérrez Ramírez. [email protected]
function rmsecure()
{
select archivos in * "SALIR"
do
if [ "${archivos}" = "SALIR" ]
then
exit 0;
elif [[ -n "${archivos}" ]]
then
sudo rm -rvi "${archivos}" || {
echo -e "Error borrando archivo : ${archivos}";
exit 0;
}
clear;
rmsecure;
else
echo -e "Error eligiendo archivo.";
fi
done
}
clear;
rmsecure;</pre>
<hr/><pre class="brush:bash">MYSQL_PASS="YOUR_PASSWORD_HERE";
echo "+Updating apt-get..."
apt-get update
echo "+Installing SSH..."
apt-get install -q -y ssh
echo "+Changing default SSH port..."
sed -i 's/Port 22/Port 28/' /etc/ssh/sshd_config
/etc/init.d/ssh restart
echo "+Installing Apache2..."
apt-get install -q -y apache2
sed -i 's/ServerTokens Full/ServerTokens Prod/' /etc/apache2/conf.d/security
sed -i 's/ServerSignature On/ServerSignature Off/' /etc/apache2/conf.d/security
sed -i 's/TraceEnable On/TraceEnable Off/' /etc/apache2/conf.d/security
/etc/init.d/apache2 reload
a2enmod rewrite
/etc/init.d/apache2 restart
echo "+Installing PHP5..."
apt-get install -q -y php5
echo "+Securing PHP.ini file..."
sed -i 's/disable_functions =/disable_functions = show_source, system, exec/' /etc/php5/apache2/php.ini
sed -i 's/expose_php = On/expose_php = Off/' /etc/php5/apache2/php.ini
sed -i 's/display_errors = On/display_errors = Off/' /etc/php5/apache2/php.ini
sed -i 's/log_errors = Off/log_errors = On/' /etc/php5/apache2/php.ini
sed -i 's/allow_url_fopen = On/allow_url_fopen = Off/' /etc/php5/apache2/php.ini
echo "+Installing MySQL Server..."
DEBIAN_FRONTEND='noninteractive' apt-get install -q -y mysql-server
mysqladmin -u root password $MYSQL_PASS
apt-get install -q -y php5-mysql
mysql_secure_installation
history -c
echo "+Installation Completed!"</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
ifespeak=`type -p espeak`
if [ -z $ifespeak ]; then
echo "Para mejor funcionamiento necesita tener instalado espeak"
echo "sudo apt-get install espeak"
echo "sudo yum install espeak"
echo "Intentalo nuevamente"
exit 1
fi
NOMBRE=`cat /etc/passwd | grep "^$LOGNAME" | cut -d: -f5 | cut -d' ' -f1`
HORA=`date | cut -c12-13 | tr -d ' '`
tiempo=`date +%H:%M`
dia=`date +%d`
mes=`date +%m`
ano=`date +%Y`
if expr '$HORA &lt;= 4' &gt; /dev/null
then
echo 'Buenas noches, '$NOMBRE | espeak -v es-la -s 150 2&gt;/dev/null
sleep=1
echo 'Son las, '$tiempo',, horas,, del '$dia',,,, del '$mes',,,, de '$ano'' | espeak -v es-la -s 140 2&gt;/dev/null
sleep=1
echo 'el sistema operativo esta listo para usarse' | espeak -v es-la -s 150 2&gt;/dev/null
sleep=1
echo ',,,,que disfrutes tu sesión en Debian' | espeak -v es-la -s 140 2&gt;/dev/null
elif expr '$HORA &lt; = 11' &gt; /dev/null ]
then
echo 'Buenos dias, '$NOMBRE | espeak -v es-la -s 150
sleep=1
echo 'Son las, '$tiempo', horas,, del '$dia',,,, del '$mes',,,, de '$ano'' | espeak -v es-la -s 140
sleep=1
echo 'el sistema operativo esta listo para usarse' | espeak -v es-la -s 150
sleep=1
echo ',,,,que disfrutes tu sesión en Debian' | espeak -v es-la -s 140
elif expr '$HORA &lt; = 18' &gt; /dev/null
then
echo 'Buenas tardes, '$NOMBRE | espeak -v es-la -s 150
sleep=1
echo 'Son las, '$tiempo', horas,, del '$dia',,,, del '$mes',,,, de '$ano'' | espeak -v es-la -s 140
sleep=1
echo 'el sistema operativo esta listo para usarse' | espeak -v es-la -s 150
sleep=1
echo ',,,,que disfrutes tu sesión en Debian' | espeak -v es-la -s 140
elif expr '$HORA &lt; = 24' &gt; /dev/null
then
echo 'Buenas noches, '$NOMBRE | espeak -v es-la -s 150
sleep=1
echo 'Son las, '$tiempo', horas,, del '$dia',,,, del '$mes',,,, de '$ano'' | espeak -v es-la -s 140
sleep=1
echo 'el sistema operativo esta listo para usarse' | espeak -v es-la -s 150
sleep=1
echo ',,,,que disfrutes tu sesión en Debian' | espeak -v es-la -s 140
fi
</pre>
<pre class="brush:plain">
El script detecta 3 zonas horarias &lt;br/&gt;
1. Buenos días &lt;br/&gt;
2. Buenas tardes&lt;br/&gt;
3. Buenas noches&lt;br/&gt;
Dependiendo de que hora sea &lt;br/&gt;
Damos permisos de ejecución &lt;br/&gt;
chmod +x habla.bash &lt;/br&gt;
Ejecutamos el script &lt;br/&gt;
./habla.bash
</pre>
<hr/><pre class="brush:bash">#!/bin/bash -
#===============================================================================
#
# FILE: cdprompt.sh
#
# USAGE: ./cdprompt.sh
#
# DESCRIPTION: Cambio de directorios interactivamente.
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: |Leo Gutiérrez R.| (), |leorocko13[at]hotmail|
# COMPANY:
# CREATED: 02/26/2011 01:51:28 AM CST
# REVISION: ---
#===============================================================================
select directorio in */ "SALIR"
do
if [ "$directorio" = "SALIR" ]
then
break;
elif [[ -n "$directorio" ]]
then
cd "$directorio"
break;
else
echo -e "\aError de opción.";
break;
fi
done</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Leo Gutiérrez R.
# Script para navegar por sobre los dispositivos USB en el sistema.
# Uso personal.
select archivo in `ls -1 /media/ | grep -v "^cd$" | grep -v "^dvd$" | grep -v "^fl$" | grep -v "^ubuntu$" | grep -v "^windows$"`
do
if [ -n "$archivo" ]
then
cd /media/"$archivo"
break;
else
echo -e "Error eligiendo dispositivo";
exit 1;
fi
done</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Uso ./mitm.sh [ dirección mac ]"
exit
fi
mac=$1
while true
do
entradaRouter=$( arp -a | grep 192.168.1.1 | cut -d' ' -f4 )
if [ $mac != $entradaRouter ]
then
echo “Atento la Mac ha cambiado”
ifconfig [ dispositivo red, ejemplo eth0 ] down
fi
sleep 2
done
</pre>
<pre class="brush:plain">
Damos permisos de ejecución: chmod +x mitm.sh &lt;br/&gt;
Ejecutamos el script: ./mitm.sh [ dirección mac ] &lt;br/&gt;
Ejemplo: ./mitm.sh 00:02:cf:ce:c6:1a
</pre>
<hr/><pre class="brush:bash">#!/usr/bin/env bash
# Script para extraer archivos
# JuszR [email protected]
# GPL
if [ "$#" -lt 1 ]; then
echo -ne "\n\tUso:"
echo -e "\n\t$(basename $0) [archivo] (.tar, .rar, .bz2...)"
echo ""
exit 1
fi
if [ -f $1 ] ; then
case $1 in
*.tar.bz2 | *.tbz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' no puede ser extraido" ;;
esac
else
echo "'$1' no es un archivo valido"
fi</pre>
<pre class="brush:plain">
Para realizar la extracción, el script se utiliza de la siguiente manera: &lt;/br&gt;
./extractor.bash archivo.ext &lt;br/&gt;
</pre>
<hr/><pre class="brush:bash">#!/usr/bin/env bash
# Colores en bash
# JuszR [email protected]
# GPL
# Variables
txtund=$(tput sgr 0 1) # Subrayado
txtbld=$(tput bold) # Negrita
bldred=${txtbld}$(tput setaf 1) # rojo
bldblu=${txtbld}$(tput setaf 4) # azul
bldwht=${txtbld}$(tput setaf 7) # blanco
txtrst=$(tput sgr0) # Resetear
info=${bldwht}*${txtrst} # Feedback
pass=${bldblu}*${txtrst}
warn=${bldred}!${txtrst}
echo "Ejemplos de colores"
echo -e "$(tput bold) norm negr subr tput-colores$(tput sgr0)"
for i in $(seq 1 7); do
echo " $(tput setaf $i)Texto$(tput sgr0) $(tput bold)$(tput setaf $i)Texto$(tput sgr0) $(tput sgr 0 1)$(tput setaf $i)Texto$(tput sgr0) \$(tput setaf $i)"
done
echo -e '$(tput bold)' 'Para Negrita'
echo -e '$(tput sgr 0 1)' 'Para Subrayado'
echo -e "Ejemplo: "
echo -e "$(tput bold) Negrita" "$(tput sgr 0 1)Subrayado"
</pre>
<pre class="brush:plain">
Para observar la salida del script &lt;br/&gt;
chmod +x colores.bash &lt;br/&gt;
./colores.bash
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Leo Gutiérrez R.
# Script para comprobar si un proceso está corriendo.
[ $# -ne 1 ] &amp;&amp; {
cat &lt;&lt; EOF
Forma de ejecución: `basename $0` service
EOF
exit 1;
}
[ -f "/var/run/daemons/$1" ] &amp;&amp; {
echo -e "\"$1\" running.";
} || {
echo -e "\"$1\" stopped.";
}
exit 0;
</pre>
<pre class="brush:plain">
Damos permisos de ejecución &lt;/br&gt;
chmod +x Comprueba.bash &lt;/br&gt;
Ejecutamos el script &lt;/br&gt;
./Comprueba.bash [ servicio ] &lt;/br&gt;
./Comprueba.bash mysqld &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
[ ${UID} != 0 ] &amp;amp;&amp;amp; {
echo -e "Se requieren privilegios de Root";
exit 1;
}
pacman -Qei | sed -n "s/^Name.*\:\s\(.*\)/\1/p" &amp;gt; nombres.txt
pacman -Qei | sed -n "s/^Version.*\:\s\(.*\)/\1/p" &amp;gt; versiones.txt
Xdialog --title "Desinstalar paquetes" --menu "Elija su paquete:" 24 51 6 $(paste nombres.txt versiones.txt) 2&amp;gt; /tmp/menu.tmp.$$
retval=$?
choice=`cat /tmp/menu.tmp.$$`
rm -f nombres.txt
rm -f versiones.txt
rm -f /tmp/menu.tmp.$$
case "$retval" in
1)
exit 0;
;;
255)
exit 0;
;;
esac
yes | pacman -R "${choice}" &amp;amp;&amp;amp; {
Xdialog --title "Desinatalar paquetes" --msgbox "${choice} desinstalado con éxito." 10 100
} || {
Xdialog --title "Desinatalar paquetes" --msgbox "${choice} no se pudo desinstalar." 10 100
exit 1;
}
exit 0;</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Script para instalar paquetes en Perl.
function getch()
{
OLD_STTY=`stty -g`
stty cbreak -echo
look=`dd if=/dev/tty bs=1 count=1 2&amp;gt;/dev/null`
stty $OLD_STTY
}
function installModule()
{
sudo perl Makefile.PL
sudo make
sudo make test
sudo make install
}
function modins()
{
archivo=
select archivo in *.tar.gz "SALIR"
do
if [ "${archivo}" = "SALIR" ]
then
exit 0;
elif [[ -n "${archivo}" ]]
then
echo -e "Elegiste : ${archivo}";
tar zxvf "${archivo}" &amp;amp;&amp;gt; /dev/null || {
echo -e "Error descomprimiendo [ ${archivo} ]";
exit 1;
}
cd "${archivo%\.tar.gz}" 2&amp;gt; /dev/null || {
echo -e "\aError abriendo directorio ${archivo%%.*}";
exit 1;
}
installModule;
echo -e "\E[31;47mMódulo instalado. Presione una tecla para continuar.";
tput sgr0;
getch;
break;
else
echo -e "Error eligiendo archivo.";
exit 0;
fi
done
}
modins;
exit 0;</pre>
<hr/><pre class="brush:bash">#! /bin/bash
if test $# -ge 1
then
echo "Este Script no necestia parametros"
exit 0
else
ypcat passwd | awk -F: ' NR &amp;gt; 1 { vec[$4] +=1}
END { VAN=1
for (x in vec)
if (VAN==1)
{MAYOR=vec
;
GRUPO=x;
VAN=0}
else
if (MAYOR &amp;lt; vec
)
{MAYOR=vec
;
GRUPO=x;}
print GRUPO" " MAYOR+1
}' &amp;gt; borrar
VAR1=`cat borrar | cut -d" " -f1`
VAR2=`cat borrar | cut -d" " -f2`
VAR3=`ypcat group | grep $VAR1 | cut -d":" -f1`
echo " El grupo $VAR3 tiene la mayor cantidad de usuarios con un total de
$VAR2"
rm borrar
exit 0
fi</pre>
<hr/><pre class="brush:bash">#! /bin/bash
if test $# -ge 1
then
echo "Este Script no utiliza parametros"
exit 0
else
clear
while true
do
echo " **********************************************"
echo " * *"
echo " * Seleccione una accion a realizar *"
echo " * *"
echo " **********************************************"
echo " * *"
echo " * Presione (A) para un Reporte del Sistema *"
echo " * Presione (B) para un Reporte de Procesos *"
echo " * Presione (C) para un Reporte de Usuarios *"
echo " * Presione (X) para salir *"
echo " * *"
echo " **********************************************"
read op
clear
#VARIABLES DE ENTORNO UTILIZADAS EN A)
#Tamaño del File System expresado en Kbytes
TAM_FS=`df -l --block-size=1024 | awk 'BEGIN{cant=0} {cant+=$2} END{print
"Tamaño del file system: "cant}'`
#Porcentaje del disco usado
PORC_DISCO_USAD=`df -l | awk 'BEGIN{cant=0} {cant+=$5} END{print
"Porcentaje del disco utilizado: "cant, "\tLibre: "100-cant}'`
#Tamaño del directorio actual
TAM_DIR_AC=`ls -l --block-size=1024 | awk 'BEGIN{cant=0} {cant+=$5}
END{print cant}'`
#Cantidad de archivos en el dir actua
CANT_ARCH_DIR_AC=`ls -l | cut -f1 -d" " | grep ^-......... | awk 'END{print
NR}'`
#Cantidad de subdirectorios en el dir actual
CANT_SUBDIR_AC=`ls -l | cut -f1 -d" " | grep ^d......... | awk 'END{print
NR}'`
#Fecha del reporte
FCHA_REP=`date '+Fecha del reporte: %d/%m/%y'`
#VARIABLES DE ENTORNO UTILIZADAS EN B)
#Cantidad de procesos en ejecucion
CANT_PROC_EJEC=`ps -aux | wc -l`
#Tamanio total de la memoria
TAM_TOT=`free -t | cut -f2 -d":" | cut -d" " -f7 | sort | awk 'END{print}'`
#Porcentaje de memoria utilizada
TAM_MEM_USA=`ps -aux | awk 'BEGIN{cant=0} {cant+=$4} END{print "Porcentaje
de memoria utilizado: "cant, "\tLibre: "100-cant}'`
#Uso de CPU
USO_CPU=`ps -aux | awk 'BEGIN{cant=0} {cant+=$3} END{print "Uso de CPU:
"cant}'`
#Usuario que utiliza mayor cantida de memoria
MEM_USU=`ps -aux | awk ' NR &amp;gt; 1 { vec[$1] +=$4}
END { VAN=1
for (x in vec)
if (VAN==1)
{MAYOR=vec
;
GRUPO=x;
VAN=0}
else
if (MAYOR &amp;lt; vec
)
{MAYOR=vec
;
GRUPO=x;}
print "El Usuario que usa mayor cantidad de memoria: " GRUPO
}'`
#Usuarios con mayor cantidad de procesos
CANT_PROC=`ps -aux | awk ' NR &amp;gt;1 { vec[$1] +=1}
END { BAN=1
for (x in vec)
if (BAN==1)
{MAYOR=vec
;
GRUPO=x;
BAN=0}
else
if (MAYOR &amp;lt; vec
)
{MAYOR=vec
;
GRUPO=x;}
print "Usuario con mayor cantidad de procesos: " GRUPO " con " MAYOR "
procesos"
}'`
#VARIABLES DE ENTORNO UTILIZADAS EN C)
#Cantidad total de usuarios
CANT_USER_TOT=`ypcat passwd | awk 'END{print NR}'`
#Cantidad de usuarios logueados
CANT_USER_LOG=`who | cut -f1 -d" " | sort | uniq | awk 'END{print NR}'`
#El usuario con que lleva mas tiempo logueado
USER_MAS_LOG=`who | awk '{ print $5 "\t"$1}' | sort | awk ' NR==1 ' | cut
-f2`
#COMIENZA EL MENU DE OPCIONES
case $op in
#EMPIEZA A EJECUTAR A
A|a)
echo " A)"
echo " **********************************************************"
echo " * Reporte del Sistema de Archivos *"
echo "
*--------------------------------------------------------*"
echo " * $TAM_FS *"
echo " * *"
echo " * $PORC_DISCO_USAD *"
echo " *
*"
echo " * Tamaño del directorio actual: $TAM_DIR_AC (Kbytes)
*"
echo " *
*"
echo " * Cantidad de archivos en el directorio actual:
$CANT_ARCH_DIR_AC *"
echo " *
*"
echo " * Cantidad de sub-directorios en el directorio actual:
$CANT_SUBDIR_AC *"
echo "
*--------------------------------------------------------*"
echo " * $FCHA_REP *"
echo "
**********************************************************"
sleep 12
;;
#TERMINA DE EJECUTAR A
#EMPIEZO A EJECUTAR B
B|b)
echo " B)"
echo "
******************************************************************"
echo " * Reporte de Procesos
*"
echo "
*----------------------------------------------------------------*"
echo " * Cantidad de procesos en ejecucion:$CANT_PROC_EJEC
*"
echo " *
*"
echo " * Tamaño total de la memoria:$TAM_TOT
*"
echo " *
*"
echo " * $TAM_MEM_USA *"
echo " *
*"
echo " * $USO_CPU
*"
echo " *
*"
echo " * $MEM_USU *"
echo " *
*"
echo " * $CANT_PROC *"
echo "
*----------------------------------------------------------------*"
echo " * $FCHA_REP *"
echo "
******************************************************************"
sleep 12;;
#TERMINO DE EJECUTAR B
#EMPIEZO A EJECUTAR C
C|c)
echo " C)"
echo "
******************************************************************"
echo " * Reporte de Usuarios
*"
echo "
*----------------------------------------------------------------*"
echo " * Cantidad total de usuarios: $CANT_USER_TOT
*"
echo " *
*"
echo " * Cantidad de usuarios logueados: $CANT_USER_LOG
*"
echo " *
*"
echo " * El usuario que lleva mas tiempo logueado:
$USER_MAS_LOG *"
echo "
*----------------------------------------------------------------*"
echo " * $FCHA_REP *"
echo "
******************************************************************"
sleep 12;;
#EMPIEZA A EJECUTAR X
X|x) echo "Fin del programa"
break
sleep 1;;
*) echo "opcion incorrecta"
sleep 1;;
esac
clear
done
exit 0
fi</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# mailip.sh
# Script designed to read your public IP address from www.whatismyip.org
# at intervals and notify any changes by sending an email for you.
# wget and sendEmail with tsl support must be installed on your system.
# Usage: mailip.sh (if it can be found in your session environment PATH)
# or if you want to run it on the background: nohup mailip.sh &amp;amp;&amp;gt;/dev/null &amp;amp;
# Please, you must modify the next variables to suit your needs:
[email protected] # An account to send the email with the ip.
RECEIVE=$DELIVER # An account to get the email. Don't modify to send it to the same address you especified above.
SMTP_SERVER=server.address.com:port # The smtp server's port of the emailer account. Example: smtp.gmail.com:587
MAIL_USER=account-user
MAIL_PASS=UseR.p4s5vooRd-
TLS=yes # yes|no Does the mail server accept/require TLS or SSL encryption?
# The script starts here.
PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin # paranoia
READ_IP()
{
wget -q -t 4 --no-proxy --no-cache --no-cookies -o /dev/null -O /var/publicip http://www.whatismyip.org
if [ $? -ne 0 ] ; then sleep 5m ; READ_IP ; fi
}
SEND_IP()
{
sendEmail -q -f $DELIVER -t $RECEIVE -u $SUBJECT -m $MESSAGE -s $SMTP_SERVER -xu $MAIL_USER -xp $MAIL_PASS -o tls=$TLS
if [ $? -ne 0 ] ; then sleep 5m ; SEND_IP ; fi
}
if [ $DELIVER == [email protected] ]
then echo ; echo " Warning! You must carefully edit some variables of the script first of all." ; echo
else
if [ ! -e /var/publicip-sent ]
then echo 0 &amp;gt; /var/publicip-sent
fi
while true
do READ_IP ; sleep 12s ; sync # paranoia
if [ `cat /var/publicip` != `cat /var/publicip-sent` ]
then
SUBJECT=`hostname ; echo "IP changed:" ; cat /var/publicip`
MESSAGE=`cat /var/publicip ; echo ; date +%F\ %T`
SEND_IP &amp;amp;&amp;amp; mv /var/publicip /var/publicip-sent
else rm /var/publicip
fi
sleep 60m
done
fi
# That was all.
# Perhaps you didn't like having to type your email password directly in the script,
# a workaround could be to assign a value like MAIL_PASS=`cat ~/password.txt` , then
# write a file called ~/password.txt with only the password in it and run the script.
# Don't forget that the password plain text file should only be readable by you,
# modificate it's permissions with chmod if needed.</pre>
<hr/><pre class="brush:bash">#!/bin/bash
HELP_MESSAGE()
{
clear;echo;echo "This script will show you the the signal quality of a wlan device until you"
echo "press control+c , if that info can be obtained with the iwconfig command."
echo;echo "This is useful when orienting an antenna or test your connection."
echo;echo "This script can use any mode your device support and will run without releasing"
echo "any established connection."
echo;echo "Usage: $0 DEV"
echo "where DEV is any of your wlan devices as wlan0, ath0, eth1...";echo
}
ERROR()
{
echo "Sorry, something went wrong. Try $0 --help" ; exit
}
RUN()
{
while true
do printf `date +%T`
iwconfig $1 | grep --ignore-case Link || ERROR
sleep 1s
done
}
if [ ! $1 ]
then HELP_MESSAGE
elif [ $1 == -h ]
then HELP_MESSAGE
elif [ $1 == --help ]
then HELP_MESSAGE
else RUN $1
fi</pre>
<pre class="brush:ruby"># -*- coding: UTF-8 -*-
# Modulos
require 'rest_client'
exit if Object.const_defined?(:Ocra)
# Metodos
def logo()
print "
@@
@ @
@ @ @@@ @@@ @ @
@ @ @ @ @ @ @
@ @ @@ @ @ @ @
@ @@ @ @@@@ @ @@
@ @ @ @ @ @ @ @
@ @ @ @ @ @ @ @ @ @
@@ @ @ @@@@ @@@ @ @
By Elektro H@cker\n\n"
end
def help()
print "\n Modo de empleo:\n\n"
print " " + __FILE__.split('/').last + " [Opci\u00F3n] [Imagen]\n\n"
print "\n Ejemplo:\n\n"
print " " + __FILE__.split('/').last + " -d C:\\Test.jpg \n\n"
print "\n Opciones: \n\n"
print " -a --all \n Devuelve el enlace de la imagen en todos los formatos. \n\n"
print " -b --bb \n Devuelve el enlace de la imagen en formato BB. \n\n"
print " -d --directo \n Devuelve el enlace directo a la imagen. \n\n"
print " -h --html \n Devuelve el enlace de la imagen en formato HTML. \n\n"
print " -t --thumb \n Devuelve el thumb de la imagen. \n\n"
print " -k --key \n Establece su Developer key. \n\n"
print " /? Muestra esta ayuda. \n\n"
Process.exit
end
def keycode(imput)
if ARGV[1] == () or not imput.length.eql? 40
puts "\n Porfavor introduzca una developer key válida..."
puts "\n Ejemplo:\n\n " + __FILE__.split('/').last + " --key 148CAPSV9465b858a45dc1b4cdb32dee95ff6f59 \n\n"
puts "\n Para más información, Visite: http://stream.imageshack.us/api/"
Process.exit
end # length
if File.exist?("key")
oldkey = File.read('key')
print "\n ¿Desea reemplazar el archivo que contiene su developer key?\n\n"
print " Clave anterior: " + oldkey
print "\n Clave nueva : " + imput
print "\n\n [SI/NO] \n\n&amp;gt;&amp;gt; "
$sino = STDIN.gets
if $sino[/si/i]
keyfile = File.new("key", "w")
keyfile.print(imput)
print "\nClave reemplazada correctamente.\n"
elsif $sino[/no/i]
Process.exit
elsif
keycode(imput)
end # Reemplazar
else
keyfile = File.new("key", "w")
keyfile.print(imput)
print "\nClave configurada correctamente.\n"
end # File exist
end
def subir(file)
print "\n Subiendo la imagen, Espere...\n\n"
$Imagen = RestClient.post('http://www.imageshack.us/upload_api.php',
:key =&amp;gt; $devkey,
# :a_username =&amp;gt; "USUARIO",
# :a_password =&amp;gt; "PASSWORD",
:fileupload =&amp;gt; File.new(file)
)
end
def show(opcion)
if opcion == "-d" or opcion == "--directo"
print $Imagen.split("&lt;image_link&gt;").last.split("&lt;/image_link&gt;").first + "\n"
elsif opcion == "-b" or opcion == "--bb"
print $Imagen.split("&lt;image_bb&gt;").last.split("&lt;/image_bb&gt;").first + "\n"
elsif opcion == "-h" or opcion == "--html"
print $Imagen.split("&lt;image_html&gt;").last.split("&lt;/image_html&gt;").first.gsub("&amp;gt;", "&amp;gt;").gsub("&amp;lt;", "&amp;lt;").gsub(""", "'") + "\n"
elsif opcion == "-t" or opcion == "--thumb"
print $Imagen.split("&lt;thumb_link&gt;").last.split("&lt;/thumb_link&gt;").first + "\n"
elsif opcion == "-a" or opcion == "--all"
print "\nDirecto: \n" + $Imagen.split("&lt;image_link&gt;").last.split("&lt;/image_link&gt;").first + "\n\n"
print "BB Forum: \n" + $Imagen.split("&lt;image_bb&gt;").last.split("&lt;/image_bb&gt;").first + "\n\n"
print "HTML: \n" + $Imagen.split("&lt;image_html&gt;").last.split("&lt;/image_html&gt;").first.gsub("&amp;gt;", "&amp;gt;").gsub("&amp;lt;", "&amp;lt;").gsub(""", "'") + "\n\n"
print "Thumb: \n" + $Imagen.split("&lt;thumb_link&gt;").last.split("&lt;/thumb_link&gt;").first + "\n"
end
Process.exit
end
# Control de errores
logo()
if ARGV[0] == "-k" or ARGV[0] == "--key"
keycode(ARGV[1])
Process.exit
end
if not File.exist?("key")
print "\n ERROR. Debe configurar su developer key para usar este programa...\n"
puts "\n Ejemplo:\n\n " + __FILE__.split('/').last + " --key 148CAPSV9465b858a45dc1b4cdb32dee95ff6f59 \n\n"
puts "\n Para más información, Visite: http://stream.imageshack.us/api/"
Process.exit
elsif
$devkey = File.read('key')
end
if (ARGV.empty?) or ARGV[0] == "/?"
help()
end
if (ARGV[1])==()
print "\n ERROR. Debe introducir la ruta local de la imagen...\n"
Process.exit
end
if not File.exist?(ARGV[1])
print "\n ERROR. La imagen no existe...\n"
Process.exit
elsif not (ARGV[1].split('.').last)[/bmp\z/i] and not (ARGV[1].split('.').last)[/bmp\z/i] and not (ARGV[1].split('.').last)[/gif\z/i] and not (ARGV[1].split('.').last)[/ico\z/i] and not (ARGV[1].split('.').last)[/jpg\z/i] and not (ARGV[1].split('.').last)[/jpeg\z/i] and not (ARGV[1].split('.').last)[/png\z/i] and not (ARGV[1].split('.').last)[/tif\z/i] and not (ARGV[1].split('.').last)[/tiff\z/i]
print "\n ERROR. Archivo de imagen no soportado...\n"
print "\n Formatos soportados: .BMP, .GIF, .ICO, .JPG, .JPEG, .PNG, .TIF, .TIFF\n"
Process.exit
end
if not ARGV[0] == "-d" and not ARGV[0] == "--directo" and not ARGV[0] == "-a" and not ARGV[0] == "--all" and not ARGV[0] == "-b" and not ARGV[0] == "--bb" and not ARGV[0] == "-h" and not ARGV[0] == "--html" and not ARGV[0] == "-t" and not ARGV[0] == "--thumb"
print "\n ERROR. Opcion incorrecta...\n\n"
print " Use la opcion [/?] para mostrar la ayuda. \n\n"
print " " +__FILE__.split('/').last + " /? \n"
Process.exit
end
# Proceso
subir(ARGV[1])
show(ARGV[0])</pre>
<pre class="brush:plain">shack.rb [Opción] [Imagen]
Ejemplo:
shack.rb -d C:\Test.jpg
Opciones:
-a --all
Devuelve el enlace de la imagen en todos los formatos.
-b --bb
Devuelve el enlace de la imagen en formato BB.
-d --directo
Devuelve el enlace directo a la imagen.
-h --html
Devuelve el enlace de la imagen en formato HTML.
-t --thumb
Devuelve el thumb de la imagen.
-k --key
Establece su Developer key.
/? Muestra esta ayuda.</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Leo Gutiérrez R. [email protected]
# Script que comprime todos los archivos en el directorio actual.
# Util para hacer espacio en dispositivos extraíbles.
find . -type f | while read file
do
extension=`echo "${file}" | awk -F . '{print $NF}'`;
echo -e "$extension" | grep -ie "^\(rar\|Z\|7z\|bz2\|zip\|gz\)$" &amp;amp;&amp;gt; /dev/null &amp;amp;&amp;amp; continue;
rar a "${file}.rar" "$file" -y -df
done
</pre>
<hr/><pre class="brush:bash">#!/bin/sh
clear
echo "****Bienvenido al Sitema de Apagado Automatico****"
echo "GeekScripting"
echo ""
echo "MENU"
echo " 1.-Apagar PC ahora"
echo " 2.-Reiniciar PC ahora"
echo " 3.-Apagar PC en un ahora determinada"
echo " 4.-Apagar PC en un lapso determinado"
echo " 5.-Salir"
echo ""
read -p "Seleccionar Opcion: " OPCION
case $OPCION in
1) sudo halt;;
2) sudo reboot;;
3) echo -n "Ingresa la hora de apagado: "
read hora
sudo shutdown -h $hora;;
4)echo -n "Ingresa el numero de minutos, tras cual el PC se apagara: "
read minutos
sudo shutdown -h $minutos;;
5) exit;;
*) echo "Usted ingreso una opcion que no esta en el menu"
exit 1;;</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# For RedHat and cousins:
# chkconfig: 2345 85 85
# description: Red5 flash streaming server
# processname: red5
# Created By: Sohail Riaz ([email protected])
PROG=red5
RED5_HOME=/usr/local/red5
DAEMON=$RED5_HOME/$PROG.sh
PIDFILE=/var/run/$PROG.pid
# Source function library
. /etc/rc.d/init.d/functions
[ -r /etc/sysconfig/red5 ] &amp;amp;&amp;amp; . /etc/sysconfig/red5
RETVAL=0
case "$1" in
start)
echo -n $"Starting $PROG: "
cd $RED5_HOME
$DAEMON &amp;gt;/dev/null 2&amp;gt;/dev/null &amp;amp;
RETVAL=$?
if [ $RETVAL -eq 0 ]; then
echo $! &amp;gt; $PIDFILE
touch /var/lock/subsys/$PROG
fi
[ $RETVAL -eq 0 ] &amp;amp;&amp;amp; success $"$PROG startup" || failure $"$PROG startup"
echo
;;
stop)
echo -n $"Shutting down $PROG: "
killproc -p $PIDFILE
RETVAL=$?
echo
[ $RETVAL -eq 0 ] &amp;amp;&amp;amp; rm -f /var/lock/subsys/$PROG
;;
restart)
$0 stop
$0 start
;;
status)
status $PROG -p $PIDFILE
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=1
esac
exit $RETVAL
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
if [ $# -ne 2 ]; then
#si no recibe argumentos
echo "Para correrlo usa: $0 laviejaext lanuevaext" 1&gt;&amp;2
exit 1
fi
for file in *.$1; do
newname=`echo $file | sed "s/$1$/$2/"`
echo "Renombrando $file por $newname"
mv "$file" "$newname"
done
exit 0
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
ASUNTO="Acceso de usuario:"
FECHA=$(date)
IP=$(who | cut -d"(" -f2 | cut -d")" -f1)
SERVIDOR= #ip o dominio del servidor de correo
PUERTO=#puerto de conexión SMTP o SMTPS con el servidor de correo
REMITENTE=#correo existente de quien envia
DESTINATARIO=#correo existente de quien recibirá
telnet $SERVIDOR $PUERTO &amp;lt;&amp;lt;_EOF
HELO $SERVIDOR
MAIL FROM:&amp;lt;$REMITENTE&amp;gt;
RCPT TO:&amp;lt;$DESTINATARIO&amp;gt;
DATA
From: &amp;lt;$REMITENTE&amp;gt;
To: &amp;lt;$DESTINATARIO&amp;gt;
Subject: $ASUNTO - $FECHA
Se ha identificado un acceso por parte del usuario __indique-aqui-el-usuario__
Acceso desde $IP
.
QUIT
_EOF</pre>
<hr/><pre class="brush:bash">#!/bin/bash
##
## virtualbox-daemon-mcy.sh
##
## Version : 0.2 27.01.2012 03:05:43
##
## Descripcion: Demonio de inicio de Maquinas virtuales de VirtualBox
## El objetivo es automatizar el inicio de maquinas virtuales de
## Virtualbox en modo headless ( que es cuando nose ejecutan en modo
## interactivo, sin interfaz grafica, sino en background ). Se soportan
## el inicio de clientes windows como Linux y se mantiene un log por
## fechas de cuando se arranco/detuvo/guardo una sesion. Los logs se
## almacenan en el $HOME/.VBoxLogs del usuario que tiene las VM.
##
## Copyright 2012 Cesar Yanez &lt;[email protected]&gt;
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
## MA 02110-1301, USA.
### MODIFICABLE POR USUARIO ### MODIFICABLE POR USUARIO #######
##
## Info: VMs Windows ###
##
## Ayuda:
## VBX_WIN_TOTAL : cantidad de Maquinas Virtuales con Win
##
## VBX_WIN_NAMEX : nombre de la maquina virtual X con Win
## VBX_WIN_USERX : usuario admin de la maquina virtual X
## VBX_WIN_PASSX : password admin de la maquina virtual X
## VBX_WIN_NUMIPX : numero ip de la maquina virtual X
##
## Si hay mas de 4 maquinas virtuales con windows copiar
## y repetir secciones sin repetir numeros
##
VBX_WIN_TOTAL=1
VBX_WIN_NAME1="Windows XP"
VBX_WIN_USER1="cesar"
VBX_WIN_PASS1="cesar"
VBX_WIN_NUMIP1="192.168.1.140"
VBX_WIN_NAME2=""
VBX_WIN_USER2=""
VBX_WIN_PASS2=""
VBX_WIN_NUMIP2=""
VBX_WIN_NAME3=""
VBX_WIN_USER3=""
VBX_WIN_PASS3=""
VBX_WIN_NUMIP3=""
## Info: VMs Linux ###
##
## Ayuda:
## VBX_LIN_TOTAL : cantidad de Maquinas Virtuales con Linux
##
## VBX_LIN_NAMEX : nombre de la maquina virtual X con Linux
##
VBX_LIN_TOTAL=1
VBX_LIN_NAME1="DebianSqueeze"
VBX_LIN_NAME2=""
VBX_LIN_NAME3=""
VBX_LIN_NAME3=""
### Info: Usuario que es propietario de las maquinas virtuales
###
VBX_USR="rondamon"
### Maxima cantidad de tiempo a esperar para que se apague una
### sesion
MAX_SEC=30
### MODIFICABLE POR USUARIO ### MODIFICABLE POR USUARIO #######
###### NO MODIFICAR ###### NO MODIFICAR ###### NO MODIFICAR ####
setEnvVar(){
RPC_NET=`which net`
SYS_SU=`which su`
SYS_AWK=`which awk`
SYS_GREP=`which grep`
SYS_TR=`which tr`
SYS_WC=`which wc`
SYS_CUT=`which cut`
SYS_MKD=`which mkdir`
SYS_CHW=`which chown`
CUR_USR=`whoami`
VBX_MNG=`which VBoxManage`
VBX_USR_HOME=`$SYS_GREP $VBX_USR /etc/passwd|$SYS_CUT -d: -f6`
VBX_DIR_LOGS=$VBX_USR_HOME/.VBoxLogs
VBX_LOG_START=$VBX_DIR_LOGS/start.`date '+%d%m%y'`.logs
VBX_LOG_STOP=$VBX_DIR_LOGS/stop.`date '+%d%m%y'`.logs
VBX_LOG_SAVE=$VBX_DIR_LOGS/save.`date '+%d%m%y'`.logs
if [ ! -d $VBX_DIR_LOGS ]; then
$SYS_MKD $VBX_DIR_LOGS
fi
$SYS_CHW $VBX_USR:$VBX_USR $VBX_DIR_LOGS
}
checkVmRunning(){
VM_TOTAL=`expr $VBX_WIN_TOTAL + $VBX_LIN_TOTAL`
VM_TOTAL_RUNNING=`$SYS_SU $VBX_USR -c "$VBX_MNG list runningvms |$SYS_WC -l"`
if [ $VM_TOTAL_RUNNING -eq $VM_TOTAL ]; then
echo " - Todas las VMs estan ejecutandose"
return 10
elif [ $VM_TOTAL_RUNNING -eq 0 ]; then
echo " - Ninguna VMs en ejecucion"
return 0
elif [ $VM_TOTAL_RUNNING -ne $VM_TOTAL ]; then
echo " - Algunas VMs estan ejecutandose"
return 5
fi
}
checkStatusVms(){
if [ "$1" = " " ]; then
return 10
elif [ "$1" != " " ]; then
## VM_STATUS=`$SYS_SU -c "$VBX_MNG showvminfo $1 |$SYS_GREP ^State |$SYS_AWK '{print $2}'" $VBX_USR`
VM_STATUS=`$SYS_SU $VBX_USR -c "$VBX_MNG showvminfo \"$1\" |$SYS_GREP ^State |$SYS_TR -s ' ' ' '|$SYS_CUT -d ' ' -f 2"`
### echo VMSTATUSSSSSS $VM_STATUS
if [ "$VM_STATUS" = "saved" ]; then return 1
elif [ "$VM_STATUS" = "powered" ]; then return 2
elif [ "$VM_STATUS" = "running" ]; then return 3
fi
fi
}
startWindows(){
for i in `seq 1 $VBX_WIN_TOTAL`; do
NAMEL="VBX_WIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 1 ] || [ $STS -eq 2 ]; then
echo " - Iniciando VM Windows: " `eval $NAMELL`
$SYS_SU $VBX_USR -c "$VBX_MNG startvm \"`eval $NAMELL`\" -type headless &amp;gt;&amp;gt; ${VBX_LOG_START} 2&amp;gt;&amp;amp;1"
elif [ $STS -eq 3 ]; then
echo " - La VM `eval $NAMELL` ya esta ejecutandose"
fi
done
}
stopWindows(){
for i in `seq 1 $VBX_WIN_TOTAL`; do
NAMEL="VBX_WIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
NAMEU="VBX_WIN_USER$i"; NAMEUU='eval "echo \$$NAMEU"'
NAMEP="VBX_WIN_PASS$i"; NAMEPP='eval "echo \$$NAMEP"'
NAMEI="VBX_WIN_NUMIP$i"; NAMEII='eval "echo \$$NAMEI"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 2 ]; then
echo " - "`eval $NAMELL`" esta apagada"; return 0
elif [ $STS -eq 1 ]; then
echo " - "`eval $NAMELL`" esta guardada"; return 0
elif [ $STS -eq 3 ]; then
echo -n " - "`eval $NAMELL`" deteniendo ..."
## $RPC_NET rpc SHUTDOWN -t 0 -C "Apagado desde el servidor de maquinas vituales" -f -I \"`eval $NAMEII`\" -U `eval $NAMEUU`%`eval $NAMEPP`
$SYS_SU $VBX_USR -c "$VBX_MNG controlvm \"`eval $NAMELL`\" acpipowerbutton &amp;gt;&amp;gt; ${VBX_LOG_STOP} 2&amp;gt;&amp;amp;1"
for j in `seq 1 $MAX_SEC`; do
sleep 1; echo -n "$j."
done
echo ''; return 1
fi
done
}
saveWindows(){
for i in `seq 1 $VBX_WIN_TOTAL`; do
NAMEL="VBX_WIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 2 ] || [ $STS -eq 1 ]; then echo ''
elif [ $STS -eq 3]; then
echo " - Salvando VM Windows: " `eval $NAMELL`
$SYS_SU $VBX_USR -c "$VBX_MNG controlvm \"`eval $NAMELL`\" savestate &amp;gt;&amp;gt; ${VBX_LOG_SAVE} 2&amp;gt;&amp;amp;1"
fi
done
}
startLinux(){
for i in `seq 1 $VBX_LIN_TOTAL`; do
NAMEL="VBX_LIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 1 ] || [ $STS -eq 2 ]; then
echo " - Iniciando VM Linux: " `eval $NAMELL`
$SYS_SU $VBX_USR -c "$VBX_MNG startvm \"`eval $NAMELL`\" -type headless &amp;gt;&amp;gt; ${VBX_LOG_START} 2&amp;gt;&amp;amp;1"
elif [ $STS -eq 3 ]; then
echo " - La VM Linux `eval $NAMELL` ya esta ejecutandose"
fi
done
}
stopLinux(){
for i in `seq 1 $VBX_LIN_TOTAL`; do
NAMEL="VBX_LIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 2 ]; then
echo " - "`eval $NAMELL`" esta apagada"
return 0
elif [ $STS -eq 1 ]; then
echo " - "`eval $NAMELL`" esta guardada"
return 0
elif [ $STS -eq 3 ]; then
echo -n " - "`eval $NAMELL`" deteniendo ..."
$SYS_SU $VBX_USR -c "$VBX_MNG controlvm \"`eval $NAMELL`\" acpipowerbutton &amp;gt;&amp;gt; ${VBX_LOG_STOP} 2&amp;gt;&amp;amp;1"
for j in `seq 1 $MAX_SEC`; do
sleep 1; echo -n "$j."
done
echo ''; return 1
fi
done
}
saveLinux(){
for i in `seq 1 $VBX_LIN_TOTAL`; do
NAMEL="VBX_LIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 2 ] || [ $STS -eq 1 ]; then echo ''
elif [ $STS -eq 3]; then
echo " - Guardando VM Linux: " `eval $NAMELL`
$SYS_SU $VBX_USR -c "$VBX_MNG controlvm "`eval $NAMELL`" savestate &amp;gt;&amp;gt; ${VBX_LOG_SAVE} 2&amp;gt;&amp;amp;1"
fi
done
}
statusVm(){
for i in `seq 1 $VBX_WIN_TOTAL`; do
NAMEL="VBX_WIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 1 ]; then
echo " - STATUS: "`eval $NAMELL`" esta guardada"
elif [ $STS -eq 2 ]; then
echo " - STATUS: "`eval $NAMELL`" esta apagada"
elif [ $STS -eq 3 ]; then
echo " - STATUS: "`eval $NAMELL`" esta ejecutandose"
fi
done
for i in `seq 1 $VBX_LIN_TOTAL`; do
NAMEL="VBX_LIN_NAME$i"; NAMELL='eval "echo \$$NAMEL"'
checkStatusVms "`eval $NAMELL`"
STS=$?
if [ $STS -eq 1 ]; then
echo " - STATUS: "`eval $NAMELL`" esta guardada"
elif [ $STS -eq 2 ]; then
echo " - STATUS: "`eval $NAMELL`" esta apagada"
elif [ $STS -eq 3 ]; then
echo " - STATUS: "`eval $NAMELL`" esta ejecutandose"
fi
done
echo ''
}
setEnvVar
echo ''
echo '#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*'
echo '* Script de Arranque y Apagado de Maquinas Virtuales (VMs) #'
echo '#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*'
echo ''
case $1 in
start)
echo '*** Iniciando VMs, espere a que inicien los sistemas ***'
startLinux
startWindows
;;
stop)
echo '*** Deteniendo VMs, espere a que terminen de apagar los sistemas ***'
stopLinux
stopWindows
## si no se apago la VM se guarda su estado para proteccion del filesystem
checkVmRunning
STS=$?
if [ $STS -ne 0 ]; then
saveWindows
saveLinux
elif [ $STS -eq 0 ]; then echo ''; echo " - Todas las VMs Apagadas"; echo ''
fi
;;
status)
statusVm
;;
restart)
$0 stop; $0 start
;;
*)
echo ''; echo "Modo de Uso: $0 {start|stop|status|restart}"; echo ''
;;
esac
###### NO MODIFICAR ###### NO MODIFICAR ###### NO MODIFICAR ####
&lt;/[email protected]&gt;</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Tiny scripts to make your life a bit easier by carp (www.danieldemichele.com.ar)
# Only allow to run script if Root
if [[ $EUID -ne 0 ]];
then
echo "Permisos insuficientes. Corra este script como Root!" 1&amp;gt;&amp;amp;2
exit 1
else
#Check if service exists
if [ -f /etc/init.d/$1 ]
then
# We do have a service, lets shoot the Flag (System will give valid options if bad Flag):
exec /etc/init.d/$1 $2
else
# No Service at init.d, return error ...
echo "El servicio "$1" no existe en /etc/init.d/";
fi
fi</pre>
<pre class="brush:perl">#!/usr/bin/perl
# Tiny scripts to make your life a bit easier by carp (www.danieldemichele.com.ar)
# Get Flags:
$service = $ARGV[0];
$task = $ARGV[1];
# Only allow to run script if Root
if ( $&amp;lt; == 0 ){
#Check if service exists
$requested_service = '/etc/init.d/'.$service;
if(!(-e $requested_service)){
# No Service at init.d, return error ...
print "El servicio ".$service." no existe en /etc/init.d/\n";
}else{
# We do have a service, lets shoot the Flag (System will give valid options if bad Flag):
system "/etc/init.d/".$service." ".$task;
}
}else{
# No Root? =(
print "Permisos insuficientes. Corra este script como Root!.\n";
}</pre>
<hr/><pre class="brush:bash">#!/bin/bash
ADMIN="[email protected]"
# Nivel de alarma al 70%
ALERT=70
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output;
do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
echo "Poco espacio en "$partition ($usep%)" en $(hostname) en el dia $(date)" &amp;gt;&amp;gt; alerta-disco-$(date +%d-%m-%y)-$ALERT.txt
cat alerta-disco-$(date +%d-%m-%y)-$ALERT.txt | mail -s "Alerta de poco esapcio en disco en $(hostname)" $ADMIN
fi
done</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# FlashVideo Downloader
# Code By Kypzkore Kodeinfect
# http://kode-labs.blogspot.com
lsof | grep '/tmp/Flash[^ ]*' | awk '{ print "/proc/" $2 "/fd/" $4 }' | sed 's/[rwu]$//'</pre>
<pre class="brush:plain">chmod +x flashvids.sh</pre>
<pre class="brush:plain">alias flashtmp='sh /home/use/flashvids.sh'</pre>
<hr/><pre class="brush:bash">cp /proc/7254/fd/32 /media/geek/Videos</pre>
<hr/><pre class="brush:bash">#!/usr/bin/env bash
progname=$(basename $0)
if [ -z "$2" ]
then
echo -e "Usage: $progname idiomaDestino 'palabras a traducir...'"
echo -e "Example: $progname en 'Hola como!'\n"
exit
fi
TO="$1"
shift 1
# Google Translate Ajax API Url
TRANSURL='http://ajax.googleapis.com/ajax/services/language/translate?v=1.0'
# Parse string to translate, change ' ' to '+'
# STRING: String to translate.
STRING="$@"
PSTRING=$(echo "$STRING" |tr ' ' '+')
DETECT='http://ajax.googleapis.com/ajax/services/language/detect?v=1.0'
RESPONSE_DETECT=$(/usr/bin/env curl -s -A Mozilla $DETECT'&amp;amp;q='$PSTRING)
FROM=$(echo "$RESPONSE_DETECT" | cut -d ':' -f 3 |cut -d ',' -f 1 | sed -s "s/^\([\"']\)\(.*\)\1\$/\2/g")
LANGPAIR="$FROM|$TO"
# Get translation
RESPONSE=$(/usr/bin/env curl -s -A Mozilla \
$TRANSURL'&amp;amp;langpair='$LANGPAIR'&amp;amp;q='$PSTRING)
echo -n "$progname&amp;gt; "
# Parse and clean response, to show only translation.
echo "$RESPONSE" |cut -d ':' -f 3 |cut -d '}' -f 1</pre>
<pre class="brush:plain">gtranslate en hola mundo</pre>
<hr/><pre class="brush:bash">##############################
# Matavirus #
#autor: epsilon77 #
#[email protected] #
#http://www.RinconInformatico.net #
###################################
#!/bin/bash
echo “Bienvenido a MataVirus”
echo “La memoria que desea analizar es: ”
ls /media/|grep -v cdrom
bandera=0
read -p “si o no?” respuesta
if [ "$respuesta" = "si" ];then
memoria=$(ls /media|grep -v cdrom)
cd /media/$memoria
else
read -p “por favor digite el nombre de la memoria: ” memoria
cd /media/
if [ -d $memoria ];then
cd /media/$memoria
else
echo “La memoria no esta montada”
bandera=1
fi
fi
if [ $bandera -eq 0 ];then
echo “eliminando virus y bichos raros….”
cd /media/$memoria
echo “Escaneando la raiz del dispositivo”
rm -rifv *.com
rm -rifv recycler
rm -rifv *.bat
rm -rifv [Aa]utorun.inf
for j in *
do
if [ -d "$j" ] ; then
cd “$j”
echo “Escaneando el directorio $j”
rm -rifv *.com
rm -rifv recycler
rm -rifv *.bat
rm -rifv [Aa]utorun.inf
cd ..
fi
done
echo “Virus borrados de forma correcta”
echo “Se ha terminado el proceso”
echo “hasta pronto”
fi</pre>
<hr/><pre class="brush:bash">#CLI Twitter Search
#@hecky [email protected]
#http://Neobits.org
clear &amp;amp;&amp;amp; echo -n "Ingresa Palabra a buscar en Twitter.com: " &amp;amp;&amp;amp; read parametro &amp;amp;&amp;amp; echo "" &amp;amp;&amp;amp; for tweet in {1..15};do curl search.twitter.com/search.json?q=$parametro\&amp;amp;rpp=100\&amp;amp;lang=es\&amp;amp;page=$tweet 2&amp;gt; /dev/null | grep text | php -r 'error_reporting(0); $c=""; $a=file_get_contents("php://STDIN"); for($i=100;$i&amp;gt;=1;$i--){$b=explode("text\":\"",$a); $c=explode("\",\"to_user",$b[$i]); echo html_entity_decode($c[0]).((strlen($c[0]) &amp;gt; 2) ? "\n" : "");}';done | nl | ascii2uni -q -a U | php -r 'echo stripslashes(file_get_contents("php://STDIN"));'</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
# ---------------------------------------------------------------------------------
# www.linuxtotal.com.mx
# firewall para un solo equipo conectado a traves de modem o adsl
# por: [email protected]
# (1) se eliminan reglas previas que hubiera y cadenas definidas por el usuario
/sbin/iptables -F
/sbin/iptables -X
# (2) se establecen politicas "duras" por defecto, es decir solo lo que se autorice
# explicitamente podra ingresar o salir del equipo
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
# (3)a la interface lo (localhost) se le permite todo
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT
# (4) evitamos ataques syn-flood limitando el acceso de paquetes nuevos
# desde internet a solo 4 por segundo y los demas se descartan
/sbin/iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 4 -j DROP
# (5) se evitan paquetes tcp que sean nuevos y que no tengan el flag SYN
# es decir, hay ataques o escaneos que llegan como conexiones nuevas
# pero sin ser paquetes syn, definitivamente no nos interesan
/sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# (6) todo lo que sea icmp (ping) y que intente entrar, se descarta
# con esto bloqueamos cualquier tipo de paquetes con protocolo icmp
# evitando ataques como el del ping de la muerte, aunque esta regla
# podria provocar problemas de comunicacion con algunos ISP.
iptables -A INPUT -p icmp -j DROP
# (7) por ultimo las dos siguientes reglas permiten salir del equipo
# (output) conexiones nuevas que nosotros solicitamos, conexiones establecidas
# y conexiones relacionadas, y deja entrar (input) solo conexiones establecidas
# y relacionadas.
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# ---------------------------------------------------------------------------------
</pre>
<pre class="brush:plain">
Damos permisos de ejecución &lt;/br&gt;
chmod +x firewall.bash &lt;/br&gt;
Levantamos el firewall &lt;/br&gt;
./firewall.bash&lt;br&gt;
Confirmamos que que el firewall esté arriba &lt;/br&gt;
iptables --list &lt;/br&gt;
Guardamos las reglas para que estén presentes cada que inicie el sistema.&lt;/br&gt;
iptables-save &gt; /etc/firewall.conf &lt;/br&gt;
echo "#!/bin/sh" &gt; /etc/network/if-up.d/iptables &lt;/br&gt;
echo "iptables-restore &lt; /etc/firewall.conf" &gt;&gt; /etc/network/if-up.d/iptables &lt;/br&gt;
chmod +x /etc/network/if-up.d/iptables &lt;/br&gt;
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Video To Avi
# Created: Inameiname
# Version: 3.2
######################################################################################################################################################
###### OPEN IN TERMINAL ###### OPEN IN TERMINAL ###### OPEN IN TERMINAL ###### OPEN IN TERMINAL ###### OPEN IN TERMINAL ###### OPEN IN TERMINAL ######
######################################################################################################################################################
##################################################
# Run in the terminal on double-click #
##################################################
tty -s; if [ $? -ne 0 ] ; then gnome-terminal -e "$0"; exit; fi
##################################################
# If it doesn't run in the terminal on #
# double-click, say so #
##################################################
[ -t 0 ] &amp;amp;&amp;amp; [ -t 1 ] || { zenity --warning --text="${0}: this script must be run from a terminal." ; exit 1 ;}
######################################################################################################################################################
###### INPUT SOURCE VIDEO2AVI STUFF ###### INPUT SOURCE VIDEO2AVI STUFF ###### INPUT SOURCE VIDEO2AVI STUFF ###### INPUT SOURCE VIDEO2AVI STUFF ######
######################################################################################################################################################
##################################################
# Check whether environment variables are empty #
##################################################
###### see if the Nautilus environment variable is empty
# if it exists, set it equal to 'INPUT_FILE'
for ARCHIVE_FULLPATH in $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS; do
ARCHIVE_PATH=${ARCHIVE_FULLPATH%.*}
if [ -f $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ] ; then
# if select iso file:
if [ $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS = $ARCHIVE_PATH.iso ] ; then
# to get desired title on dvd
# requires lsdvd: sudo apt-get install lsdvd
lsdvd $ARCHIVE_PATH.iso
echo -n "Please enter the title number you will convert (usually the longest one):
Press 'Enter' for default (default is '1')...
"
read TITLE
# extra blank space
echo "
"
# default
if [[ -z $TITLE ]] ; then
# If no title passed, default to 1
TITLE=1
fi
INPUT_FILE="dvd://$TITLE -dvd-device $ARCHIVE_PATH.iso"
fi
# if select video file:
if [ $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS != $ARCHIVE_PATH.iso ] ; then
INPUT_FILE=$NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
fi
fi
done
# if it's blank, set it equal to $1
if [ -z $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS ] ; then
# If it's blank, set it equal to $1
NAUTILUS_SCRIPT_SELECTED_FILE_PATHS=$1
###### see if the '$1' variable is empty
# if it exists, set it equal to 'INPUT_FILE'
for ARCHIVE_FULLPATH in $1; do
ARCHIVE_PATH=${ARCHIVE_FULLPATH%.*}
if [ -f $1 ] ; then
# if select iso file:
if [ $1 = $ARCHIVE_PATH.iso ] ; then
# to get desired title on dvd
# requires lsdvd: sudo apt-get install lsdvd
lsdvd $ARCHIVE_PATH.iso
echo -n "Please enter the title number you will convert (usually the longest one):
Press 'Enter' for default (default is '1')...
"
read TITLE
# extra blank space
echo "
"
# default
if [[ -z $TITLE ]] ; then
# If no title passed, default to 1
TITLE=1
fi
INPUT_FILE="dvd://$TITLE -dvd-device $ARCHIVE_PATH.iso"
fi
# if select video file:
if [ $1 != $ARCHIVE_PATH.iso ] ; then
INPUT_FILE=$1
fi
fi
done
# if it's blank, do the following:
if [ -z "$1" ] ; then
##################################################
# Input DVD/ISO/VIDEO file menu #
##################################################
echo -n "What do you want to convert to AVI?:
(1) DVD
(2) ISO file
(3) Video file (such as MKV, VOB, MPEG, AVI, WMV, and etc.)
Press 'Enter' for default (default is '1')...
"
read TYPE
# extra blank space
echo "
"
###### Input DVD/ISO/VIDEO source default ######
if [[ -z $TYPE ]] ; then
# If no media passed, default to 1
TYPE=1
fi
###### Input DVD/ISO/VIDEO source ######
###### DVD to AVI
if [[ $TYPE = 1 ]] ; then
# to get desired device
df -h -x tmpfs -x usbfs
echo -n "Please enter the appropriate DVD drive:
(1) /dev/dvd
(2) /dev/sr0
(3) /dev/sr1
(4) /dev/sr2
(5) custom
Press 'Enter' for default (default is '1')...
"
read DEVICE_NUMBER
# extra blank space
echo "
"
# default
if [[ -z $DEVICE_NUMBER ]] ; then
# If no device passed, default to /dev/dvd
DEVICE=/dev/dvd
fi
# preset
if [[ $DEVICE_NUMBER = 1 ]] ; then
DEVICE=/dev/dvd
fi
if [[ $DEVICE_NUMBER = 2 ]] ; then
DEVICE=/dev/sr0
fi
if [[ $DEVICE_NUMBER = 3 ]] ; then
DEVICE=/dev/sr1
fi
if [[ $DEVICE_NUMBER = 4 ]] ; then
DEVICE=/dev/sr2
fi
# custom
if [[ $DEVICE_NUMBER = 5 ]] ; then
echo -n "Please enter the appropriate DVD drive: "
echo -n "...like this: '/dev/dvd'..."
read CUSTOM_DEVICE
DEVICE=$CUSTOM_DEVICE
fi
# to get desired title on dvd
# requires lsdvd: sudo apt-get install lsdvd
lsdvd $DEVICE
echo -n "Please enter the title number you will convert (usually the longest one):
Press 'Enter' for default (default is '1')...
"
read TITLE
# extra blank space
echo "
"
# default
if [[ -z $TITLE ]] ; then
# If no title passed, default to 1
TITLE=1
fi
# to decide to copy straight from the DVD or first copy to hard drive to ISO
echo -n "Would you first like to copy the DVD onto your hard drive (to ISO)?:
(1) Yes (Highly Recommended)
(2) No
Press 'Enter' for default (default is '1')...
"
read DVD2ISO
# extra blank space
echo "
"
# default
if [[ -z $DVD2ISO ]] ; then
# If no DVD2ISO passed, default to 1
dd if=$DEVICE of=NEW.iso
INPUT_FILE="dvd://$TITLE -dvd-device NEW.iso"
fi
# preset
if [[ $DVD2ISO = 1 ]] ; then
dd if=$DEVICE of=NEW.iso
INPUT_FILE="dvd://$TITLE -dvd-device NEW.iso"
fi
if [[ $DVD2ISO = 2 ]] ; then
INPUT_FILE="dvd://$TITLE -dvd-device $DEVICE"
fi
fi
###### ISO to AVI
if [[ $TYPE = 2 ]] ; then
echo -n "Please enter the full path for the ISO:
Example: /home/(your username)/Videos/NEW.iso...
"
read ISO
# extra blank space
echo "
"
# to get desired title on dvd
# requires lsdvd: sudo apt-get install lsdvd
lsdvd $ISO
echo -n "Please enter the title number you will convert (usually the longest one):
Press 'Enter' for default (default is '1')...
"
read TITLE
# extra blank space
echo "
"
# default
if [[ -z $TITLE ]] ; then
# If no title passed, default to 1
TITLE=1
fi
INPUT_FILE="dvd://$TITLE -dvd-device $ISO"
fi
###### Video to AVI
if [[ $TYPE = 3 ]] ; then
echo -n "Please enter the name for the input file (full path, with extension):
It can be any type, such as MKV, VOB, MPEG, AVI, WMV, and etc...
Example: /home/(your username)/Videos/NEW.avi...
"
read VIDEO_FILE
# extra blank space
echo "
"
INPUT_FILE=$VIDEO_FILE
fi
##################################################
# Close the variable statements #
##################################################
fi
fi
######################################################################################################################################################
###### GENERAL VIDEO2AVI STUFF ###### GENERAL VIDEO2AVI STUFF ###### GENERAL VIDEO2AVI STUFF ###### GENERAL VIDEO2AVI STUFF ###### GENERAL VIDEO2AVI STUFF
######################################################################################################################################################
##################################################
# Cropping (done automatically) #
##################################################
###### start a timer to kill mplayer
echo "Cropdetect is now running...
A few seconds of your video should now be playing...
"
###### start a timer to kill mplayer
(sleep 6 &amp;amp;&amp;amp; killall mplayer)&amp;amp;
###### start the mplayer cropdetect on on the DVD at a random time
mplayer $INPUT_FILE -ss 0:03:10 -vf cropdetect &amp;amp;&amp;gt; mplayer.tmp
###### get last crop value from mplayer output and store in variable
CROP_VALUES=$(awk -F'crop=' '/\[CROP\]/{f=$2} END{print f}' ./mplayer.tmp |cut -d')' -f1)
###### print detected crop values
echo -e "\n\nDetected crop values = ${CROP_VALUES}\n\n"
##################################################
# Output desired name for file #
##################################################
###### file input
echo -n "Please enter a name for the output file (without extension):
Press 'Enter' for default (default is 'NEW')...
"
read OUTPUT_FILE
###### extra blank space
echo "
"
###### default ######
if [[ -z $OUTPUT_FILE ]] ; then
# If no file passed, default to NEW
OUTPUT_FILE=NEW_$(date "+%y.%m.%d_%H.%M")
fi
##################################################
# Available processor number (done automatically)#
##################################################
CPUS=$(grep -c processor /proc/cpuinfo)
echo "Using $CPUS processor(s)..."
###### extra blank space
echo "
"
######################################################################################################################################################
###### MAIN MENU OPTIONS AND CHOICES ###### MAIN MENU OPTIONS AND CHOICES ###### MAIN MENU OPTIONS AND CHOICES ###### MAIN MENU OPTIONS AND CHOICES ######
######################################################################################################################################################
##################################################
# Preset/Custom type options #
##################################################
echo -n "Select a quality level:
(1) exact copy quality MPEG (DVD/ISO sources only)
(2) exact copy audio-only quality AC3 (DVD/ISO sources only)
(3) very high quality H.264 (2-pass) (350min:105min film w/2 1.5mhz cpus)
(4) very high quality DIVX/MPEG-4 (2-pass) (270min:105min film w/2 1.5mhz cpus)
(5) very high quality XVID (2-pass) (220min:105min film w/2 1.5mhz cpus)
(6) very high quality H.264 (1-pass) (400min:105min film w/2 1.5mhz cpus)
(7) very high quality DIVX/MPEG-4 (1-pass) (230min:105min film w/2 1.5mhz cpus)
(8) very high quality XVID (1-pass) (180min:105min film w/2 1.5mhz cpus)
(9) high quality H.264 (2-pass) (240min:105min film w/2 1.5mhz cpus)
(10)high quality DIVX/MPEG-4 (2-pass) (190min:105min film w/2 1.5mhz cpus)
(11)high quality XVID (2-pass) (135min:105min film w/2 1.5mhz cpus)
(12)high quality H.264 (1-pass) (200min:105min film w/2 1.5mhz cpus)
(13)high quality DIVX/MPEG-4 (1-pass) (150min:105min film w/2 1.5mhz cpus)
(14)high quality XVID (1-pass) (090min:105min film w/2 1.5mhz cpus)
(15)fast quality H.264 (1-pass) (155min:105min film w/2 1.5mhz cpus)
(16)fast quality DIVX/MPEG-4 (1-pass) (065min:105min film w/2 1.5mhz cpus)
(17)fast quality XVID (1-pass) (065min:105min film w/2 1.5mhz cpus)
(18)fast quality XVID YouTube (1-pass) (025min:105min film w/2 1.5mhz cpus)
(19)realtime quality DIVX/MPEG-4 (1-pass) (050min:105min film w/2 1.5mhz cpus)
(20)realtime quality XVID (1-pass) (060min:105min film w/2 1.5mhz cpus)
(21)low quality WMV (1-pass) (017min:105min film w/2 1.5mhz cpus)
(22)custom quality
Press 'Enter' for default (default is '14')... "
read Q
###### extra blank space
echo "
"
###### default ######
if [[ -z $Q ]] ; then
# If no quality passed, default to 14
Q=14
fi
##################################################
# Frame rate #
##################################################
###### frame rate menu
if [[ $Q != 1 &amp;amp;&amp;amp; $Q != 2 ]] ; then
echo -n "Select a frame rate level:
(1) NTSC-VIDEO (~ 30 fps)
(2) NTSC-FILM (~ 24 fps)
(3) PAL (~ 25 fps)
(4) Streaming (~ 15 fps)
(5) custom
Press 'Enter' for default (default is '2')...
"
read FRAME_RATE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $FRAME_RATE_NUMBER ]] ; then
# If no frame rate passed, default to 2
FRAME_RATE="-ofps 24000/1001"
fi
###### preset
if [[ $FRAME_RATE_NUMBER = 1 ]] ; then
FRAME_RATE="-ofps 30000/1001"
fi
if [[ $FRAME_RATE_NUMBER = 2 ]] ; then
FRAME_RATE="-ofps 24000/1001"
fi
if [[ $FRAME_RATE_NUMBER = 3 ]] ; then
FRAME_RATE="-ofps 25000/1001"
fi
if [[ $FRAME_RATE_NUMBER = 4 ]] ; then
FRAME_RATE="-ofps 15000/1001"
fi
###### custom
if [[ $FRAME_RATE_NUMBER = 5 ]] ; then
echo -n "Please enter a frame rate: "
echo -n "...like this: '-ofps 15000/1001'..."
read CUSTOM_FRAME_RATE
FRAME_RATE=$CUSTOM_FRAME_RATE
fi
fi
##################################################
# Divx ffourcc menu #
##################################################
###### DivX ffourcc menu
if [[ $Q != 1 &amp;amp;&amp;amp; $Q != 2 &amp;amp;&amp;amp; $Q != 3 &amp;amp;&amp;amp; $Q != 5 &amp;amp;&amp;amp; $Q != 6 &amp;amp;&amp;amp; $Q != 8 &amp;amp;&amp;amp; $Q != 9 &amp;amp;&amp;amp; Q != 11 &amp;amp;&amp;amp; $Q != 12 &amp;amp;&amp;amp; $Q != 14 &amp;amp;&amp;amp; $Q != 15 &amp;amp;&amp;amp; $Q != 17 &amp;amp;&amp;amp; $Q != 18 &amp;amp;&amp;amp; $Q != 20 &amp;amp;&amp;amp; $Q != 21 &amp;amp;&amp;amp; $Q != 22 ]] ; then
echo -n "Select the desired Divx or generic MPEG4 quality:
(1) FFMPEG MPEG-4
(2) DivX MPEG-4 Version 4
(3) DivX MPEG-4 Version 5
Press 'Enter' for default (default is '3')...
"
read DIVX_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $DIVX_NUMBER ]] ; then
# If no file passed, default to 3
DIVX="-ffourcc DX50"
fi
###### preset
if [[ $DIVX_NUMBER = 1 ]] ; then
DIVX=
fi
if [[ $DIVX_NUMBER = 2 ]] ; then
DIVX="-ffourcc DIVX"
fi
if [[ $DIVX_NUMBER = 3 ]] ; then
DIVX="-ffourcc DX50"
fi
fi
##################################################
# Conversion is starting #
##################################################
###### conversion is starting message
if [[ $Q != 22 ]] ; then
read -sn 1 -p "Your conversion is about to begin, press any key to continue..."
fi
###### extra blank space
echo "
"
##################################################
# Conversions #
##################################################
###### preset ######
###### exact copy quality (DVD/ISO sources only)
if [[ $Q = 1 ]] ; then
# If 1 passed, use MPEG exact copy quality
mplayer $INPUT_FILE -dumpstream -dumpfile $OUTPUT_FILE.mpg
fi
if [[ $Q = 2 ]] ; then
# If 2 passed, use MPEG exact copy audio-only quality
mplayer $INPUT_FILE -dumpaudio -dumpfile $OUTPUT_FILE.ac3
fi
###### very high quality
if [[ $Q = 3 ]] ; then
# very high H.264 quality (2-pass)
# actual two-pass conversion
mencoder $INPUT_FILE -nosound -ovc x264 -x264encopts pass=1:subq=1:partitions=all:8x8dct:me=umh:frameref=1:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=2000 -vf pp=de,pullup,softskip,harddup,crop=${CROP_VALUES} $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=192:vol=3 -ovc x264 -x264encopts pass=2:subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=2000 -vf pp=de,pullup,softskip,harddup,crop=${CROP_VALUES} $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 4 ]] ; then
# very high MPEG4 quality (2-pass)
# actual two-pass conversion
mencoder $INPUT_FILE -nosound -ovc lavc $DIVX -lavcopts vpass=1:vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:vhq:threads=$CPUS:vbitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=192:vol=3 -ovc lavc $DIVX -lavcopts vpass=2:vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2:vhq:threads=$CPUS:vbitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 5 ]] ; then
# very high XVID quality (2-pass)
# actual two-pass conversion
mencoder $INPUT_FILE -nosound -ovc xvid -xvidencopts pass=1:chroma_opt:vhq=1:bvhq=1:quant_type=mpeg:threads=$CPUS:bitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=192:vol=3 -ovc xvid -xvidencopts pass=2:chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:threads=$CPUS:bitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 6 ]] ; then
# very high H.264 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=192:vol=3 -ovc x264 -x264encopts subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 7 ]] ; then
# very high MPEG4 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=192:vol=3 -ovc lavc $DIVX -lavcopts vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2:vhq:threads=$CPUS:vbitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 8 ]] ; then
# very high XVID quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=192:vol=3 -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:threads=$CPUS:bitrate=2000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES} $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### high quality
if [[ $Q = 9 ]] ; then
# high H.264 quality (2-pass)
# actual two-pass conversion
mencoder $INPUT_FILE -nosound -ovc x264 -x264encopts pass=1:subq=1:partitions=all:8x8dct:me=umh:frameref=1:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=-700000 -vf pp=de,pullup,softskip,harddup,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc x264 -x264encopts pass=2:subq=5:8x8dct:frameref=2:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=1200 -vf pp=de,pullup,softskip,harddup,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 10 ]] ; then
# high MPEG4 quality (2-pass)
# actual two-pass conversion
mencoder $INPUT_FILE -nosound -ovc lavc $DIVX -lavcopts vpass=1:vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:vhq:threads=$CPUS:vbitrate=1100 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc lavc $DIVX -lavcopts vpass=2:vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:vhq:threads=$CPUS:vbitrate=1100 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 11 ]] ; then
# high XVID quality (2-pass)
# actual two-pass conversion
mencoder $INPUT_FILE -nosound -ovc xvid -xvidencopts pass=1:vhq=1:bvhq=1:chroma_opt:quant_type=mpeg:threads=$CPUS:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc xvid -xvidencopts pass=2:vhq=2:bvhq=1:chroma_opt:quant_type=mpeg:threads=$CPUS:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 12 ]] ; then
# high H.264 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc x264 -x264encopts subq=5:8x8dct:frameref=2:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 13 ]] ; then
# high MPEG4 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc lavc $DIVX -lavcopts vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:vhq:threads=$CPUS:vbitrate=1100 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 14 ]] ; then
# high XVID quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc xvid -xvidencopts vhq=2:bvhq=1:chroma_opt:quant_type=mpeg:threads=$CPUS:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### fast quality
if [[ $Q = 15 ]] ; then
# fast H.264 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc x264 -x264encopts subq=4:8x8dct:bframes=2:b_pyramid=normal:weight_b:threads=auto:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 16 ]] ; then
# fast MPEG4 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc lavc $DIVX -lavcopts vcodec=mpeg4:mbd=2:trell:v4mv:turbo:vhq:threads=$CPUS:vbitrate=1100 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 17 ]] ; then
# fast XVID quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc xvid -xvidencopts turbo:vhq=0:threads=$CPUS:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### YouTube quality
if [[ $Q = 18 ]] ; then
# YouTube MPEG4 quality (1-pass)
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc lavc $DIVX -lavcopts vcodec=mpeg4:threads=$CPUS -ffourcc xvid -vf scale=320:-2,expand=:240:::1 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### realtime quality
if [[ $Q = 19 ]] ; then
# realtime MPEG4 quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc lavc $DIVX -lavcopts vcodec=mpeg4:mbd=2:turbo:vhq:threads=$CPUS:vbitrate=1100 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $Q = 20 ]] ; then
# realtime XVID quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts abr:br=128:vol=3 -ovc xvid -xvidencopts turbo:nochroma_me:notrellis:max_bframes=0:vhq=0:threads=$CPUS:bitrate=-700000 -vf pp=de,pullup,softskip,crop=${CROP_VALUES},scale -zoom -xy 624 $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### low quality
if [[ $Q = 21 ]] ; then
# low WMV quality (1-pass)
# actual one-pass conversion
mencoder $INPUT_FILE -oac mp3lame -lameopts cbr:br=16:vol=3 -ovc lavc -lavcopts vcodec=wmv2:vbitrate=100 -vf scale -zoom -xy 240 $FRAME_RATE -o $OUTPUT_FILE.wmv
fi
######################################################################################################################################################
###### CUSTOM QUALITY CHOICE #17 OPTION AND CHOICES ###### CUSTOM QUALITY CHOICE #17 OPTION AND CHOICES ###### MISCELLANEOUS ###### CUSTOM QUALITY CHOICE
######################################################################################################################################################
##################################################
# Custom quality #
##################################################
if [[ $Q = 22 ]] ; then
# If 22 passed, use custom quality (1-pass and 2-pass)
##################################################
# Custom type options #
##################################################
echo -n "What type of AVI do you want to create with custom settings?:
(1) H.264 (2-Pass)
(2) H.264 (1-Pass)
(3) DIVX/MPEG-4 (2-Pass)
(4) DIVX/MPEG-4 (1-Pass)
(5) XVID (2-Pass)
(6) XVID (1-Pass)
Press 'Enter' for default (default is '6')...
"
read MPEG4_TYPE
###### extra blank space
echo "
"
###### default ######
if [[ -z $MPEG4_TYPE ]] ; then
# If no media passed, default to 6
MPEG4_TYPE=6
fi
erlo
##################################################
# Custom Divx ffourcc menu #
##################################################
###### DivX ffourcc menu
if [[ $MPEG4_TYPE != 1 &amp;amp;&amp;amp; $MPEG4_TYPE != 2 &amp;amp;&amp;amp; $MPEG4_TYPE != 5 &amp;amp;&amp;amp; $MPEG4_TYPE != 6 ]] ; then
echo -n "Select the desired Divx or generic MPEG4 quality:
(1) FFMPEG MPEG-4
(2) DivX MPEG-4 Version 4
(3) DivX MPEG-4 Version 5
Press 'Enter' for default (default is '3')...
"
read CUSTOM_DIVX_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $CUSTOM_DIVX_NUMBER ]] ; then
# If no file passed, default to 3
CUSTOM_DIVX="-ffourcc DX50"
fi
###### preset
if [[ $CUSTOM_DIVX_NUMBER = 1 ]] ; then
CUSTOM_DIVX=
fi
if [[ $CUSTOM_DIVX_NUMBER = 2 ]] ; then
CUSTOM_DIVX="-ffourcc DIVX"
fi
if [[ $CUSTOM_DIVX_NUMBER = 3 ]] ; then
CUSTOM_DIVX="-ffourcc DX50"
fi
fi
##################################################
# Custom scaling #
##################################################
echo -n "Choose a resolution:
(1) original resolution(cropped, but no scaling)
(2) 624 x 352 scaling (fullscreen/widescreen)
(3) 624 x ??? scaling (fullscreen/widescreen) (auto-height)
(4) 800 x 600 scaling (fullscreen)
(5) 800 x ??? scaling (fullscreen) (auto-height)
(6) 600 x 400 scaling (widescreen)
(7) 600 x ??? scaling (widescreen) (auto-height)
(8) 640 x 480 scaling (fullscreen)
(9) 640 x ??? scaling (fullscreen) (auto-height)
(10) 704 x 294 scaling (widescreen) (2.35:1)
(11) 704 x ??? scaling (widescreen) (2.35:1) (auto-height)
(12) 768 x 432 scaling (widescreen) (16:9)
(13) 768 x ??? scaling (widescreen) (16:9) (auto-height)
(14) custom
Press 'Enter' for default (default is '3')...
"
read SCALING_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $SCALING_NUMBER ]] ; then
# If no file passed, default to 3
SCALING="scale -zoom -xy 624"
fi
###### preset
if [[ $SCALING_NUMBER = 1 ]] ; then
SCALING="scale=${CROP_VALUES}"
fi
if [[ $SCALING_NUMBER = 2 ]] ; then
SCALING="scale=624:352"
fi
if [[ $SCALING_NUMBER = 3 ]] ; then
SCALING="scale -zoom -xy 624"
fi
if [[ $SCALING_NUMBER = 4 ]] ; then
SCALING="scale=800:600"
fi
if [[ $SCALING_NUMBER = 5 ]] ; then
SCALING="scale -zoom -xy 800"
fi
if [[ $SCALING_NUMBER = 6 ]] ; then
SCALING="scale=600:400"
fi
if [[ $SCALING_NUMBER = 7 ]] ; then
SCALING="scale -zoom -xy 600"
fi
if [[ $SCALING_NUMBER = 8 ]] ; then
SCALING="scale=640:480"
fi
if [[ $SCALING_NUMBER = 9 ]] ; then
SCALING="scale -zoom -xy 640"
fi
if [[ $SCALING_NUMBER = 10 ]] ; then
SCALING="scale=704:294"
fi
if [[ $SCALING_NUMBER = 11 ]] ; then
SCALING="sscale -zoom -xy 704"
fi
if [[ $SCALING_NUMBER = 12 ]] ; then
SCALING="scale=768:432"
fi
if [[ $SCALING_NUMBER = 13 ]] ; then
SCALING="scale -zoom -xy 768"
fi
###### custom
if [[ $SCALING_NUMBER = 14 ]] ; then
echo -n "Please enter a custom scale: "
echo -n "...like this: 'scale=800:600' or 'scale -zoom -xy 624'..."
read CUSTOM_SCALING
SCALING=$CUSTOM_SCALING
fi
##################################################
# Custom total/video bitrate level #
##################################################
echo -n "Select a total/video bitrate level:
(1) -350000 (= max file size of ~ 350MB) (H.264/XVID only)
(2) -700000 (= max file size of ~ 700MB) (H.264/XVID only)
(3) -1000000 (= max file size of ~ 1GB) (H.264/XVID only)
(4) 400 kbps
(5) 600 kbps
(6) 800 kbps
(7) 1000 kbps
(8) 1100 kbps
(9) 1150 kbps
(10) 1200 kbps
(11) 1250 kbps
(12) 1500 kbps
(13) 2000 kbps
(14) 3000 kbps
(15) 4000 kbps
(16) 5000 kbps
(17) custom
Press 'Enter' for default (default is '2')...
"
read BITRATE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $BITRATE_NUMBER ]] ; then
# If no file passed, default to 2
BITRATE=-700000
fi
###### preset
if [[ $BITRATE_NUMBER = 1 ]] ; then
BITRATE=-350000
fi
if [[ $BITRATE_NUMBER = 2 ]] ; then
BITRATE=-700000
fi
if [[ $BITRATE_NUMBER = 3 ]] ; then
BITRATE=-1000000
fi
if [[ $BITRATE_NUMBER = 4 ]] ; then
BITRATE=400
fi
if [[ $BITRATE_NUMBER = 5 ]] ; then
BITRATE=600
fi
if [[ $BITRATE_NUMBER = 6 ]] ; then
BITRATE=800
fi
if [[ $BITRATE_NUMBER = 7 ]] ; then
BITRATE=1000
fi
if [[ $BITRATE_NUMBER = 8 ]] ; then
BITRATE=1100
fi
if [[ $BITRATE_NUMBER = 9 ]] ; then
BITRATE=1150
fi
if [[ $BITRATE_NUMBER = 10 ]] ; then
BITRATE=1200
fi
if [[ $BITRATE_NUMBER = 11 ]] ; then
BITRATE=1250
fi
if [[ $BITRATE_NUMBER = 12 ]] ; then
BITRATE=1500
fi
if [[ $BITRATE_NUMBER = 13 ]] ; then
BITRATE=2000
fi
if [[ $BITRATE_NUMBER = 14 ]] ; then
BITRATE=3000
fi
if [[ $BITRATE_NUMBER = 15 ]] ; then
BITRATE=4000
fi
if [[ $BITRATE_NUMBER = 16 ]] ; then
BITRATE=5000
fi
###### custom
if [[ $BITRATE_NUMBER = 17 ]] ; then
echo -n "Please enter a custom total/video bitrate: "
echo -n "...like this: '1175'..."
read CUSTOM_BITRATE
BITRATE=$CUSTOM_BITRATE
fi
##################################################
# Custom audio track #
##################################################
echo -n "Select an audio track:
(1) -aid 0 (good when getting no audio with others) (ex.: Custom DVD rips)
(2) -aid 127
(3) -aid 128 (often main language non-director's commentary audio track)
(4) -aid 129 (often second track, such as director's commentary)
(5) -aid 130
(6) -aid 131
(7) -aid 132
(8) -aid 160
(9) custom
Press 'Enter' for default (default is 'null', which is DVD default)...
"
read AUDIO_TRACK_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $AUDIO_TRACK_NUMBER ]] ; then
# If no file passed, default to null
AUDIO_TRACK=
fi
###### preset
if [[ $AUDIO_TRACK_NUMBER = 1 ]] ; then
AUDIO_TRACK="-aid 0"
fi
if [[ $AUDIO_TRACK_NUMBER = 2 ]] ; then
AUDIO_TRACK="-aid 127"
fi
if [[ $AUDIO_TRACK_NUMBER = 3 ]] ; then
AUDIO_TRACK="-aid 128"
fi
if [[ $AUDIO_TRACK_NUMBER = 4 ]] ; then
AUDIO_TRACK="-aid 129"
fi
if [[ $AUDIO_TRACK_NUMBER = 5 ]] ; then
AUDIO_TRACK="-aid 130"
fi
if [[ $AUDIO_TRACK_NUMBER = 6 ]] ; then
AUDIO_TRACK="-aid 131"
fi
if [[ $AUDIO_TRACK_NUMBER = 7 ]] ; then
AUDIO_TRACK="-aid 132"
fi
if [[ $AUDIO_TRACK_NUMBER = 8 ]] ; then
AUDIO_TRACK="-aid 160"
fi
###### custom
if [[ $AUDIO_TRACK_NUMBER = 9 ]] ; then
echo -n "Please enter a custom audio track: "
echo -n "...like this: '-aid 128'..."
read CUSTOM_AUDIO_TRACK
AUDIO_TRACK=$CUSTOM_AUDIO_TRACK
fi
##################################################
# Custom audio track language #
##################################################
echo -n "Select an audio track language:
(1) Chinese - zh
(2) Dansk (Danish) - da
(3) Deutsch - de
(4) English - en
(5) Español - es
(6) Français - fr
(7) Greek - el
(8) Italiano (Italian) - it
(9) Japanese - ja
(10) Korean - ko
(11) Nederlands - nl
(12) Polish - pl
(13) Portugues - pt
(14) Russian - ru
Or input your own (like this: 'en')...
Press 'Enter' for default (default is 'null', which is DVD default)...
"
read AUDIO_LANGUAGE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $AUDIO_LANGUAGE_NUMBER ]] ; then
# If no file passed, default to null
AUDIO_LANGUAGE=
fi
###### preset
if [[ $AUDIO_LANGUAGE_NUMBER = 1 ]] ; then
AUDIO_LANGUAGE="-alang zh"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 2 ]] ; then
AUDIO_LANGUAGE="-alang da"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 3 ]] ; then
AUDIO_LANGUAGE="-alang de"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 4 ]] ; then
AUDIO_LANGUAGE="-alang en"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 5 ]] ; then
AUDIO_LANGUAGE="-alang es"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 6 ]] ; then
AUDIO_LANGUAGE="-alang fr"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 7 ]] ; then
AUDIO_LANGUAGE="-alang el"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 8 ]] ; then
AUDIO_LANGUAGE="-alang it"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 9 ]] ; then
AUDIO_LANGUAGE="-alang ja"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 10 ]] ; then
AUDIO_LANGUAGE="-alang ko"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 11 ]] ; then
AUDIO_LANGUAGE="-alang nl"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 12 ]] ; then
AUDIO_LANGUAGE="-alang pl"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 13 ]] ; then
AUDIO_LANGUAGE="-alang pt"
fi
if [[ $AUDIO_LANGUAGE_NUMBER = 14 ]] ; then
AUDIO_LANGUAGE="-alang ru"
fi
##################################################
# Custom audio bitrate level #
##################################################
echo -n "Select an audio bitrate level:
(1) 48 kbps
(2) 64 kbps
(3) 128 kbps
(4) 160 kbps
(5) 192 kbps
(6) 224 kbps
(7) 256 kbps
(8) 320 kbps
(9) custom
Press 'Enter' for default (default is '3')...
"
read AUDIO_BITRATE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $AUDIO_BITRATE_NUMBER ]] ; then
# If no file passed, default to 3
AUDIO_BITRATE=128
fi
###### preset
if [[ $AUDIO_BITRATE_NUMBER = 1 ]] ; then
AUDIO_BITRATE=48
fi
if [[ $AUDIO_BITRATE_NUMBER = 2 ]] ; then
AUDIO_BITRATE=96
fi
if [[ $AUDIO_BITRATE_NUMBER = 3 ]] ; then
AUDIO_BITRATE=128
fi
if [[ $AUDIO_BITRATE_NUMBER = 4 ]] ; then
AUDIO_BITRATE=160
fi
if [[ $AUDIO_BITRATE_NUMBER = 5 ]] ; then
AUDIO_BITRATE=192
fi
if [[ $AUDIO_BITRATE_NUMBER = 6 ]] ; then
AUDIO_BITRATE=224
fi
if [[ $AUDIO_BITRATE_NUMBER = 7 ]] ; then
AUDIO_BITRATE=256
fi
if [[ $AUDIO_BITRATE_NUMBER = 8 ]] ; then
AUDIO_BITRATE=320
fi
###### custom
if [[ $AUDIO_BITRATE_NUMBER = 9 ]] ; then
echo -n "Please enter a custom audio bitrate level: "
echo -n "...like this: '100'..."
read CUSTOM_AUDIO_BITRATE
AUDIO_BITRATE=$CUSTOM_AUDIO_BITRATE
fi
##################################################
# Custom audio bitrate type #
##################################################
echo -n "Select an audio bitrate type:
(1) Average Bitrate
(2) Constant Bitrate
(3) Variable Bitrate
Press 'Enter' for default (default is '1')...
"
read AUDIO_BITRATE_TYPE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $AUDIO_BITRATE_TYPE_NUMBER ]] ; then
# If no file passed, default to abr
AUDIO_BITRATE_TYPE=abr
fi
###### preset
if [[ $AUDIO_BITRATE_TYPE_NUMBER = 1 ]] ; then
AUDIO_BITRATE_TYPE=abr
fi
if [[ $AUDIO_BITRATE_TYPE_NUMBER = 2 ]] ; then
AUDIO_BITRATE_TYPE=cbr
fi
if [[ $AUDIO_BITRATE_TYPE_NUMBER = 3 ]] ; then
AUDIO_BITRATE_TYPE=vbr
fi
##################################################
# Custom audio volume level #
##################################################
echo -n "Select an audio volume increase level (1-10):
Press 'Enter' for default (default is '3')...
"
read AUDIO_VOLUME_LEVEL
###### extra blank space
echo "
"
###### default
if [[ -z $AUDIO_VOLUME_LEVEL ]] ; then
# If no file passed, default to 3
AUDIO_VOLUME_LEVEL=3
fi
##################################################
# Subtitles? #
##################################################
echo -n "Do you want subtitles?:
(1) No
(2) Yes (DVD/ISO only)
Press 'Enter' for default (default is '1', for no subtitles)...
"
read SUBTITLE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $SUBTITLE_NUMBER ]] ; then
# If no file passed, default to null
SUBTITLE_TRACK=
SUBTITLE_LANGUAGE=
SUBTITLE_TYPE=
fi
###### preset
if [[ $SUBTITLE_NUMBER = 1 ]] ; then
SUBTITLE_TRACK=
SUBTITLE_LANGUAGE=
SUBTITLE_TYPE=
fi
if [[ $SUBTITLE_NUMBER = 2 ]] ; then
##################################################
# Custom subtitle track #
##################################################
echo -n "Select a subtitle track:
(1) -sid 0
(2) -sid 1
(3) -sid 2
(4) -sid 3
(5) -sid 4
(6) -sid 5
(7) -sid 6
(8) -sid 7
(9) custom
Press 'Enter' for default (default is 'null')...
"
read SUBTITLE_TRACK_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $SUBTITLE_TRACK_NUMBER ]] ; then
# If no file passed, default to null
SUBTITLE_TRACK=
fi
###### preset
if [[ $SUBTITLE_TRACK_NUMBER = 1 ]] ; then
SUBTITLE_TRACK="-sid 0"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 2 ]] ; then
SUBTITLE_TRACK="-sid 1"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 3 ]] ; then
SUBTITLE_TRACK="-sid 2"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 4 ]] ; then
SUBTITLE_TRACK="-sid 3"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 5 ]] ; then
SUBTITLE_TRACK="-sid 4"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 6 ]] ; then
SUBTITLE_TRACK="-sid 5"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 7 ]] ; then
SUBTITLE_TRACK="-sid 6"
fi
if [[ $SUBTITLE_TRACK_NUMBER = 8 ]] ; then
SUBTITLE_TRACK="-sid 7"
fi
###### custom
if [[ $SUBTITLE_TRACK_NUMBER = 9 ]] ; then
echo -n "Please enter a custom subtitles track: "
echo -n "...like this: '-sid 10'..."
read CUSTOM_SUBTITLE_TRACK
SUBTITLE_TRACK=$CUSTOM_SUBTITLE_TRACK
fi
##################################################
# Custom subtitles track language #
##################################################
echo -n "Select a subtitles track language:
(1) Chinese - zh
(2) Dansk (Danish) - da
(3) Deutsch - de
(4) English - en
(5) Español - es
(6) Français - fr
(7) Greek - el
(8) Italiano (Italian) - it
(9) Japanese - ja
(10) Korean - ko
(11) Nederlands - nl
(12) Polish - pl
(13) Portugues - pt
(14) Russian - ru
Or input your own (like this: 'en')...
Press 'Enter' for default (default is 'null')...
"
read SUBTITLE_LANGUAGE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $SUBTITLE_LANGUAGE_NUMBER ]] ; then
# If no file passed, default to null
SUBTITLE_LANGUAGE=
fi
###### preset
if [[ $SUBTITLE_LANGUAGE_NUMBER = 1 ]] ; then
SUBTITLE_LANGUAGE="-slang zh"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 2 ]] ; then
SUBTITLE_LANGUAGE="-slang da"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 3 ]] ; then
SUBTITLE_LANGUAGE="-slang de"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 4 ]] ; then
SUBTITLE_LANGUAGE="-slang en"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 5 ]] ; then
SUBTITLE_LANGUAGE="-slang es"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 6 ]] ; then
SUBTITLE_LANGUAGE="-slang fr"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 7 ]] ; then
SUBTITLE_LANGUAGE="-slang el"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 8 ]] ; then
SUBTITLE_LANGUAGE="-slang it"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 9 ]] ; then
SUBTITLE_LANGUAGE="-slang ja"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 10 ]] ; then
SUBTITLE_LANGUAGE="-slang ko"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 11 ]] ; then
SUBTITLE_LANGUAGE="-slang nl"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 12 ]] ; then
SUBTITLE_LANGUAGE="-slang pl"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 13 ]] ; then
SUBTITLE_LANGUAGE="-slang pt"
fi
if [[ $SUBTITLE_LANGUAGE_NUMBER = 14 ]] ; then
SUBTITLE_LANGUAGE="-slang ru"
fi
##################################################
# Subtitle Kind? #
##################################################
echo -n "What kind of subtitles do you prefer?:
(1) Embed onto the video
(2) Embed into a separate file
Press 'Enter' for default (default is '1')...
"
read SUBTITLE_TYPE_NUMBER
###### extra blank space
echo "
"
###### default
if [[ -z $SUBTITLE_TYPE_NUMBER ]] ; then
# If no file passed, default to null
SUBTITLE_TYPE=
fi
###### preset
if [[ $SUBTITLE_TYPE_NUMBER = 1 ]] ; then
SUBTITLE_TYPE=
fi
if [[ $SUBTITLE_TYPE_NUMBER = 2 ]] ; then
SUBTITLE_TYPE="-vobsubout ${OUTPUT_FILE}"
fi
###### closes the preset of 'yes' for subtitles
fi
##################################################
# Custom conversion is starting #
##################################################
###### extra blank space
echo "
"
###### custom conversion is starting message
read -sn 1 -p "Your custom conversion is about to begin, press any key to continue..."
##################################################
# Custom conversions (very high quality settings)#
##################################################
###### custom preset ######
###### H.264
if [[ $MPEG4_TYPE = 1 ]] ; then
# actual two-pass conversion
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -nosound -ovc x264 -x264encopts pass=1:subq=1:partitions=all:8x8dct:me=umh:frameref=1:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=$BITRATE -vf pp=de,pullup,softskip,harddup,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -oac mp3lame -lameopts $AUDIO_BITRATE_TYPE:br=$AUDIO_BITRATE:vol=$AUDIO_VOLUME_LEVEL -ovc x264 -x264encopts pass=2:subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=$BITRATE -vf pp=de,pullup,softskip,harddup,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $MPEG4_TYPE = 2 ]] ; then
# actual one-pass conversion
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -oac mp3lame -lameopts $AUDIO_BITRATE_TYPE:br=$AUDIO_BITRATE:vol=$AUDIO_VOLUME_LEVEL -ovc x264 -x264encopts subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid=normal:weight_b:threads=auto:bitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### MPEG4
if [[ $MPEG4_TYPE = 3 ]] ; then
# actual two-pass conversion
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -nosound -ovc lavc $CUSTOM_DIVX -lavcopts vpass=1:vcodec=mpeg4:mbd=2:trell:v4mv:last_pred=2:dia=-1:vmax_b_frames=2:vb_strategy=1:cmp=3:subcmp=3:precmp=0:vqcomp=0.6:turbo:threads=$CPUS:vbitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -oac mp3lame -lameopts $AUDIO_BITRATE_TYPE:br=$AUDIO_BITRATE:vol=$AUDIO_VOLUME_LEVEL -ovc lavc $CUSTOM_DIVX -lavcopts vpass=2:vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2:threads=$CPUS:vbitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $MPEG4_TYPE = 4 ]] ; then
# actual one-pass conversion
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -oac mp3lame -lameopts $AUDIO_BITRATE_TYPE:br=$AUDIO_BITRATE:vol=$AUDIO_VOLUME_LEVEL -ovc lavc $CUSTOM_DIVX -lavcopts vcodec=mpeg4:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:predia=2:dia=2:vmax_b_frames=2:vb_strategy=1:precmp=2:cmp=2:subcmp=2:preme=2:qns=2:threads=$CPUS:vbitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o $OUTPUT_FILE.avi
fi
###### XVID
if [[ $MPEG4_TYPE = 5 ]] ; then
# actual two-pass conversion
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -nosound -ovc xvid -xvidencopts pass=1:chroma_opt:vhq=1:bvhq=1:quant_type=mpeg:threads=$CPUS:bitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o '/dev/null'
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -oac mp3lame -lameopts $AUDIO_BITRATE_TYPE:br=$AUDIO_BITRATE:vol=$AUDIO_VOLUME_LEVEL -ovc xvid -xvidencopts pass=2:chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:threads=$CPUS:bitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o $OUTPUT_FILE.avi
fi
if [[ $MPEG4_TYPE = 6 ]] ; then
# actual one-pass conversion
mencoder $INPUT_FILE $AUDIO_TRACK $AUDIO_LANGUAGE $SUBTITLE_TRACK $SUBTITLE_LANGUAGE $SUBTITLE_TYPE -oac mp3lame -lameopts $AUDIO_BITRATE_TYPE:br=$AUDIO_BITRATE:vol=$AUDIO_VOLUME_LEVEL -ovc xvid -xvidencopts chroma_opt:vhq=4:bvhq=1:quant_type=mpeg:threads=$CPUS:bitrate=$BITRATE -vf pp=de,pullup,softskip,crop=${CROP_VALUES},$SCALING $FRAME_RATE -o $OUTPUT_FILE.avi
fi
##################################################
# Close the custom quality option #17 #
##################################################
fi
######################################################################################################################################################
###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP ###### CLEANUP
######################################################################################################################################################
if [ -f mplayer.tmp ];then
rm mplayer.tmp
fi
if [ -f divx2pass.log ];then
rm divx2pass.log
fi
######################################################################################################################################################
###### CONVERSION FINISHED ###### CONVERSION FINISHED ###### CONVERSION FINISHED ###### CONVERSION FINISHED ###### CONVERSION FINISHED ######
######################################################################################################################################################
##################################################
# Conversion finished notifications #
##################################################
###### extra blank spaces
echo "
"
###### notifications
notify-send -t 7000 -i /usr/share/icons/gnome/32x32/status/info.png "Conversion Finished" ; espeak "Conversion Finished"
# extra blank spaces
echo "
"
read -sn 1 -p "Your conversion has finished, press any key to continue and close this terminal session..."</pre>
<hr/><pre class="brush:bash">#!/bin/bash
if [ -z $1 ]
then
echo "Debe ingresar el nombre del dominio"
exit 1
else
DOMINIO=$1
fi
if [ -z $2 ]
then
RUTA="/var/www/websites/"
else
RUTA=$2
fi
echo "Configurando dominio "$DOMINIO
#CREAMOS LA ENTRADA EN /ETC/HOSTS
echo "127.0.0.1 "$DOMINIO &amp;gt;&amp;gt; /etc/hosts
#CREAMOS EL ARCHIVO DE VIRTUAL HOST
touch /etc/apache2/sites-available/$DOMINIO
#AGREGAMOS EL VIRTUAL HOST
echo "&lt;virtualhost *:80=""&gt;
ServerAdmin god@$DOMINIO
ServerName $DOMINIO
ServerAlias www.$DOMINIO
DocumentRoot $RUTA$DOMINIO/
&lt;directory&gt;
Options FollowSymLinks
AllowOverride All
&lt;/directory&gt;
&lt;directory $ruta$dominio=""&gt;
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
&lt;/directory&gt;
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
&lt;directory \"="" cgi-bin\"="" lib="" usr=""&gt;
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
&lt;/directory&gt;
ErrorLog $RUTA$DOMINIO/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog $RUTA$DOMINIO/access.log combined
Alias /doc/ \"/usr/share/doc/\"
&lt;directory \"="" doc="" share="" usr=""&gt;
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
&lt;/directory&gt;
&lt;/virtualhost&gt;" &amp;gt; /etc/apache2/sites-available/$DOMINIO
#CREAMOS EL DIRECTORIO PARA EL DOMINIO
mkdir $RUTA$DOMINIO
chmod 775 $RUTA$DOMINIO
chown dennis.dennis $RUTA$DOMINIO
#CONFIGURAMOS APACHE
a2ensite $DOMINIO
#REINICIAMOS APACHE
/etc/init.d/apache2 reload
echo "Listo!"</pre>
<pre class="brush:plain">/var/www/websites/[nombre_del_dominio]</pre>
<pre class="brush:plain">chown dennis.dennis $RUTA$DOMINIO</pre>
<hr/><pre class="brush:bash">#!/bin/bash
if [ -z $1 ]
then
echo "Debe ingresar el nombre del dominio"
exit 1
else
DOMINIO=$1
fi
echo "Desconfigurando dominio "$DOMINIO
#REMOVEMOS DE APACHE
a2dissite $DOMINIO
#BORRAMOS LA CONFIGURACION PARA APACHE
rm /etc/apache2/sites-available/$DOMINIO
#BORRAMOS EL DOMINIO LOCAL
sed "/$DOMINIO/ d" -i /etc/hosts
#REINICIAMOS APACHE
/etc/init.d/apache2 reload
echo "Listo!"</pre>
<hr/><pre class="brush:bash">#!/bin/bash
#################################################
# Advanced diff v0.12 - 24/10/2007
# It compares archives (zip, jar, tar.gz, tar.bz2) recursively
# so when a compressed file is found, it is uncompressed
# and files inside compared as well
# Diff output is: diff_[file1]_vs_[file2]_[timestamp].txt
#################################################
TEMP="$HOME/borrar"
BIN_FILES="$TEMP/bin_files"
num_loop=0
MAX_LOOPS=5
# Checks if file exists (-1 if not) and if its format is supported (0 if it does, -2 if not)
function check_file {
if [ ! -f "$1" ]; then
echo "Not able to found file "$1", please check."
return -1
else
format=`file $1 | awk '{ print $2 }' | tr "[:upper:]" "[:lower:]"`
if [ $format != "zip" ] &amp;amp;&amp;amp; [ $format != "bzip2" ] &amp;amp;&amp;amp; [ $format != "gzip" ]; then
echo "No valid file format encountered (`basename $1`): $format"
return -2
fi
fi
}
# Extracts content from compressed file ($1) to temporary location ($2)
function extract {
if [ ! -d $2 ]; then
mkdir -p $2
# Added support for other compression types: bz2, tar.gz
# No support for more than 1 tar package inside compressed file
format=`file $1 | awk '{ print $2 }' | tr "[:upper:]" "[:lower:]"`
case $format in
"zip")
unzip -q $1 -d $2
;;
"bzip2")
# Modified for non GNU tar compatibility
# tar -xjf $1 -C $2
bzip2 -d -c $1 | (cd $2;tar xf - )
;;
"gzip")
# Modified for non GNU tar compatibility
# tar -xzf $1 -C $2
gzip -d -c $1 | (cd $2;tar xf - )
esac
fi
}
# Returns 1 if there are more files to compare, 0 otherwise
# ToDo: optimize
function loop {
echo -n "Uncompressing content... "
if [ $num_loop -lt 1 ]; then
EXT_DIR1=`echo "$TEMP/$1" | sed s/\[\.\]/_/g`
EXT_DIR2=`echo "$TEMP/$2" | sed s/\[\.\]/_/g`
else
EXT_DIR1=`echo "$1" | sed s/\[\.\]/_/g`
EXT_DIR2=`echo "$2" | sed s/\[\.\]/_/g`
fi
extract $1 $EXT_DIR1
extract $2 $EXT_DIR2
echo "OK"
FILE1=`basename "$1"`
FILE2=`basename "$2"`
OUTPUT=diff_"$FILE1"_vs_"$FILE2"_`date +%H%M%S_%d%m%y`.txt
diff -br -U0 $EXT_DIR1 $EXT_DIR2 &amp;gt; $OUTPUT
if [ ! -s $OUTPUT ]; then
echo "No differences found"
return 0
else
# Search diff's output for binary files that need to be analyzed
grep -i binary $OUTPUT | awk '{ if(NF eq 6)print($3" "$5);}' &amp;gt; $BIN_FILES
if [ -s $BIN_FILES ]; then
echo "Found `wc -w $BIN_FILES | awk '{ print $1 }'` more binary files to compare"
return 1
else
return 0
fi
fi
}
function remove_temp {
echo -n "Removing temporal files... "
rm -f $BIN_FILES
if [ -d $TEMP ]; then
rm -rf $TEMP
fi
echo "OK"
}
###############################
# Here start the main program #
###############################
if [ $# -lt 2 ]; then
echo "Usage: `basename $0` file1 file2"
exit -1
fi
check_file $1
if [ $? -eq 255 ]; then
echo "Exiting"
exit -1
fi
check_file $2
if [ $? -eq 255 ]; then
echo "Exiting"
exit -1
fi
if [ $1 == $2 ]; then
echo "Files are the same, no need to diff them"
exit 0
fi
# Here starts the original comparison
loop $1 $2
# Goes for more files (see supported formats) if founded inside given ones
if [ $? -gt 0 ]; then
while read line; do
# $num_loop controls depth level, not number of files encountered at one level
let num_loop+=1
if [ $num_loop -gt $MAX_LOOPS ]; then
echo "[INFO] $MAX_LOOPS loops reached. Maybe you enter into an infinite loop, increase MAX_LOOPS variable otherwise. Exiting"
exit -1
fi
TEMP1=`echo "$line" | cut -d " " -f1`
TEMP2=`echo "$line" | cut -d " " -f2`
#ToDo: formatting - field start counting (same number of tabs as number of loops) from last loop baseline, not from the end!
echo " `echo "$TEMP1" | awk -F/ '{ print $(NF-num)"/"$NF}' num=$num_loop` &amp;lt;=&amp;gt; `echo "$TEMP2" | awk -F/ '{ print $(NF-num)"/"$NF}' num=$num_loop`"
check_file $TEMP1
if [ $? -eq 0 ]; then
loop $TEMP1 $TEMP2
else
# False positive (not able to process)
let num_loop-=1
fi
done &amp;lt; $BIN_FILES
fi
# Removing useless paths from output file if it's not empty
if [ -s $OUTPUT ]; then
sed "s|$TEMP/||g" $OUTPUT &amp;gt; tmp
mv tmp $OUTPUT
else
rm -f $OUTPUT
fi
remove_temp
exit 0
</pre>
<hr/><pre class="brush:bash">#!/usr/bin/perl
# By Xianur0
# xianur0.null[at]gmail.com
$imagen = $ARGV[0] || die("Uso: $1 imagen.dd\n");
open BIN,$imagen;
my %uris = ();
my %disks = ();
my %bookmarks = ();
my %cookies = ();
my %emails = ();
my %volumenes = ();
my %mysqls = ();
my %proxys = ();
my $bookmark = "";
my $nbookmark = "";
my @lineas = ();
my $lineabin = "";
my $minpass = 5;
my $maxpass = 20;
my $todo = "";
my $grabar = 0;
sub ascii2char($)
{
(my $str = shift) =~ s/@([0-9]{2})@/chr($1)/eg;
return $str;
}
sub hex2ascii($)
{
(my $str = shift) =~ s/([a-fA-F0-9]{2})/chr(hex $1)/eg;
return $str;
}
open PASSWORD,"&gt;resultados/passwords.txt";
open MYSQL,"&gt;resultados/mysql.txt";
open URI,"&gt;resultados/uri.txt";
open COOKIE,"&gt;resultados/cookies.txt";
open BOOKMARKS,"&gt;resultados/bookmarks.txt";
open VOLUMEN,"&gt;resultados/volumenes.txt";
open DISK,"&gt;resultados/disks.txt";
open EMAIL,"&gt;resultados/emails.txt";
open PROXY,"&gt;resultados/proxys.txt";
open ENCRYPTED,"&gt;resultados/encrypted.txt";
open BRUTE,"&gt;resultados/bruteforce.txt";
open STRINGS,"&gt;resultados/strings.txt";
print "Extrayendo datos...\n";
while($lineabin = &lt;BIN&gt;) {
@lineas = ($lineabin =~ m/([\w\d&amp;\*&lt;&gt;=\-\_\[\]\s"'\/\\\%;\:\.\t\,\#\)\(\@\?\0`]+)/g);
BUCLE: foreach $linea (@lineas) {
$linea =~ s/\0//g;
next BUCLE if(length($linea) &lt; 4);
print STRINGS $linea."\n";
if(length($linea) &gt;= $minpass &amp;&amp; length($linea) &lt;= $maxpass &amp;&amp; $linea !~ /^(\s|\t)+$/) {
print BRUTE $linea."\n";
}
if($nbookmark ne "") {
if($linea =~ /(&lt;|&gt;)/) {
$bookmark .= $linea;
} else {
$bookmarks{$nbookmark} = $bookmark;
$nbookmark = "";
$bookmark = "";
}
}
if($linea =~ /((https?|file|ftp|smb):\/\/.+)/) {
my $uri = $1;
$uri =~ s/\s+.+//g;
print URI $uri."\n" if($uris{$uri} &lt; 1 || $uris{$uri} eq "");
$uris{$uri}++;
}
if($linea =~ /(\/dev\/disk\/by-id\/(.+))/) {
my $disk = $1;
print DISK $disk."\n" if($disks{$disk} &lt; 1 || $disks{$disk} eq "");
$disks{$disk}++;
}
if($linea =~ /&lt;\/?bookmark(\shref=[^&gt;]+)?&gt;/) {
if($nbookmark ne "") {
print BOOKMARKS $bookmark."\n" if($bookmarks{$nbookmark} &lt; 1 || $bookmarks{$nbookmark} eq "");
$bookmarks{$nbookmark}++;
$nbookmark = "";
$bookmark = "";
}
elsif($linea =~ /&lt;bookmark href="([^"]+)/) {
$bookmark .= $linea;
$nbookmark = $1;
}
}
if($linea =~ /([\w\d\@]+\@46\@volume)/) {
my $volume = $1;
$volume =~ s/\@46\@volume$//;
$volume = ascii2char($volume);
print VOLUMEN $volume."\n" if($volumenes{$volume} &lt; 1 || $volumenes{$volume} eq "");
$volumenes{$volume}++;
}
if($linea =~ /(password|passwd|pass|pwd)\s*([='"\]\)\[\(]+\s*.+)/) {
my $label = $1;
my $pass = $2;
print PASSWORD $label."=".$pass."\n" if(length($pass) &gt;= $minpass &amp;&amp; length($pass) &lt;= $maxpass);
}
if($linea =~ /Cookie:\s(.+)/) {
my $cookie = $1;
print COOKIE $cookie."\n" if($cookies{$cookie} &lt; 1 || $cookies{$cookie} eq "");
$cookies{$cookie}++;
} elsif($linea =~ /(PHPSESSID=[\w\d]+)/) {
my $cookie = $1;
print COOKIE $cookie."\n" if($cookies{$cookie} &lt; 1 || $cookies{$cookie} eq "");
$cookies{$cookie}++;
}
if($linea =~ /([\w\d\-_\.]+@[\w\d\-_\.]+\.\w+)/) {
my $email = $1;
print EMAIL $email."\n" if($emails{$email} &lt; 1 || $emails{$email} eq "");
$emails{$email}++;
}
if($linea =~ /mysql (.+)/) {
my $lineamysql = $1;
my ($usuario) = ($lineamysql =~ /-u(\s*[^\s]+)/);
my ($password) = ($lineamysql =~ /-p(\s*[^\s]+)/);
if($usuario ne "") {
print MYSQL $lineamysql."\n" if($mysqls{$usuario.":".$password} &lt; 1 || $mysqls{$usuario.":".$password} eq "");
$mysqls{$usuario.":".$password}++;
}
}
if($linea =~ /export (.+?)_proxy="([^"]+)"/) {
my $proxyhttp = $1;
print PROXY $proxyhttp."\n" if($proxys{$proxyhttp} &lt; 1 || $proxys{$proxyhttp} eq "");
$proxys{$proxyhttp}++;
}
if($linea =~ /ECRYPTFS_FNEK_ENCRYPTED\.(.+)/) {
my $enckey = $1;
print ENCRYPTED $enckey."\n" if($cifrados{$enckey} &lt; 1 || $cifrados{$enckey} eq "");
$cifrados{$enckey}++;
# print "eCryptfs Filname Encryption Key Encrypted: ".$enckey."\n\n";
}
}
}
close(MYSQL);
close(URI);
close(COOKIE);
close(BOOKMARKS);
close(VOLUMEN);
close(DISK);
close(EMAIL);
close(PROXY);
close(ENCRYPTED);
close(STRINGS);
close(PASSWORD);
print "Datos extraídos exitosamente!\n"; </pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Write a shell script to display the process running on the system for every
# 30 seconds, but only for 3 times.
# -------------------------------------------------------------------------
# Copyright (c) 2008 nixCraft
# -------------------------------------------------------------------------
#
# for loop 3 times
for r in 1 2 3
do
#see every process on the system
echo "**************************** x^x^x ****************************"
ps -e
echo "**************************** x^x^x ****************************"
#sleep for 30 seconds
sleep 3
# clean
done
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
RCDEV=cdrom0
[ -z "$1" ] &amp;amp;&amp;amp; RCDIR=/z/music/$( date +%Y-%m-%d_%H-%M-%S ) || RCDIR=/z/music/"$1"
sudo mkdir -p "$RCDIR"
RCTRK=$( sudo cdrw -d $RCDEV -M | grep "^ [0-9]" | tail -1 | sed 's/ //g' | sed 's/|.*//' )
[ -z $RCTRK ] &amp;amp;&amp;amp; sudo eject $RCDEV &amp;amp;&amp;amp; exit
for i in $( seq $RCTRK )
do
sudo cdrw -d $RCDEV -x -T wav $i "$RCDIR"/"$( printf %02d $i ).wav"
done
sudo eject $RCDEV</pre>
<pre class="brush:plain">
</pre>
<pre class="brush:plain">chmod u+x ripCD.sh</pre>
<pre class="brush:plain">./ripCD.sh GeekScripting.m3u cdrom0
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
sudo ls &amp;&gt;/dev/null
if [ $? -ne 0 ]; then
echo "El usuario no tiene permisos de administrador"
exit 1
fi
echo -e "\nAntes:"
free
swapoff -a ; swapon -a
echo -e "\nDespues:"
free
echo "Memoria Swap Liberada!"
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
#Twitter status update bot by http://360percents.com
#Author: Luka Pusic &lt;[email protected]&gt;
#REQUIRED PARAMS
username=" [tu usuario de twitter ]"
password=" [ tu password de twitter ]"
tweet="$*" #must be less than 140 chars
#EXTRA OPTIONS
uagent="Mozilla/5.0" #user agent (fake a browser)
sleeptime=0 #add pause between requests
if [ $(echo "${tweet}" | wc -c) -gt 140 ]; then
echo "[FAIL] Tweet must not be longer than 140 chars!" &amp;amp;&amp;amp; exit 1
fi
if [ "$tweet" == "" ]; then
echo "[ERROR] Nothing to do / missing text."
exit 1;
fi
touch "cookie.txt" #create a temp. cookie file
#INITIAL PAGE
echo "[+] Fetching twitter.com..." &amp;amp;&amp;amp; sleep $sleeptime
initpage=`curl -s -b "cookie.txt" -c "cookie.txt" -L --sslv3 -A "$uagent" "https://mobile.twitter.com/session/new"`
token=`echo "$initpage" | grep "authenticity_token" | sed -e 's/.*value="//' | sed -e 's/" \/&amp;gt;.*//'`
#LOGIN
echo "[+] Submitting the login form..." &amp;amp;&amp;amp; sleep $sleeptime
loginpage=`curl -s -b "cookie.txt" -c "cookie.txt" -L --sslv3 -A "$uagent" -d "authenticity_token=$token&amp;amp;username=$username&amp;amp;password=$password" "https://mobile.twitter.com/session"`
#HOME PAGE
echo "[+] Getting your twitter home page..." &amp;amp;&amp;amp; sleep $sleeptime
homepage=`curl -s -b "cookie.txt" -c "cookie.txt" -L -A "$uagent" "http://mobile.twitter.com/"`
#TWEET
echo "[+] Posting a new tweet..." &amp;amp;&amp;amp; sleep $sleeptime
tweettoken=`echo "$homepage" | grep "authenticity_token" | sed -e 's/.*value="//' | sed -e 's/" \/&amp;gt;.*//' | tail -n 1`
update=`curl -s -b "cookie.txt" -c "cookie.txt" -L -A "$uagent" -d "authenticity_token=$tweettoken&amp;amp;tweet[text]=$tweet&amp;amp;tweet[display_coordinates]=false" "http://mobile.twitter.com/"`
#LOGOUT
echo "[+] Logging out..."
logout=`curl -s -b "cookie.txt" -c "cookie.txt" -L -A "$uagent" "http://mobile.twitter.com/session/destroy"`
rm "cookie.txt"</pre>
<hr/><pre class="brush:bash">#!/bin/bash
LINES=$(tput lines)
COLUMNS=$(tput cols)
declare -A snowflakes
declare -A lastflakes
clear
function move_flake() {
i="$1"
if [ "${snowflakes[$i]}" = "" ] || [ "${snowflakes[$i]}" = "$LINES" ]; then
snowflakes[$i]=0
else
if [ "${lastflakes[$i]}" != "" ]; then
printf "\033[%s;%sH \033[1;1H " ${lastflakes[$i]} $i
fi
fi
printf "\033[%s;%sH❄\033[1;1H" ${snowflakes[$i]} $i
lastflakes[$i]=${snowflakes[$i]}
snowflakes[$i]=$((${snowflakes[$i]}+1))
}
while :
do
i=$(($RANDOM % $COLUMNS))
move_flake $i
for x in "${!lastflakes[@]}"
do
move_flake "$x"
done
sleep 0.1
done
</pre>
<hr/><pre class="brush:bash">chmod +x nieve.sh </pre>
<hr/><pre class="brush:bash">./neige.sh</pre>
<hr/><pre class="brush:bash">
##################################################################################
#
# Copyright (C) 2011 GNUino Systems.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.
#
##################################################################################
#!/bin/bash
#ESTE SCRIPT NOS AYUDA A LA AUTOMATIZACION DE LAS CUENTAS APARTIR DEL ARCHIVO peticiones.txt
if [ -d /administracion/log/creacionCuenta/ ];then
echo""
else
mkdir /administracion/log/creacionCuenta/
fi
if [ -e ruta_del_Archivo_donde_estan_los_datos ]; then
#COMPROBAMOS QUE EL ARCHIVO EXISTA
pass=$(cat ruta_del_Archivo_donde_estan_los_datos |awk -F : '{print $4}')#Esta es la poscion del pass el cuarto campo despues de :
usuarios=$(cat ruta_del_Archivo_donde_estan_los_datos |awk -F : '{print $6}')#Esta es la poscion del usuario el sexto campo despues de :
#CON EL USO DE AWK SELECCIONAMOS LOS CAMPOS QUE CORRESPONDEN A EL PASSWORD Y USUARIO EN EL ARCHIVO peticiones.txt
cat ruta_del_Archivo_donde_estan_los_datos &gt;&gt; ruta_donde_se_desea_respaldar
echo "$(date '+%m %d %Y- %H:%M') FECHA Y HORA DE REGISTRO DEL USUARIO" &gt;&gt; ruta_donde_se_desea_respaldar
#GUARDAMOS EN UN LOG LOS DATOS COMPLETOS DEL USUARIO CON LA HORA EN QUE SE REGISTRO LA CUENTA
for user in ${usuarios}; do
echo $user &gt;&gt; ruta_de_log_donde_se_guardan_solo_los_nombres_de_usuarios
#GUARDAMOS EL NOMBRE DE USUARIO EN EL ARCHIVO usuarios_en_altas.txt
useradd --home /home/${user} -m -s /bin/bash ${user} 2&lt;/dev/null
#CREAMOS EL HOME DEL USUARIO INDICANDO QUE EL HOME SE LLAMARA IGUAL QUE EL USUARIO, ASIGNANDO EL SHELL BASH AL USUARIO
quotatool -u ${user} -bq 4000M -l 4000M /home
#ASIGNAMOS UNA QUOTA CON UN LIMITE DE 4GB EN LA PARTICION HOME
for p in ${pass}; do
usermod -p ${p} ${user}
#CON USERMOD PASAMOS EL PASSWORD QUE SE ENCUENTRA EN peticiones.txt Y SE LO ASIGNAMOS AL USUARIO QUE LE CORRESPONDE
echo "" &gt; ruta_del_Archivo_donde_estan_los_datos
#BORRAMOS EL ARCHIVO peticiones.txt
done
done
else
echo "$(date '+%m %d %Y- %H:%M') No existe el archivo " &gt;&gt; direccion_de_log_de_errores
#DE NO EXISTIR EL ARCHIVO MOSTRARA UN ERROR GUARDARA EL REPORTE EN UN LOG
fi
#CONCLUYE EL SCRIPT
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
WGET="/usr/bin/wget"
$WGET -q --tries=10 --timeout=5 http://www.google.com -O /tmp/index.google &amp;&gt; /dev/null
if [ ! -s /tmp/index.google ];
then echo "No"
else echo "Si"
fi
exit 0
</pre>
<hr/><pre class="brush:bash">$ wget http://www.ellibertario.com/wp-content/w3tc/min/9a6f1138.444a95.css</pre>
<hr/><pre class="brush:bash">
</pre>
<hr/><pre class="brush:bash">$ cat 9a6f1138.444a95.css | sed -e 's/}/}\n\n/g' | less </pre>
<hr/><pre class="brush:bash">
</pre>
<hr/><pre class="brush:bash">$ cat 9a6f1138.444a95.css | sed -e 's/}/}\n\n/g' &amp;gt; nuevo.css</pre>
<hr/><pre class="brush:bash">$ wget http://www.ellibertario.com/wp-content/w3tc/min/9a6f1138.444a95.css</pre>
<hr/><pre class="brush:bash">
</pre>
<hr/><pre class="brush:bash">$ cat 9a6f1138.444a95.css | sed -e 's/}/\n}\n\n/g' | sed -e 's/{/{\n\t/g' | sed -e 's/;/;\n\t/g' | less</pre>
<hr/><pre class="brush:bash">$ cat 9a6f1138.444a95.css | sed -e 's/}/\n}\n\n/g' | sed -e 's/{/{\n\t/g' | sed -e 's/;/;\n\t/g' &amp;gt; estilo_nuevo.css</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
#Arp Firewall
case "$1" in
start)
sudo arptables -P INPUT DROP
sudo arptables -P OUTPUT ACCEPT
sudo echo "La Proteccion ARP está Activada"
;;
stop)
sudo arptables -P INPUT ACCEPT
sudo arptables -P OUTPUT ACCEPT
echo "La Proteccion ARP está Desactivada"
;;
*)
echo "Usar: /etc/init.d/blah {start|stop}"
exit 1
;;
esac
exit 0
</pre>
<hr/><pre class="brush:bash">
sudo ls &amp;&gt;/dev/null
if [ $? -ne 0 ]; then
echo "El usuario no tiene permisos de administrador"
exit 1
fi
parse_num()
{
x=$(echo $1 | sed -n 's/0*//p')
if [ $(echo $x | wc -c) -eq 1 ]
then
x=0
fi
echo $x
}
hex_to_ip()
{
index=7
output=''
while [ $index -gt 0 ]
do
end=$(expr $index + 1)
value=$(printf "%d" "0x$(parse_num $(echo $1 | cut -b $index-$end))")
output="$output.$value"
index=$(expr $index - 2)
done
echo $(echo $output | cut -b 2-)
}
printf " Src IP Src port Dst IP Dst port\n"
cat /proc/net/tcp | while read line; do
srcip=$(hex_to_ip $(echo $line | sed -n 's/^[0-9]*: //p' | sed 's/:.*//p'))
srcport=$(printf "%d" 0x$(parse_num $(echo $line | sed -n 's/^ *[0-9]*: [0-9,A-F]*://p' | cut "-d " -f 1)))
dstip=$(hex_to_ip $(echo $line | sed -n 's/^[0-9]*: [0-9,A-F]*:[0-9,A-F]* //p' | sed -n 's/:.*//p'))
dstport=$(printf "%d" 0x$(parse_num $(echo $line | sed -n 's/^ *[0-9]*: [0-9,A-F]*:[0-9,A-F]* [0-9,A-F]*://p' | cut "-d " -f1)))
printf "%15s %9s %15s %9s\n" $srcip $srcport $dstip $dstport
done
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
exit 0
</pre>
<pre class="brush:perl">
#!/usr/bin/perl
use strict;
use warnings;
my @dmesg_new = ();
my $dmesg = "/bin/dmesg";
my @dmesg_old = `$dmesg`;
my $now = time();
my $uptime = `cat /proc/uptime | cut -d"." -f1`;
my $t_now = $now - $uptime;
sub format_time {
my @time = localtime $_[0];
$time[4]+=1; # Adjust Month
$time[5]+=1900; # Adjust Year
return sprintf '%4i-%02i-%02i %02i:%02i:%02i', @time[reverse 0..5];
}
foreach my $line ( @dmesg_old )
{
chomp( $line );
if( $line =~ m/\[\s*(\d+)\.(\d+)\](.*)/i )
{
# now - uptime + sekunden
my $t_time = format_time( $t_now + $1 );
push( @dmesg_new , "[$t_time] $3" );
}
}
print join( "\n", @dmesg_new );
print "\n";
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
#Version 1.0, March 10th, 2012
#Written by Matias Katz (@matiaskatz - www.matiaskatz.com). 2012, Buenos Aires, Argentina.
signal_trapper () #This is where the signal traps are sent
{
echo "****** Nope :) ******"
}
menu () #Main menu
{
echo ""
echo -n "Hi, I'm '$host' and I'm locked. Please, type the password to unlock: "
read -s x
case $x in
$password)
echo ""
echo "Bye! :)"
exit 0
;;
*)
menu
;;
esac
}
#Start of excecution
case $1 in
"-h"|"--help")
echo "Lock v1.0 - A simple Linux console locking tool, written in Bash-Scripting"
echo "Written by Matias Katz (@matiaskatz - www.matiaskatz.com). 2012, Buenos Aires, Argentina."
echo ""
echo "To use it, just type 'lock' and input the unlock password twice."
echo ""
echo "Warning: Spaces are ignored, unless they're within other characters:"
echo ""
echo "The password ' 1' will be taken as '1'."
echo "The password '1 ' will be taken as '1'."
echo "The password '1 1' will be taken as '1 1'."
echo ""
echo "Enjoy :)"
echo ""
exit 0
;;
"")
read -s -p "Password: " password #Ask the user for a password
echo ""
read -s -p "Password (again): " password2 #Ask for confirmation
echo ""
if [ "$password" != "$password2" ]
then
echo "Passwords don't match"
exit 0
fi
;;
*)
echo "Invalid option"
echo "Hit 'lock -h' or 'lock --help' to find out more."
exit 0
#password=$1 #Take the first argument as a password &amp;lt;--- It's dangerous, use it as your own risk :) ;; esac #Prohibimos ^Z y ^C trap 'clear; echo -e "Password:\c";' 2 20 #trap signal_trapper SIGINT #Trap the CTRL+C signal to avoid bypass #trap signal_trapper SIGTSTP #Trap the CTRL+Z signal to avoid bypass host=$(hostname) clear #&amp;lt;--- if you want to :) menu</pre>
<hr/><pre class="brush:bash">sudo mv lock.sh /usr/bin/lock</pre>
<hr/><pre class="brush:bash">sudo chmod 755 /usr/bin/lock</pre>
<pre class="brush:plain">lock</pre>
<pre class="brush:plain">lock -h</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# A Sample Shell Script To Generate Mediawiki Wiki Software Google Sitemap Using PHP
# on server itself via cron.
# Warning: You need to customize this script before using it!
# -------------------------------------------------------------------------
# Copyright (c) 2008 nixCraft project &lt;http://cyberciti.biz/fb/&gt;
# 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.
# -------------------------------------------------------------------------
# Path to wiki dir
BASE="/home/httpd/example.com/wiki"
# Wiki domain name
SERVER="http://www.example.com/"
# Path to actual sitemap file - change this
OUT="${BASE}/sitemap-index-cbzwikibashportal.xml"
cd $BASE/wiki/maintenance
php generateSitemap.php --fspath="$BASE" --server="${SERVER}"
# patch it up replace example.com with actual domain name
sed -i -e 's/sitemap-cbzwikibashportal-NS_[0-9]*-[0-9]*\.xml\.gz/http:\/\/www\.example\.com\/&amp;/g' $OUT</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Script Name: mbrback http://igurublog.wordpress.com/downloads/script-mbrback/
# Requires: util-linux
# License: GNU GENERAL PUBLIC LICENSE Version 3 http://www.gnu.org/licenses/gpl-3.0.txt
# do not change these variables!
argsneeded=1
restoretype=""
back=""
devname=""
help ()
{
echo 'mbrback version 1.0.0'
echo 'Creates MBR and partition table backups of DEVICE named:'
echo ' HOST-DEVICE-MBR-back'
echo ' HOST-DEVICE-partition-back.sf'
echo 'Restores MBR and partition table from specified backup file'
echo 'Usage: sudo mbrback DEVICE [BACKUPFOLDER]'
echo ' (creates backup files of DEVICE)'
echo 'Usage: sudo mbrback --restoreboot DEVICE [BACKUPFILE]'
echo ' (restores MBR boot code only)'
echo 'Usage: sudo mbrback --restorefullmbr DEVICE [BACKUPFILE]'
echo ' (restores entire MBR)'
echo 'Usage: sudo mbrback --restorepart DEVICE [BACKUPFILE.sf]'
echo ' (restores partition table)'
echo 'Example: sudo mbrback sda'
echo ' (creates MBR and partition table backups of'
echo ' /dev/sda in current folder)'
echo 'Example: sudo mbrback /dev/sda'
echo ' (creates MBR and partition table backups of'
echo ' /dev/sda in current folder)'
echo 'Example: sudo mbrback sda /mybackups'
echo ' (creates MBR and partition table backups of'
echo ' /dev/sda in /mybackups)'
echo 'Example: sudo mbrback --restoreboot sda /mybackups/sys-sda-MBR-back'
echo ' (restores MBR boot code of /dev/sda using'
echo ' /mybackups/sys-sda-MBR-back)'
echo 'Example: sudo mbrback --restorepart sda /mybackups/sys-sda-partition-back.sf'
echo ' (restores partition table of /dev/sda using sfdisk file '
echo ' /mybackups/sys-sda-partition-back.sf)'
echo
echo "When restoring, mbrback will always tell you what it's going to do"
echo "and allow you to abort before it writes to disk."
echo
echo "Instructions and updates:"
echo "http://igurublog.wordpress.com/downloads/script-mbrback/"
echo
}
index=0
while [ "$1" != "" ];
do
if [ "${1:0:1}" = "-" ]; then
case "$1" in
--help | -help )
help
exit
;;
--restoreboot )
if [ "$restoretype" = "" ]; then
restoretype="boot"
else
echo 'mbrback: can only use one restore option'
exit 1
fi
;;
--restorefullmbr )
if [ "$restoretype" = "" ]; then
restoretype="fullmbr"
else
echo 'mbrback: can only use one restore option'
exit 1
fi
;;
--restorepart )
if [ "$restoretype" = "" ]; then
restoretype="part"
else
echo 'mbrback: can only use one restore option'
echo
help
exit 1
fi
;;
* )
echo "mbrback: Unknown option $1"
echo
help
exit 1
;;
esac
else
let "index+=1"
case $index in
1 )
devname=`basename "$1"`
if [ ! -b "/dev/$devname" ]; then
echo "mbrback: /dev/$devname is not a valid device"
exit 1
fi
;;
2 )
back="$1"
;;
* )
echo "mbrback: Too many arguments"
exit 1
;;
esac
fi
shift
done
if (( index &amp;lt; $argsneeded )) || [ "$devname" = "" ]; then echo "mbrback: missing arguments" echo help exit 1 fi if [ `whoami` != "root" ]; then echo 'mbrback: must be run with sudo' exit 1 fi sysname=$HOSTNAME if [ "$restoretype" = "" ]; then # create MBR and table backups if [ "$back" = "" ]; then back=`pwd` else if [ ! -d "$back" ]; then echo "mbrback: $back is not a valid backup folder" exit 1 fi fi dd if=/dev/$devname of="$back/$sysname-$devname-MBR-back" bs=512 count=1 sfdisk -d /dev/$devname &amp;gt; "$back/$sysname-$devname-partition-back.sf"
else
# restore
if [ "$back" = "" ]; then
echo "mbrback: you must specify a backup file"
exit 1
elif [ ! -f "$back" ]; then
echo "mbrback: file not found - $back"
exit 1
fi
if [ "$restoretype" = "boot" ] || [ "$restoretype" = "fullmbr" ]; then
sfhead=`head --bytes=21 "$back"`
if [ "$sfhead" = "# partition table of " ]; then
echo "mbrback: $back is not an MBR backup file"
exit 1
fi
if [ "$(stat -c%s "$back")" != "512" ]; then
echo "mbrback: $back is wrong size for an MBR backup file"
exit 1
fi
fi
if [ "$restoretype" = "part" ]; then
sfhead=`head --bytes=21 "$back"`
if [ "$sfhead" != "# partition table of " ]; then
echo "mbrback: $back not a valid sfdisk backup file"
exit 1
fi
echo
echo "You are about to overwrite your /dev/$devname partition table with"
echo "the contents of $back"
echo
echo "WARNING!!! Unless the partition table has been damaged or you"
echo " have accidentally deleted a partition, you should abort."
echo
echo "WARNING!!! Restoring the partition table from an out-of-date backup"
echo " may render ALL the data on your drive unreadable."
echo
echo "WARNING!!! Do not proceed if /dev/$devname is mounted."
echo
elif [ "$restoretype" = "boot" ]; then
echo
echo "You are about to overwrite your /dev/$devname MBR boot code with"
echo "the contents of $back"
echo
echo "WARNING: Restoring your MBR boot code from an out-of-date MBR backup"
echo " file may render your computer unbootable."
elif [ "$restoretype" = "fullmbr" ]; then
echo
echo "You are about to overwrite your ENTIRE /dev/$devname MBR with"
echo "the contents of $back"
echo
echo "WARNING!!! The full MBR contains both boot code and the drive's"
echo " partition table. Unless the partition table has been"
echo " damaged or you have accidentally deleted a partition"
echo " you should abort and restore boot code only with"
echo " --restoreboot instead."
echo
echo "WARNING!!! Restoring your full MBR from an out-of-date MBR backup may"
echo " render your computer unbootable and ALL the data on your"
echo " drive unreadable."
echo
echo "WARNING!!! Do not proceed if /dev/$devname is mounted."
fi
echo
echo "Do you want to proceed? (you must type yes to proceed)"
read s1
if [ "$s1" != "yes" ]; then
echo "mbrback: no changes made - aborted at user request"
exit 2
fi
if [ "$restoretype" = "part" ]; then
sfdisk /dev/$devname &amp;lt; "$back" elif [ "$restoretype" = "boot" ]; then dd if="$back" of=/dev/$devname bs=448 count=1 elif [ "$restoretype" = "fullmbr" ]; then dd if="$back" of=/dev/$devname bs=512 count=1 fi echo "/dev/$devname was updated" fi exit 0 </pre>
<hr/><pre class="brush:bash">#!/bin/bash
# A simple shell script to rip audio cd and create mp3 using lame
# and cdparanoia utilities.
# ----------------------------------------------------------------------------
# Written by Vivek Gite &lt;http: biz=""&gt;
# (c) 2006 nixCraft under GNU GPL v2.0+
# ----------------------------------------------------------------------------
read -p "Starting in 5 seconds ( to abort press CTRL + C ) " -t 5
cdparanoia -B
for i in *.wav
do
lame --vbr-new -b 360 "$i" "${i%%.cdda.wav}.mp3"
rm -f "$i"
done
&lt;/http:&gt;</pre>
<pre class="brush:plain">mkdir Musica
cd Musica
mkdir "Nombre del Album"
cd !!:1
/path/to/ripcd.sh
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Script de configuracion de red, DNSs, ruta por defecto y llamada a reglas de IpTables
# RED
# parametros de red
ipeth0=10.50.66.3;masketh0=255.255.255.0;redeth0=10.50.66.0;broadcasteth0=10.50.66.255;gweth0=10.50.66.1
ipeth1=192.168.1.1;masketh1=255.255.255.0;redeth1=192.168.1.0;broadcasteth1=192.168.1.255
echo Configurando los interfaces de red y el DNS. ...
echo "auto lo" &amp;gt; /etc/network/interfaces
echo "iface lo inet loopback" &amp;gt;&amp;gt; /etc/network/interfaces
echo "# eth0 interfaz conectado al router" &amp;gt;&amp;gt; /etc/network/interfaces
echo "auto eth0" &amp;gt;&amp;gt; /etc/network/interfaces
echo "iface eth0 inet static" &amp;gt;&amp;gt; /etc/network/interfaces
echo " address $ipeth0" &amp;gt;&amp;gt; /etc/network/interfaces
echo " netmask $masketh0" &amp;gt;&amp;gt; /etc/network/interfaces
echo " network $redeth0" &amp;gt;&amp;gt; /etc/network/interfaces
echo " broadcast $broadcasteth0" &amp;gt;&amp;gt; /etc/network/interfaces
echo " gateway $gweth0" &amp;gt;&amp;gt; /etc/network/interfaces
echo "# eth1 interfaz conectado a la LAN" &amp;gt;&amp;gt; /etc/network/interfaces
echo "auto eth1" &amp;gt;&amp;gt; /etc/network/interfaces
echo "iface eth1 inet static" &amp;gt;&amp;gt; /etc/network/interfaces
echo " address $ipeth1" &amp;gt;&amp;gt; /etc/network/interfaces
echo " netmask $masketh1" &amp;gt;&amp;gt; /etc/network/interfaces
echo " network $redeth1" &amp;gt;&amp;gt; /etc/network/interfaces
echo " broadcast $broadcasteth1" &amp;gt;&amp;gt; /etc/network/interfaces
echo "# Ruta de ultimo recurso" &amp;gt;&amp;gt; /etc/network/interfaces
echo "up route add -net 0.0.0.0/0 gw $gweth0 dev eth0" &amp;gt;&amp;gt; /etc/network/interfaces
echo "# aplicamos reglas de iptables" &amp;gt;&amp;gt; /etc/network/interfaces
echo "pre-up iptables-restore &amp;lt; /home/usuario/scripts/iptables.reglas.javcasta.up" &amp;gt;&amp;gt; /etc/network/interfaces
echo "# ---- by javcasta - 2.011 - http://javcasta.com ---" &amp;gt;&amp;gt; /etc/network/interfaces
# DNSs
dns1=208.67.222.222
dns2=208.67.220.220
nombreservidor=$(hostname -s)
dominio=$(hostname -d)
echo "# by script - 2.011" &amp;gt; /etc/resolv.conf
echo "search $dominio" &amp;gt;&amp;gt; /etc/resolv.conf
echo "domain $dominio" &amp;gt;&amp;gt; /etc/resolv.conf
echo "nameserver $dns1" &amp;gt;&amp;gt; /etc/resolv.conf
echo "nameserver $dns2" &amp;gt;&amp;gt; /etc/resolv.conf
# habilitar enrutamiento
echo "1" &amp;gt; /proc/sys/net/ipv4/ip_forward
# reiniciamos servicio de red
#service networking restart
/etc/init.d/networking restart</pre>
<hr/><pre class="brush:bash">
#!/usr/local/bin/bash
#
## Calomel.org .:. pkg_find v0.07
#
## location of the local package listing file
packages=~/pkg_find_package_listing.html
export PKG_PATH=" [ ruta ftp | http ]"
if [ $# -eq 0 ]
then
echo ""
echo " Calomel.org .:. pkg_find"
echo "-------------------------------------"
echo "-u = update the local package listing."
echo "'string' = the package name or partial string of the package name you are looking for."
echo ""
exit
fi
if [ $1 = "-u" ]
then
echo " "
echo -e "\033[32m Download the package listing to $packages\033[0m"
echo " "
wget -O $packages $PKG_PATH
echo " "
exit
fi
if [ $1 = "$@" ]
then
if [ -e $packages ]
then
echo " "
echo -e "\033[32m Packages matching your query: $@\033[0m"
echo " "
cat $packages | grep -i $@ | cut -d\" -f6
echo " "
else
echo " "
echo -e "\033[32m $packages file does not exist. Run 'pkg_find -u' to update\033[0m"
echo " "
fi
exit
fi
</pre>
<hr/><pre class="brush:bash"> #!/bin/bash
# Interupt and Exit Function
control_c()
{
clear
echo -e "Would you like to block connections with a client?\n"
echo -e "Enter y or n: "
read yn
if [ "$yn" == "y" ]; then
echo -e "\nEnter Ip Address to Block: \n"
read ip
if [ -n $ip ]; then
echo -e "\nNow retrieving mac address to block...\n"
ping -c 1 $ip &gt; /dev/null
mac=`arp $ip | grep ether | awk '{ print $3 }'`
if [ -z $mac ]; then
clear
echo -e "\n***Client does not exist or is no longer\
on this network***"
echo -e "\nSkipping action and resuming monitoring.\n\n"
sleep 2
bash leecher.sh
exit 0
else
iptables -A INPUT -m mac --mac-source $mac -j DROP
clear
echo -e "\nClient with mac address $mac is now\
blocked.\n"
echo -e "We will continue monitoring for changes\
in clients\n\n"
sleep 2
bash leecher.sh
exit 0
fi
fi
else
clear
echo -e "\n\nLeecher has exited\n\n"
setterm -cursor on
rm -f $pid
exit 0
fi
}
# Print the scan from the engine()
twice(){
g=0
len=${#second[@]}
for (( g = 0; g &lt; $len; g++ ));
do
echo -e "${second[$g]}\n"
done
}
# If there's a change in the network, ask to block ips.
interupt(){
clear
echo -e "\nList of Clients has Changed!\n"
twice
echo -e '\a'
echo -e "Would you like to block connections with a client?\n"
echo -e "Enter y or n: "
read yn
if [ "$yn" == "y" ]; then
echo -e "\nEnter Ip Address to Block: \n"
read ip
if [ -n $ip ]; then
ping -c 1 $ip &gt; /dev/null
mac=`arp $ip | grep ether | awk '{ print $3 }'`
if [ -z $mac ]; then
clear
echo -e "\n***Client does not exist or is no longer on\
this network***"
echo -e "\nSkipping action and resuming monitoring.\n\n"
else
iptables -A INPUT -m mac --mac-source $mac -j DROP
clear
echo -e "\nClient with mac address $mac is now blocked.\n"
echo -e "We will continue monitoring for changes\
in clients\n\n"
echo -e "Current clients are: \n"
twice
echo -e "\nResuming monitoring..."
fi
fi
else
clear
echo -e "Current clients are: \n"
twice
echo -e "Resuming monitoring..."
fi
}
# Function to keep monitoring for any changes
engine()
{
# Scan networks again for comparison of changes.
for subnet in $(/sbin/ifconfig | awk '/inet addr/ &amp;&amp; !/127.0.0.1/ &amp;&amp; !a[$2]++\
{print substr($2,6)}')
do
second+=( "$(nmap -sP ${subnet%.*}.0/24 | awk 'index($0,t)\
{ print $i }' t="$t" i="$i" )" )
sleep 1
done
}
# Make sure user is logged in as root
if [[ $EUID -ne 0 ]]; then
echo "This script must be run as root" 1&gt;&amp;2
exit 1
fi
# Check if nmap is installed
ifnmap=`type -p nmap`
if [ -z $ifnmap ]; then
echo -e "\n\nNmap must be installed for this program to work\n"
echo -e "Only Nmap 5.00 and 5.21 are supported at this time\n"
echo -e "Please install and try again"
exit 0
fi
clear
echo -e "\nNow finding clients on your local network(s)"
echo -e "Press Control-C at any time to block additional clients or exit\n"
# Remove temp files on exit and allow Control-C to exit.
trap control_c SIGINT
# Turn off cursor
setterm -cursor off
# Make some arrays and variables
declare -a first
declare -a second
sid=5.21
# Check for which version of nmap
if [ 5.21 = $(nmap --version | awk '/Nmap/ { print $3 }') ]; then
i=5 t=report
else
i=2 t=Host
fi
# Get ip's from interfaces and run the first scan
for subnet in $(/sbin/ifconfig | awk '/inet addr/ &amp;&amp; !/127.0.0.1/ &amp;&amp; !a[$2]++ {print \
substr($2,6)}')
do
first+=( "$(nmap -sP ${subnet%.*}.0/24 | awk 'index($0,t) { print $i }' \
t="$t" i="$i" )" )
sleep 1
done
echo -e "Current clients are: \n"
#Display array elements and add new lines
e=0
len=${#first[@]}
for (( e = 0; e &lt; $len; e++ ));
do
echo -e "${first[$e]}\n"
done
echo -e "Leecher is now monitoring for new clients."
echo -e "\nAny changes with clients will be reported by the system bell."
echo -e "If bell is not enabled details will log to this console."
# Forever loop to keep monitoring constant
for (( ; ; ))
do
engine
if [[ ${first[@]} == ${second[@]} ]]; then
second=( )
else
interupt
sleep 1
first=( )
first=("${second[@]}")
second=( )
fi
done
</pre>
<hr/><pre class="brush:bash">
#!/bin/bash
#Alice.bash xD Ubica y elimina procesos zombies.
sudo ls &amp;&gt;/dev/null
if [ $? -ne 0 ]; then
echo "El usuario no tiene permisos de administrador"
exit 1
fi
if [ $# -ne 1 ]
then
echo "-z: Ubica los procesos zombies"
echo "-k: mata procesos zombies"
exit 1
fi
if [ $1 == "-z" ]
then
echo "Procesos zombies"
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'
exit 0
fi
if [ $1 == "-k" ]
then
echo "Eliminando procesos zombies"
kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}'`
exit 0
fi
</pre>
<hr/><pre class="brush:bash"> #!/bin/bash
TCPDUMP=/usr/sbin/tcpdump
IP=/sbin/ip
DEV=en1
ADDR=`$IP addr show dev $DEV | grep 'inet ' | cut -d ' ' -f 6 | cut -d '/' -f 1`
$TCPDUMP -ni $DEV "host $ADDR and port not (67 or 68 or 80 or 443 or 1863 or 5222 or 587 or 993 or 995)"
</pre>
<hr/><pre class="brush:bash">#!/bin/bash
# Programa que busca direcciones IP en páginas html
# Autor: @paco_medina
if [ $# -lt 1 ]; then
echo "Uso: $0 url"
echo "Ejemplo: $0 www.sitio.com.mx"
exit 1
fi
HTML=/tmp/pagina.html
DOMINIO=`echo $1|cut -d. -f2-5`
wget $1 -O $HTML -o /dev/null
grep "href=" $HTML |grep $DOMINIO |
cut -d/ -f3|grep ${DOMINIO}$|sort -u&amp;gt;/tmp/dir-ip
for i in $(cat /tmp/dir-ip)
do
host $i
done
rm $HTML</pre>
<hr/><pre class="brush:bash">#!/bin/bash
#=============================================
# Script para iniciar servicios:
# apache2,bind9,mysql
# Por: darvein
# Fecha: sun Feb 19 de 20012
#=============================================
# Lista de servicios
SERVICIOS=(apache2 mysql bind9)
# Funcion para inicializar/reiniciar servicios
function servicioInit (){
if ! service $1 status &amp;amp;&amp;gt;/dev/null; then
echo -n -e "\tIniciando $1 ..."
service $1 start &amp;amp;&amp;gt;/dev/null
echo " listo! =)"
else
echo -n -e "\t $1 ya fue iniciado, reiniciando servicio..."
service $1 restart &amp;amp;&amp;gt;/dev/null
echo " listo! =)"
fi
}
# Funcion para detener los servicios
function servicioStop(){
echo -n -e "Deteniendo $1..."
service $1 stop &amp;amp;&amp;gt;/dev/null
echo " listo! =)"
}
# Empezando a recorrer la lista de servicios SERVICIOS[]
for ((i=0; i&amp;lt;${#SERVICIOS[*]}; i++)) do #if $estado = "start"; then if [ -z $1 ]; then echo "Verificando servicio: ${SERVICIOS[$i]} -&amp;gt;"
servicioInit ${SERVICIOS[$i]}
else
servicioStop ${SERVICIOS[$i]}
fi
done
</pre>
<pre class="brush:plain">SERVICIOS=(apache2 mysql bind9)</pre>
<hr/><pre class="brush:bash">geekscript@r00t:server$ sudo ./webserver.sh
Verificando servicio: apache2 -&amp;gt;
apache2 ya fue iniciado, reiniciando servicio... listo! =)
Verificando servicio: mysql -&amp;gt;
mysql ya fue iniciado, reiniciando servicio... listo! =)</pre>
<hr/><pre class="brush:bash">geekscript@r00t:server$ sudo ./webserver.sh foobar
Deteniendo apache2... listo! =)
Deteniendo mysql... listo! =)
Deteniendo bind9... listo! =)</pre>
<pre class="brush:plain">Autor:
Descripción:
Correo del autor y / o cuenta de twitter para retroalimentación:
</pre>
<pre>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment