Scripting



Un nuevo modulo de Expect ha salido, este integra el protocolo SSH al expect-perl, para hacer un poco mas transparente la conexion y concentrar la programacion en las activodades en el shell ya conectado, sin complicarnos la vida en todas las validaciones de la conexion.

El autor del modulo es Bruno Negrao Guimaraes Zica.

#!/usr/bin/perl
use Net::SSH::Expect;

#
# You can do SSH authentication with user-password or without it.
#

# Making an ssh connection with user-password authentication
# 1) construct the object
my $ssh = Net::SSH::Expect->new (
host => "myserver.com",
password=> 'pass87word',
user => 'bnegrao',
raw_pty => 1
);

# 2) logon to the SSH server using those credentials.
# test the login output to make sure we had success
my $login_output = $ssh->login();
if ($login_output !~ /Welcome/) {
die "Login has failed. Login output was $login_output";
}

# - now you know you're logged in - #

# Starting ssh without password
# 1) run the constructor
my $ssh = Net::SSH::Expect->new (
host => "myserver.com",
user => 'bnegrao',
raw_pty => 1
);
# 2) now start the ssh process
$ssh->run_ssh() or die "SSH process couldn't start: $!";

# 3) you should be logged on now. Test if you received the remote prompt:
($ssh->read_all(2) =~ />\s*\z/) or die "where's the remote prompt?"

# - now you know you're logged in - #


El SHN es un formato “LOOSELESS” (o como se escriba) de compresion de audio, es decir para hacer un poco mas pequeños los archivos de musica sin ninguna perdida, a contrario de los mp3 que crean archivos mas chicos pero si hay degradacion de calidad comparandolo al original..

Para que se den una idea, revisen los tamaños de un disco completo,

wav 236 Mb
SHN 138 Mb
MP3 33 Mb

Yo lo uso pa guardar los mis rips de Viniles, por si necesito los “masters” de los que capture

Uso:
Se instala SHN Tool

sudo apt-get install shntool

no se por que razon no pude hallar el paquete shorten en los repos de Ubuntu, que es el comando que crea los SHN (el encoder), lo podemos bajar y compilarlo…

wget http://shnutils.freeshell.org/shorten/dist/src/shorten-3.6.1.tar.gz
tar -zxvf shorten-3.6.1.tar.gz
cd shorten-3.6.1
./configure
make
make install

Hice este escriptin para generar de madrazo todo, quitar los espacios de los nombres por guiones bajos, crear los shn, los mp3 y los .md5 para verificar la integridad de los archivos, tambien organiza los archivos en carpetas.

#!/bin/bash

# Mandar a volar los espacios en los nombres
ls *\ *|awk -F "\n" '{src=$0; gsub(/ /, "_"); system("mv \"" src "\" " $0)}'

for i in $(ls -1 *.wav); do
        echo "Codificando SHN $i"
        shntool conv -o shn $i
        echo "Codificando MP3 $i"
        lame -b 192 -h -ms $i
        ls *.wav.mp3\ *|awk -F "\n" '{src=$0; gsub(/.wav/, ""); system("mv \"" src "\" " $0)}'
done

mkdir shn
mv *.shn ./shn

for i in *.wav.mp3; do mv "$i" "${i/.wav.mp3}".mp3; done

mkdir mp3
mv *.mp3 ./mp3

mkdir wav
mv *.wav ./wav

du mp3
du wav
du shn

shntool md5 ./shn/*.shn > ./shn/md5sums.txt
cat ./shn/md5sums.txt

md5sum ./mp3/*.mp3 > ./mp3/md5sums.txt
cat ./mp3/md5sums.txt


Pa tocar los SHN en el XMMS hay que agregar el plugin, no esta en los repos default, asi que hay que hay que agregar un repo de puro XMMS

sudo vi /etc/apt/sources.list


Se agrega la info del repo

## RAREWARES REPOSITORY - xmms plugins
deb http://www.rarewares.org/debian/packages/unstable/ ./

Actualizamos los paquetes disponibles y lo instalamos

sudo apt-get update
sudo apt-get install xmms-shn


Uno que es neofito para esto de la programacion y que va empezando en esto del perl, es util buscar las funciones disponibles para la instalacion de perl en el sistema, funciones en la instalacion de Perl como las que se accesan como modulos, para ello se cuenta con el programa perldoc, el cual corre en modo texto, muy parecido a lo que es el man para los comandos en unix/linux

En Ubuntu/Debian:

jhonny@cash:~$ sudo apt-get install perldoc

PERLDOC(1) User Contributed Perl Documentation PERLDOC(1)

NAME
perldoc - Look up Perl documentation in Pod format.

SYNOPSIS
perldoc [-h] [-v] [-t] [-u] [-m] [-l] [-F] [-i] [-V] [-T] [-r] [-ddes‐
tination_file] [-oformatname] [-MFormatterClassName] [-wformatterop‐
tion:value] [-nnroff-replacement] [-X] PageName|ModuleName|ProgramName

perldoc -f BuiltinFunction

perldoc -q FAQ Keyword

See below for more description of the switches.

Y si son amantes de que se vea en ventanita, esta el podbrowser

se instala en Ubuntu/Debian:

jhonny@cash:~$ sudo apt-get install podbrowser

Photobucket - Video and Image Hosting

Como veran muestra la funcion/modulo y al seleccionarla se puede navegar en la introduccion, metodos, uso y funciones similares o relacionadas.


Desde que empece a usar ubuntu, el VI le da la chiripiorca al pegar una linea con un # al principio, la siguiente linea indenta y le pone otro #, y asi para cada linea, de manera que si pegas un chingo de codigo se hace un desmadre…

                # shflash
                #                 $telnet->expect($timeout, "\#");
                #                                 $telnet->send(shflashn);
                #                                                 $telnet->expect($timeout, "\#");
                #                                                                 $shint = $telnet->before();
                #                                                                                 # shmemsum
                #                                                                                                 $telnet->expect($timeout, "\#");
                #

Coregirlo deshabilitando “auto indent” con:

:set paste
o
:h pt

en modo comando

                # shflash
                $telnet->expect($timeout, "\#");
                $telnet->send(shflashn);
                $telnet->expect($timeout, "\#");
                $shint = $telnet->before();


Obtenido de http://www.killtheuplink.com

Hacia rato que ya habia tenido ese problema, nunca me clave mucho para resolverlo…

I had to write to a shell script that parses a bunch of files. The
problem was some of the file names contained spaces. Here is a sample
scenario and the resolution.

Let’s say you had files: “test 1″ and “test 2″ and you tried to do
something as trivial as:

#!/bin/bash

for f in `ls test*`
do

cat $f

done

the result would be:

cat: test: No such file or directory
cat: 1: No such file or directory
cat: test: No such file or directory
cat: 2: No such file or directory

The resolution would be:

#!/bin/bash

IFS=�?
�?

for f in `ls test*`
do

cat $f

done

The explanations is that the IFS (interfield seperator) in the shell
defaults to space tab or newline. The space is part of the filename in
our case which will result in two seperate files.
So what we do at the begining of the script is set the IFS variable to
newline only.