bash

Ripristinare ownership e permessi di un path

bash
Tags: pillbash

Se avete bisogno di trasferire dei file tra 2 host come utente semplice (sudoer) ma con la necessità di trasferire anche i permessi di root e volete evitare comandi complessi e tunneling, o più un generale se avete bisogno di salvare lo stato di ownership e permessi di un tree in modo da poterli ripristinare in seguito, il metodo sotto vi permette semplicemente di creare un file TXT che contiene lo stato di tutti i file, e di poterlo quindi ripristinare.

Questo il comando per salvare lo stato della cartella corrente:

getfacl -R . > acls.txt

E questo il comando per ripristinarlo:

setfacl --restore=acls.txt

Bash: usare una variabile per costruire un comando (con wildcards)

bash

Poniamo che in uno script vogliamo eseguire un comando, i cui parametri sono all'interno di una variabile (o, più in generale, parte o tutta la linea di comando è presente in una variabile). Normalmente eseguiremo una cosa del genere:

PARAMS="-par1 -par2"
command $PARAMS

Fin qui nessun problema. Gli scogli arrivano se dentro $PARAMS sono presenti delle wildcards, ad esempio:

PARAMS="-par1 --exclude={/dir1/*,/dir2/*}"
command $PARAMS

In questo caso l'esecuzione del comando non funziona o, meglio, non funziona allo stesso modo di aver eseguito direttamente:

command -par1 --exclude={/dir1/*,/dir2/*}

Bash: array associativi e come copiarli

bash

La bash ha il supporto sia per gli array a indice numerico che per gli array associativi. Vediamo come usarli.

Array a indice numerico

Per quanto riguarda i primi è possibile usare queste forme per la dichiarazione:

var[index]=value

var(value1 value2 value3...)

(in questo caso il primo indice parte da "0")

var([index1]=value1 [index2]=value2 ...)

Ad esempio, questi comandi generano la stessa variabile:

test[1]=one
test[2]=two
echo ${test[1]}
unset test
test=([1]=one [2]=two)
echo ${test[1]}

E' possibile usare anche la forma "+=" per aggiungere un array a un altro.

var += ([index]=value ...)

Da notare che è possibile dichiarare una variabile come array usando la forma:

declare -a var

Linux shell: impostare una cartella condivisa dove tutti i file sono modificabili da gruppo

linux

 

Se si vuole avere una cartella condivisa da più utenti, nella quale tutti possono inserire file e vedere/manipolare anche i file degli altri, senza problemi di diritti, la soluzione non è immediata. I diritti di creazione file per un utente loggato e/o le sue impostazioni di gruppo di default (in particolare per l'utente root) possono creare l'inconveniente che alcuni file non sono leggibili da tutti.

Per evitare questo usiamo 2 caratteristiche della gestione permessi di linux: il flag "s" (setUID) e la gestione FACL (file access control list).

Eseguire velocemente una app java che necessita di classpath

java

Se abbiamo un JAR con una applicazione Java da eseguire, e questo ha delle dipendenze da inserire nel classpath, si può usare questo comando veloce:

java -cp $(echo *.jar | tr ' ' ':') COMMAND

Il comando prevede che tutti i jar necessari (compreso il jar del comando) siano nella directory corrente. Se non è cosi' si possono fare le modifiche relative.

Esempi:

java -cp $(echo *.jar | tr ' ' ':') org.apache.axis.wsdl.WSDL2Java
java -cp app.jar:$(echo lib/*.jar | tr ' ' ':') org.app.MyApp

Search & Replace su più file da riga di comando

script

Se vogliamo sostituire del testo su tutti i file che contengono il testo originale all'interno di un percorso possiamo fare in questo modo:

grep -RlZ "TESTO_ORIGINALE" . | xargs -0 -l sed -i -e 's/TESTO_ORIGINALE_ESC/TESTO_DA_SOSTITUIRE_ESC/g'

Per *_ESC intendo che il testo deve considerare l'escaping delle "/".

Ad esempio:

grep -RlZ "/system_home/eric/" . | xargs -0 -l sed -i -e 's/\/system_home\/eric\//\/home\/eric_arch\//g'

Sostituisce tutti i /system_home/eric/ con /home/eric_arch/.

Il grep iniziale è una ottimizzazione per evitare di fare il search & replace di tutti i file. Per vedere se sta estranendo i file giusti:

[code]