Quickloox

Dal mondo Apple all'universo digitale, in visualizzazione rapida dell'ovvio

1 giu 2010

Me li do io i permessi

Grazie a Sabino per il permesso di riportare qui sotto, come post, il commento da lui inviato giorni fa in merito a una questione di permessi e modifiche di file in arrivo su Mac da sistemi esterni. Così ha più visibilità.

Ne consiglio la lettura anche in assenza di idea su perché è nato e a che cosa serva. In ogni paragrafo si trova qualcosa di utile per avvicinarsi agli incantesimi Unix che danno vita al mondo magico di Mac OS X e ciascuna nozione risulta preziosa anche indipendentemente dalle altre.

Premessa #1: il Terminale in Mac OS X si trova in Applicazioni > Utility. Una volta lanciato può essere configurato in molti modi (tramite le Preferenze) perdendo quell’aspetto triste e serioso che spaventa l’utente normale.

Una volta lanciato, il Terminale presenta il cosiddetto prompt, che su OS X mostra tipicamente il nome del computer, la cartella dove ci si trova e il nome dell’utente. L’ultimo carattere del prompt è $. Nel Terminale tutti i comandi si inseriscono dopo $.

Premessa #2: perché bash invece di Automator o AppleScript? Beh, innanzitutto perché bash è multipiattaforma e quindi funziona su Linux e, volendo, anche su Windows. E poi perchè mi piace!

Lanciamo quindi il Terminale (magari configurandolo, io consiglio almeno di aumentare le dimensioni della finestra a circa 100x40 per stare comodi) e iniziamo a lavorare.

Creiamo innanzi tutto una cartella ~/bin, dove il carattere ~ (tilde, ALT+5) indica per convenzione sui sistemi basati su Unix la cartella Inizio dell’utente. Per farlo da Terminale, digitiamo (ATTENZIONE, come già detto $ indica solo l’ultimo carattere del prompt e NON va mai inserito nei comandi seguenti):

$ cd $ mkdir bin $ chflags hidden bin $ cd bin

(il primo comando serve per essere sicuri di partire dalla cartella Inizio, il secondo crea una nuova cartella bin, il terzo la nasconde al Finder e l’ultimo comando ci fa spostare nella cartella bin).

In realtà possiamo creare una qualunque cartella dove salvare i nostri comandi bash, o usarne una già esistente. Però bin rispetta le convenzioni Unix e mi sembra preferibile.

A questo punto editiamo con nano (un editor testuale molto semplice) il file cambia_permessi che conterrà i comandi veri e propri:

$ nano cambia_permessi

Non preoccupatevi per l’interfaccia di nano, qui dobbiamo usare solo due comandi, CTRL+O per salvare il file editato e CTRL+X per uscire da nano. Dimenticavo: CTRL+O significa premere contemporaneamente il tasto CTRL, l’ultimo in basso a sinistra sulle tastiere Mac (nei portatili è a fianco di fn), e il tasto O. Analogamente per CTRL+X.

Torniamo al nostro file cambia_permessi. A questo punto bisognerebbe inserire a mano le linee mostrate qui sotto. Ma OS X è furbo, e il copia e incolla funziona anche in nano all’interno della finestra del Terminale. Quindi basta selezionare le linee qui sotto (fino alla riga con i #####################), copiare e poi spostarsi nella finestra del Terminale con nano attivo ed incollare:

#!/bin/bash # DIR=~/public/scansioni/ FILES=* PERM=a+rw # if [ -d $DIR ]; then cd $DIR chmod -R $PERM $FILES cd fi #########################

Salviamo subito lo script premendo CTRL+O e poi usciamo da nano con CTRL+X.

Cosa significano questi comandi? Il più importante è chmod, che cambia i permessi per tutti gli utenti, in modo che tutti i file nella cartella siano leggibili e scrivibili. Il resto è contorno.

Quello che è ancora più importante è che lo script è parametrico: basta cambiare i valori di DIR, FILES e PERM per adattarlo alle proprie esigenze.

Per esempio, se la cartella ~/public/scansioni/ contenesse vari tipi di file e si volessero cambiare i permessi dei soli file pdf lasciando gli altri file invariati, la riga FILES= diventerebbe FILES=.pdf.

Non è finita. Controlliamo prima di tutto di avere veramente fatto tutto bene con il comando:

$ cat cambia_permessi

che dovrebbe mostrare sullo schermo lo script appena inserito.

Poi, per semplificarci la vita, rendiamo lo script eseguibile con il comando:

$ chmod u+x cambia_permessi

Da notare che quest’ultimo comando rende eseguibile lo script solo all’utente che sta usando il Mac al momento. I motivi li tralascio per brevità, ma credetemi, è meglio fare così.

Un ultimo passo necessario. In questo momento, per cambiare i permessi dei file nella cartella ~/public/scansioni/, bisogna eseguire a mano il comando da Terminale:

$ ~/bin/cambia_permessi

Ciò è sicuramente molto più comodo di cambiare manualmente i permessi ai file, ma si può fare di meglio.

Qui entra in gioco cron, uno strumento che esegue comandi stabiliti dall’utente a intervalli di tempo predefiniti. Sembra una cosa cretina, ma permette di far fare al computer un mare di cose automaticamente. Però la sintassi di cron è orrenda. E questo post sta diventando troppo lungo.

Cercherò di sintetizzare ma se qualcuno è interessato posso scrivere qualcosa in proposito.

Diciamo che vogliamo che ogni cinque minuti lo script cambia_permessi venga eseguito automaticamente. Dal solito Terminale dobbiamo allora eseguire i comandi:

$ export EDITOR=/usr/bin/nano $ crontab -e

La prima riga serve a evitare di usare l’editor preimpostato, vi. Un vero reperto archeologico che sarebbe bene dimenticare una volta per tutte.

Dovrebbe invece aprirsi il solito nano, in cui incolleremo esattamente la riga seguente:

05 * * * * ~/bin/cambia_permessi

(prima e dopo ciascun asterisco è presente una tabulazione)

Salviamo con CTRL+O e usciamo con CTRL+X.

Ovviamente se vogliamo che lo script venga eseguito più o meno frequentemente, basta cambiare il valore 05 in, diciamo, 02 o 15 (per eseguire lo script ogni 2 o 15 minuti).

Abbiamo finito. Sembra complicato, ma credetemi, è molto più lungo da leggere (e da scrivere!) che da mettere in pratica.

Aggiungo solo una piccola nota per gli inesperti di Terminale che si scontrano con cron (e, su Snow Leopard, con launchd). Una scorciatoia artigianale consiste nel definire un evento ricorrente dentro iCal e, nelle informazioni relative, stabilire che in occasione dell’evento va eseguito uno script.

Commenta