quoll faq

Faq

Pubblicato il Pubblicato in Faq, System administrator

bash

Rinominare un gruppo di file in base ad una regexpr

Supponiamo di voler rinominare il nome di un gruppo di file che hanno il seguente template:

file1_tmp.sh
file2_tmp.sh
...
file99_tmp.sh

e supponiamo di voler togliere la parte centrale ‘_tmp’ in tutti i file. Possiamo utilizzare il comando “rename” o “prename”:

 rename 's/_tmp//' *.sh

 

Redirigere lo standard error sullo standart output

Per redirigere lo standard error di un comando in shell basta utilizzare la seguente sinstassi seguente:

ls file_non_esistente 2>&1 | grep File

oppure ancor meglio per non avere sul terminale lo standard error basta buttarlo in /dev/null

ls file_non_esistente 2>/dev/null

Gli identificativi standard o canali standard (o standard streams) aperti automaticamente sono:

  • 0 standard input
  • 1 standard output
  • 2 standard error

 

Uso di array semplici in bash

Con Bash per dichiarare esplicitamente un array bisogna utilizzare

declare -A mioarray

Per avere il valore dell’elemento 5 basta scrivere

echo $[mioarray[5]

mentre per cambiare il valore  bisogna scrivere

mioarray[5]='nuovo valore'

${mioarray[*]} o ${mioarray[@]} viene espanso da tutti i valori dell’array mentre $[#mionome[@]} viene espanso con la lunghezza dell’array

Cosa possiamo fare con gli array? Ad esempio memorizzare l’output di un comando di cui ogni riga vorremmo che vada su un elemento differente.

IFS=$'\n' mioarray=($(ls -alh))

A questo punto possiamo stampare l’output come

 IFS=$'\n' echo "${mioarray[*]}"

Attenzione: i doppi apici sono importanti per non avere l’output su un’unica riga.

Facendo così potremmo fare diversi test sullo stesso output catturato una sola volta.

 

 

Uso di array associativi in bash

Per dichiarare un array associativo bisogna dichiararlo con

declare -A mioarray/

e come indice si può utilizzare una stringa, questo significa che

mioarray[test]='aa'
echo ${mioarray[test]} # restituisce 'aa'

 

lvm

Aggiunta di un disco in LVM

Supponiamo di volere aggiungere un disco o una sua partizione nel gestore LVM di Linux e creare un volume group di nome “quollvg” con un volume logico di nome “quolllv” di dimensione 50GB.

controlliamo l’elenco dei dischi con il comando:

fidisk -l

Supponiamo che /dev/sdb sia il disco da aggiungere

Lanciamo il comando (lvm)

pvcreate /dev/sdb

Se abbiamo intenzione di usare una partizione, ad esempio la 1 del disco, dopo averla creata ed associato il tipo 83 (LVM) usiamo il comando:

pvcreate /dev/sdb1

A questo punto creiamo il volume group ed il volume logico, formattiamo e montiamo il nuovo disco :

vgcreate quollvg /dev/sdb
lvcreate -L 50G -n quolllv quollvg
mkdir /quolllv
mkfs.ext4dev -m 1 /dev/quolvg/quollv
mount /dev/mapper/quollvg-quolllv /quolllv

Per vedere lo stato del volume logico e del volume group:

lvdisplay
vgdisplay

 

 

Aggiungere un disco ad un volume group in LVM

Supponiamo di aver un volume group LVM di nome “quollvg” pieno o quasi pieno e di voler aggiungere dell’altro spazio avendo a disposizione un altro disco o un’altra partizione libera.

Supponiamo che il disco libero sia /dev/sdc (o /dev/sdc1) allora quello che dobbiamo fare è semplicemente:

pvcreate /dev/sdc
vgextend quollvg /dev/sdc

 

Aumentare la dimensione di una partizione LVM

Supponiamo di voler aumentare di 10G la dimensione della partizione ext4 del volume logico “quolllv” appartenente al volume group “quollvg”.

Per prima cosa controlliamo che il volume group “quollvg” abbia almeno 10GB liberi (sarebbe bene per un system administrator lasciare sempre libero in ogni volume group almeno dal 3% al 5% dello spazio nel caso in cui serva fare una snap per il backup o per qualche altro motivo)

vgdisplay quollvg

e controllare la sezione “Free PE / Size” per verificare che ci sia spazio disponibile.

Usare il comando per allargare il logical volume “quolllv“:

lvresize -L +10G /dev/quollvg/quolllv

A questo punto il logical volume “quolllv” è più grande di 10GB; bisogna quindi farlo sapere anche al file system ext4:

resize2fs /dev/mapper/quollvg-quolllv

Il resize2fs viene fatto anche caldo (a disco montato) quindi non preoccupatevi se è occupato da altro e non può esser smontato

Come creare una snapshot di un logical volume

Supponiamo di voler creare una snapshot del logical volume “quolllv” già esistente appartenente al volume group “quollvg“.

Controlliamo prima che ci sia spazio a sufficienza nel volume group:

vgdisplay quollvg

Controlliamo che “Free PE / Size” non sia tutto già occupato e supponiamo di avere 5GB di spazio da poter utilizzare per la snapshot:

lvcreate -L +5G -s -n "quolllv_snap" /dev/quollvg/quolllv

A questo punto abbiamo a disposizione la snapshot come verificabile digitando il comando:

lvdisplay

Possiamo quindi montarla ed utilizzarla:

mkdir /snap
mount /dev/mapper/quollvg-quolllv_snap /snap

Dopo averci lavorato (ad esempio dopo il backup) possiamo tranquillamente eliminare la snapshot:

umount /snap
lvremove -f /dev/quollvg/quolllv_snap
rmdir /snap

 

openssl

Estrazione del contenuto di un file firmato digitalmente (p7m)

Consideriamo il caso in cui il documento firmato sia un pdf (documento.pdf.p7m).

Per estrarre il file contenuto utilizziamo il comando openssl con il parametro smime per la verifica della firma (-verify)

openssl smime -verify -noverify -in documento.pdf.p7m -inform DER -out documento.pdf

Per maggiori informazioni vedere l’articolo

Estrazione del certificato di un file firmato digitalmente (p7m)

Consideriamo il caso in cui il documento firmato sia un pdf (documento.pdf.p7m).

Per estrarre il certificato utilizzato per firmare il p7m utilizziamo il comando openssl con il parametro pkcs

openssl pkcs7 -inform DER -in documento.pdf.p7m -print_certs -out cert.pem

il certificato verrà estratto nel file cert.pem e se si vuole visualizzare in modo testuale basta il comando per i certificati x509

openssl x509 -in cert.pem -text -noout

Per maggiori informazioni vedere l’articolo

Verifica della firma di un documento p7m

Consideriamo il caso in cui il documento firmato sia un pdf (documento.pdf.p7m).

Per verificare la firma ed estrarre il file contenuto utilizziamo il comando openssl con il parametro smime per la verifica della firma (-verify)

openssl smime -in documento.pdf.p7m -inform DER -verify -CAfile CA.pem -out documento.pdf

Dove CA.pem contiene il certificato della CA (Certificate Authority) che ha rilasciato il certificato presente nel p7m.

Per maggiori informazioni vedere l’articolo

Trust certificate authority per firma digitale

Se si tenta di verificare la firma di un file p7m senza il certificato dell’ente certificatore (la CA), la verifica fallisce (“unable to load certificate“) perché non abbiamo i certificati di fiducia della CA (i cosiddetti Trust).
Tali Certificate Authority sono state definite per legge italiana e sono registrati sul CNIPA, che dal dicembre 2009 è diventato DigitPA, come portafoglio di certificati XML e li ho trovati sullo stesso sito all’indirizzo https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_signed.xml.
Per far in modo che openssl li gestisca bisogna metterli nel suo formato quindi:

wget -O - https://applicazioni.cnipa.gov.it/TSL/_IT_TSL_signed.xml | perl -ne 'if (/<X509Certificate>/) {
s/^\s+//; s/\s+$//;
s/<\/*X509Certificate>//g;
print "-----BEGIN CERTIFICATE-----\n";
while (length($_)>64) {
print substr($_,0,64)."\n";
$_=substr($_,64);
}
print $_."\n";
print "-----END CERTIFICATE-----\n";
}' >CA.pem

In tal modo abbiamo tutti i certificati presenti in un unico file CA.pem, purtroppo anche quelli che forse sono scaduti.
Anche se scaduti potremmo aver bisogno di verificare un file vecchio e quindi ci possono servire anche gli scaduti.
Per maggiori informazioni vedere l’articolo

Per gli aggiornamenti allo script consultare https://github.com/eniocarboni/getTrustCAP7m

perl

Estrarre tutte le chiavi GPG pubbliche da un file

Supponiamo di avere un file di nome “file-con-chiavi-gpg” e di volerle estrarre eliminando ogni altra riga presente nel file.

perl -ne 'print if /-----BEGIN PGP PUBLIC KEY BLOCK-----/../-----END PGP PUBLIC KEY BLOCK-----/' file-con-chiavi-gpg

Naturalmente estrapolando la logica potremmo voler stampare tutte le righe comprese tra due regexp

perl -ne 'print if /regex1/../regex2/' file.txt

Aggiungere 1 a tutti i numeri presenti su una stringa

$str =~ s/(\d+)/$1+1/ge

Numerare un file di testo

Supponiamo di avere un file di testo (prova.txt) che vogliamo numerare. Possiamo utilizzare:

perl -pe '$_ = "$. $_"' prova.txt

Se si vuole simulare l’output di cat -n prova.txt basta usare:

perl -ne 'printf "% 5d %s", $., $_' prova.tx

Per togliere la numerazione possiamo utilizzare:

perl -pe 's/^\s*\d+\s*//' prova.txt

Encode/decode un file o stringa in Mime Base64

Supponiamo aver una stringa “Prova encode” ed un file “prova.txt” da voler encodare in Mime base64. Per risolvere il problema possiamo semplicemente lanciare la riga di comando:

perl -MMIME::Base64 -e 'print encode_base64("Prova encode")'
perl -MMIME::Base64 -0777 -ne 'print encode_base64($_)' prova.txt

Per l’operazione inversa basta fare:

perl -MMIME::Base64 -le 'print decode_base64("stringa in base64")'
perl -MMIME::Base64 -ne 'print decode_base64($_)' prova.base64

 

Stampare solo la linea 25 di un file

Supponiamo di voler stampare solamente una singola linea di un file, che per comodità indichiamo con la linea 25

perl -ne '$. == 25 && print && exit' file.txt

Naturalmente se vogliamo stampare anche le righe 31 e 57

perl -ne '($. == 25 || $. == 31 || $. == 57) && print' file.txt

Mentre se volessimo tutte le righe tra la 25 e la 57  comprese

perl -ne 'print if $. >= 25 && $. <= 57' file.txt

Rinominare un gruppo di file in base ad una regexpr

Supponiamo di voler rinominare il nome di un gruppo di file che hanno il seguente template:

file1_tmp.sh
file2_tmp.sh
...
file99_tmp.sh

e supponiamo di voler togliere la parte centrale ‘_tmp’ in tutti i file. Possiamo utilizzare il comando “rename” o “prename”:

 rename 's/_tmp//' *.sh

 

Come contare il numero di volte che un singolo carattere è presente in ogni riga di un file

Supponiamo di avere un file di testo di nome “file.csv” e di voler contare per ogni riga il numero di volte che si presenta un carattere, ad esempio il carattere “,“.

Supponiamo che il risultato sia l’output dello stesso file “file.csv” preceduto in ogni riga dal conteggio stesso.

Basta semplicemente la seguente singola riga perl:

perl -ne '@c=$_=~/;/g; print scalar(@c)." ". $_;' file.csv

 

 

ssh

ssh: come importare la chiave pubblica su un host

Supponiamo di aver già a disposizione le nostre chiavi pubbliche e private ssh o creiamole per la prima volta con il comando

ssh-keygen

Le chiavi create sono sotto $HOME/.ssh/id* e le pubbliche finiscono con .pub

Abilitare l’ssh-agent ed aggiungere le chiavi con il comando

ssh-add

Per importare la chiave sull’host “mioserver” di cui abbiamo accesso tramite l’utente “mioutente” basta il comando

ssh-copy-id mioutente@mioserver

In tal caso tutte le chiavi pubbliche vengono copiate nel server “mioserver“.
Se si vuol copiare solo la chiave “rsa” basta lanciare il comando

ssh-copy-id -i $HOME/.ssh/id_rsa mioutente@mioserver

 

Come cambiare la password ssh

ssh-keygen -p

Come lanciare un comando su un host remoto in ssh

Per lanciare un comando remoto basta passarlo come ultimo parametro al comando ssh.

Supponiamo ad esempio di volere la lista dei file della home page di “mioutente” su “mioserver

ssh mioutente@mioserver ls -alh

Per fare, invece,  il backup di tutta la home con il comando tar e salvare tutto in locale tramite comando ssh, lanciamo

ssh mioutente@mioserver tar czvf - . >miobackup.tgz

Utilizzare ssh come server/proxy SOCKS5

Supponiamo di voler utilizzare “mioserver” come server/proxy SOCKS5 e configurarlo sul browser locale facciamo

ssh mioutente@mioserver
mioutente@mioserver:~$ ssh -N -D 8080 localhost

A questo punto basta configurare nel browser l’utilizzo del server “mioserver” su porta “8080” come SOCKS5 e navigare.
Aggiungere l’opzione “-f” di ssh per lasciare il comando in background.

Come redirigere una connessione remota in locale tramite ssh

Supponiamo che l’host “mioserver” sia autorizzato ad accedere su una DMZ al server mysql della server farm, per poter accedere direttamente anche con il computer locale al server mysql possiamo lanciare il comando locale

ssh -L 3333:mysql_server_name_o_ip:3306 mioutente@mioserver

Lasciando il comando attivo ora abbiamo un canale/tunnel criptato tra il computer locale e “mioserver” sulla porta locale 3333 che si connette direttamente al server mysql in DMZ (di nome mysql_server_name_o_ip).
Possiamo quindi connetterci direttamente al server mysql con il comando

mysql -P 3333 -h 127.0.0.1 -u mioutentemysql -p miodatabasemysql

Oppure se si preferisce utilizzare phpMyAdmin basta installarlo in locale e configurarlo sulla porta locale 3333.

Per togliere il canale criptato basta chiudere la connessione ssh.

Redirigere un servizio locale in remoto con ssh

Supponiamo di volerci connetterci da casa al pc dell’ ufficio (che può accede al server “mioserver” in server farm)  non raggiungibile nemmeno in VPN; basta che dal pc di ufficio lanciamo il comando ssh:

ssh -N -f -R 2222:localhost:22 mioutente@mioserver

lasciandolo attivo (senza spegnere il computer).
Da casa basta abilitare la VPN per poter raggiungere “mioserver” e connettersi al server

ssh mioutente@mioserver
mioutente@mioserver:~$ ssh -P 2222 utente_pc_lavoro@localhost
utente_pc_lavoro@localhost:~$

In tal modo si riesce ad entrare nel pc dell’ufficio da casa.

 

Lascia un commento

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