Bash Tips and Tricks

Generare liste di numeri per i loop

Il comando seq permette di generare sequenze numeriche utilizzabili ad esempio in loop come

for a in $(seq 1 10); do echo $a; done

questo genera sequenze come 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.
Alle volte per eseguire loop su nomi di file è utile avere liste con numeri di cifre fisse. Il comando seq ha un’opzione per specificare il formato.

seq -f '%02g' 0 23

genererà ad esempio una lista 00, 01, 03, 04, 05, 06, 07, 08, 09, 10, 11, etc…

Format di output

Si consideri

for a in $(seq 1 10); do echo $a; find . -name "*${a}*" |wc -l; done

Questo metterà su righe di echo differenti l’output rendendolo poco chiaro. echo per fortuna permette di non mettere il carattere di nuova riga

for a in $(seq 1 10); do echo -n $a " "; find . -name "*${a}*" |wc -l; done

ssh tunnel

ssh permette di utilizzare un server conn ssh daemon attivo come ponte criptato verso servizi visibili al server remoto.

ssh -L [local port]:[remote IP hidden]:[remote port Hidden] -p [sshd listen port] [remoteuser]@[remote IP]

Una volta eseguito questo comando il computer locale avrà stabilito un canale criptato verso il deamon sshd in ascolto a [remote IP] sulla porta [sshd listen port] usando l’utente [remoteuser]. Tutti i pacchetti TCP inviati su localhost alla porta [local port] saranno trasferiti attraverso il canale criptato al server sshd remoto che li consegnerà a [remote IP hidden] sulla porta [remote port Hidden]. Tipicamente gli ultimi due parametri sono su di una porta locale.

curl

Alle volte è necessario recuperare un sito web su un ip che non viene definito dal DNS. Lo si può fare senza editare il file hosts utilizzando il comando curl:

curl -H "HOST: [dominio]" "http://[IP]/[parametri]"

Limitare la banda

per limitare la banda utilizzata da un comando che non ha opzioni specifiche si può quasi sempre utilizzare
trickle.
Ad esempio:

trickle -u 2560 -d 2560 aws s3 sync ...

limiterà la banda a 20Mbit

Registrare il massimo valore di load raggiunto in un periodo

export let LOAD=0,1; while [ true ]; do export let CURRENT_LOAD=$(w|head -1|awk '{print $8}'|awk -F, '{print $1 "," $2 }'); export let LOAD=$(awk -vMAX=$(echo ${LOAD}|tr "," ".") -vCURR=$(echo ${CURRENT_LOAD}|tr "," ".") 'BEGIN{ if( MAX < CURR ) print CURR; else print  MAX }'); echo $LOAD; sleep 1; done

In se il problema è semplice ma la bash non supporta il confronto tra grandezze decimali e ho dovuto gestire la differenza tra la notazione italiana e inglese dei decimali.
Il confronto viene quindi fatto in awk.

Convertire ldirectord.cf in csv

a volte per riorganizzare i pool e iserver su di un bilanciatore può essere utile averli su di un formato differente.

#!/usr/bin/python3
from pprint import pprint

debug = False
file = 'ldirectord.cf'

a = open(file, 'r')
itemList = a.readlines()
a.close()

riga = []
struttura = {}
linea = ""

# leggo dati
for line in itemList:
   riga=line.lstrip("\t ").rstrip("\n").split("=")
   if ( riga[0] == "virtual" ):
      pool = riga[1]
      struttura[ pool ] = []
   elif ( riga[0] == "real" ):
      struttura[ pool ].append( riga[1].split()[0] )

#pprint( struttura )

#genero output
for chiave, valore in struttura.items():
   linea = ""
   linea += chiave +  ","
   for real in sorted( valore ):
      linea +=  real + ","

   print( linea )

Inviare informazioni sui log di systema

Alle volte è utile aggiungere delle informazioni ai log di sistema.
Per arlo si possono aggiungere ad uno script di sturtup righe come le seguenti

nohup vmstat 60 | logger -t vmstat 2>&1 > /dev/null &
nohup iostat 60 | logger -t iostat 2>&1 > /dev/null &

Rigenerare alias di posta

postalias /etc/aliases

e poi riavviare postfix

far eseguire qualche cosa ad un utente senza shell

su - www-data -c 'ulimit -aHS' -s '/bin/bash'

File htpasswd per basic autentication

aggiungere password per basic authentication con strumenti openssl
con l’utente corretto. Si ottiene lo stesso formato di apache

echo -n 'pippo:' >> /etc/nginx/htpasswd
openssl passwd -apr1 >> /etc/nginx/htpasswd

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *