Crontab


Per avviare il programma occorre digitare in una finestra terminale:

crontab -e

Ora è possibile inserire i comandi di cui si vuole pianificare l’azione

00 05 04 12 01 "comando"

Cosa significa?

  • 00 sono i minuti
  • 05 è l’ora di esecuzione (quindi avremo l’esecuzione (programmata per le 05.00 del mattino)
  • 04 è il giorno
  • 12 è il mese
  • 01 è il giorno della settimana (i valori sono 0,1,2,3,4,5 e 6 con lo 0 che si riferisce alla Domenica)
  • e poi viene indicato il comando da eseguire

Quindi in questo esempio, quindi, si sta dicendo a crontab di eseguire il lunedì 4 dicembre alle ore 05.00 (di ogni anno), un certo comando. Se si vuole impartire l’esecuzione del comando ogni mese oppure ogni giorno è sufficiente sostituire ai numeri un asterisco

00 08 * * 01 "comando

È utile ricordare alcune opzioni del crontab

  • crontab -l visualizzerà i crontab in funzione (utile per vedere se un comando è stato registrato correttamente)
  • crontab -r rimuove tutti i crontab registrati
  • crontab -d da non fare mai perché questo comando cancella i job programmati (anche del sistema)
  • crontab -e permette di editare (scrivere o modificare) un crontab

cron si può configurare tramite il file crontab, come abbiamo visto ne esiste uno per ogni utente, con il quale può eseguire comandi su file di sua proprietà nel proprio user-space, ed è situato solitamente in

/var/spool/cron/crontabs/nomeutente

Per completezza, sappiate che esiste poi il file /etc/crontab nel quale sono presenti solitamente operazioni periodiche che riguardano globalmente il sistema. Di solito molte distribuzioni includono le directory /etc/cron.daily, /etc/cron.monthly, /etc/cron.weekly, /etc/cron.hourly che contegono gli script che si avvieranno rispettivamente ogni giorno, ogni mese, ogni settimana e ogni ora.

Quindi basta posizionare i propri script dentro queste directory per programmarne l’esecuzione.

Sull’argomento consiglio la lettura di questo libro:

Per il corretto funzionamento di crontab occorre assicurarsi che l’ora del sistema sia corretta. Il Network Time Protocol, in sigla NTP, è un protocollo per sincronizzare gli orologi dei computer all’interno di una rete a commutazione di pacchetto, quindi con tempi di latenza variabili ed inaffidabili.

L’NTP è un protocollo client-server appartenente al livello applicativo. Per sincronizzare manualmente l’orologio di sistema con quello di un server, da console, in modalità root, si può usare il comando

ntpdate ntp1.ien.it

oppure

ntpdate ntp.ubuntu.com pool.ntp.org

Il tempo è come l’acqua di un fiume: noi siamo fermi sulla riva ed esso scorre verso di noi.

Come faccio a capire quale file di configurazione sta usando mysql ?


Mi è capitato di mettere le mani su una installazione “pasticciona” di MySQL. Il problema è stato che c’erano due file di configurazione apparentemente relativi al demone di MySQL

/etc/my.conf

e

/etc/mysql/my.cnf

Come si fa a capire quale dei due file è effettivamente quello usato dal demone? Usiamo il comando stat

stat /etc/my.cnf

ci mostrerà una serie di informazioni, la riga che ci interessa è quella relativa ad “Access”. Facciamo lo stesso sul file

/etc/mysql/my.cnf

Impartiamo poi il comando

/etc/init.d/mysql

per riavviare il demone di MySQL e adesso andiamo a vedere cosa è successo impartendo di nuovo i comandi

stat /etc/my.cnf | grep ^Access

e

stat /etc/mysql/my.cnf | grep ^Access

per individuare quale dei due file è stato “acceduto” ultimamente. Quello sarà il nostro file di configurazione realmente utilizzato da MySQL.

HTTP tunnel example


Most of all companies only provide a very restrictive environment. While Network and Security Adminstrators do their job, securing the enterprise network from intruders, users are trying to compromise perimeter security to get more than is allowed. Surfing the www and googling provides a huge knowledge on how to greak firewalls, proxies, anti-virus appliances and so on.

httptunnel creates a bidirectional virtual data connection tunneled in HTTP requests. The HTTP requests can be sent via an HTTP proxy if so desired.

An already wide spread and known SSH client for Windows and Unix systems is Putty. Putty is a free available graphic tool which implements telnet and SSH.

Without addressing every country’s laws, there can be sanctions and legal proceedings if using covert channels in corporate networks. Read the companies policies detailed to become familiar with.

Be warned and do not use covert channels just for fun. There may be corporate agreements to tunnel data to business partners, for example.

This is to ensure that nobody else can listen to your transmission of sensible enterprise information.

Enterprise Side you need a Workstation with Internet access, at least one service must be allowed for outbound connections, an httptunnel client, and the SSH client.

At the home: Workstation with internet access, httptunnel server with correct configuration, SSH server daemon with correct configuration and any service running which you want to access remotely.

hts –forward-port localhost:22 443

or, it is the same

hts -F localhost:22 443

Final step, open tunnel and connect to the SSH server. Most work is done, and the final step is to open our tunnel. So, we need to be familiar with the httptunnel client. The simplest way to open a tunnel is

htc --forward-port 12345 192.168.113.117:443

So we say forward local port 12345 to our httptunnel server with ip 192.168.113.117 on port 443. To test, try

putty -P 12345 root@localhost

or

ssh -p 12345 root@localhost

More… creating your own SOCKS proxy

htc --forward-port 12345 192.168.117.113:443

how to open a tunnel and

putty -D 8080 -P 12345 root@localhost

to connect shell.

Then, I show how to use VNC for a remote administration. Configure VNC server at your server outside. Default ports for VNC are 5900/TCP and 5800/TCP.

In this example I use 17 as display number, then the correct ports are 5917/TCP and 5817/TCP.

htc --forward-port 10001 192.168.100.200:443

putty -L 5917:127.0.0.1:5917 -X -P 10001 root@localhost

where -L forward local port 5917 for VNC client and enable X11 forwarding with -X.

Finally, how to use an SMTP server for mailing

htc --forward-port 54321 192.168.11.22:443

putty -L 999:smtpserver:25 -P 54321 root@localhost

next configure your mail client to use localhost:999 as SMTP server.

SMTP nella pausa caffè


Partiamo dall’esigenza di un amico: spedire email in automatico come risultato di uno script che fa il suo “sporco lavoro”…

Sendmail? Postfix? $serverSMTP ? Che cosa scegliere insomma ? Una soluzione veloce da “tempo di pausa caffé” è ssmtp.

Un ringraziamento ad Anibal Monsalve Salazar che è il mantainer del pacchetto, reperibile sul sito packages.debian.org

Nel mio caso, vediamo come installare il pacchetto e farlo lavorare con gmail.

sudo apt-get install ssmtp

tanto per iniziare… poi configuriamo il file di testo in /etc/ssmtp/ssmtp.conf rigorosamente con emacs, vi, vim o altro editor da shell, vade retro GUI…

sudo vim /etc/ssmtp/ssmtp.conf

e vediamo cosa scriverci dentro

root=indirizzoemail@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=indirizzoemail
AuthPass=password
UseSTARTTLS=YES

per renderlo simpatico a gmail. Adesso proviamo a vedere se si parlano…

ssmtp caroamicotiscrivo@cuji.org

adesso ssmtp aspetta che venga composto il messaggio nella forma canonica

To: caroamicotiscrivo@cuji.org
From: indirizzoemail@gmail.com
Subject: cuji tutto a posto?

ricetta per pane e panelle

Importante la linea bianca dopo il soggetto. Significa che dopo questa linea inizia il corpo dell’email. Non dovrei dirlo ma lo dico… CTRL+D per concludere il messaggio e dopo qualche secondo il messaggio è in viaggio verso l’ignoto… ops, i server di google.

Se vogliamo inserire il messaggio in un file di testo, quindi per venire a rispondere al mio amico che fa cose serie con Linux, ecco come confezionarlo

ssmtp indirizzoemail@gmail.com < msg.txt

nel file ci scriviamo


To: indirizzoemail@gmail.com
From: indirizzoemail@gmail.com
Subject: accura!

Sembra che il server non stia funzionando, dacci na' taliata va'...

Aggiungo qui dei suggerimenti di Denis Frati

si può creare il file messaggio.txt contenente le intestazioni complete
From: amicomio@gmail.com
To: <amicotuo@gmail.com>
Cc: <pippo@paperopoli.com>
Cc: <topolino@topolinia.com>
Bcc: <minny@topolinia.com>
Subject: questo è il soggetto

questo è il body della mail

quindi per spedire

ssmtp -t < messaggio.txt

Denis continua ancora con

…inoltre se vuoi permettere agli utenti di usarlo inserendo il loro campo Form e non quello definito in /etc/ssmtp/ssmtp.conf, in tale file devi decommentare la riga FromLineOverride e dargli valore YES


# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
# togliere il commento alla riga sotto e lasciare YES così compare il
From passato dall'utente
FromLineOverride=YES

http://rcm-it.amazon.it/e/cm?t=l024c-21&o=29&p=8&l=as1&asins=190481137X&ref=qf_sp_asin_til&fc1=000000&IS2=1&lt1=_blank&m=amazon&lc1=0000FF&bc1=FFFFFF&bg1=FFFFFF&npa=1&f=ifr

Usare rsync per fare i backup


rsync è un programma per sistemi Unix che sincronizza i file e le directory da un posto ad un altro minimizzando il trasferimento dei dati, lavorando solo sulle differenze (tra i file).

Un’altra caratteristica importante di questo programma, che di solito non troviamo in altri similari (dedicati cioè alla copia), è che il mirroring si svolge con una sola trasmissione in ogni direzione; eventualmente utilizzando la compressione e la ricorsione.

In daemon mode (modalità come servizio) rsync è in ascolto sulla porta predefinita 873/TCP, permette di sincronizzare anche due directory locali (cioè sullo stesso computer) oppure di interagire con RSH e SSH.

In quest’ultimo caso il client di rsync deve essere installato sia sull’host locale che su quello remoto.

Su Ubuntu si può usare rsync come segue

sudo rsync -av --delete --progress /partenza /destinazione

Opzionalmente è possibile generare un file di log, per esempio

sudo rsync -av --progress --delete --log-file=/home/nomeutente/Desktop/$(date +%Y%m%d)_rsync.log --exclude "/home/nomeutente/.gvfs" /home /media/HomeBackup

In questo caso viene esclusa la directory relativa a GVFS . Il parametro -a preserva i permessi dei file, mentre v attiva la modalità “verbose” (dettagliata) restituendo a terminale una serie di informazioni su come progredisce l’attività del programma.

--progress aggiunge ulteriori informazioni sulla progressione dell’attività del programma

Il parametro --delete, invece, controlla i cambiamenti tra sorgente e destinazione e cancella dalla destinazione i file che sono stati cancellati nella sorgente.

--exclude è comodo perché consente di evitare la copia di particolari directory o di singoli file

Per automatizzare le copie da una sorgente verso una destinazione torna comodo l’uso di uno script da lanciare mediante crontab. Questo un esempio

#!/bin/bash
sudo rsync -av --delete --progress /partenza /destinazione

Lo script deve avere i permessi di esecuzione opportuni, quindi

chmod +x copie.sh

Il cronjob potrebbe essere impartito come segue

sudo crontab -e
0 22 * * * /root/copie.sh

dove 0 = il minuto zero 22 = le ore 22 (nel formato h24 le ore vanno da 0 a 23) il primo asterisco = rappresenta il giorno del mese (da 1 a 31) il secondo asterisco = rappresenta il mese (da 1 a 12) il terzo asterisco = rappresenta il giorno della settimana (da 0 o 7 rappresenta la domenica, 1 è lunedì e così via…), infine viene dato il percorso assoluto del comando (come lo “vede” l’utente che esegue il cronjob).

Remote desktop management


Per aprire una sessione di desktop remoto

rdesktop -a 16 sigma:3011

Per aprire la sessione stabilendo la dimensione dello schermo

rdesktop -u -p -g 800x600 -a 16 -D -z -P <nomeserver / IPAddress>

  • apre una sessione chiedendo l’autenticazione con nome utente e password
  • stabilisce la profondità di colore a 16 bit
  • nasconde le decorazioni della finestra
  • abilita la compressione RDP

Lanciare una GUI remota usando SSH

ssh -C -X user@remotehost gui_command

dove

  • -C abilita la compressione
  • -X abilita l’inoltro su X11

Provare anche con

ssh -fY user@host gui_command

Liste, tuple e dizionari


Una lista, in Python, è una sequenza ordinata di oggetti. È una variabile “speciale” che può assumere più valori contemporaneamente.

listadellaspesa=['dentifricio','carta igienica','sapone per lemani','prosciutto','salame']

Il comando

print listadellaspesa

restituisce l’elenco riportato più sopra. Esistono molte funzioni interessanti legate alle liste:

append che inserisce un nuovo elemento in coda alla lista

listadellaspesa.append('deodorante')

del che invece rimuove un elemento

del listadellaspesa[2]

rimuove il terzo elemento della lista (in Python si conta a partire da “0″)

sort che riordina una lista

listadellaspesa.sort()

riordina alfabeticamente la lista

Infine il comando range che permette di creare delle liste a partire da un numero

listadellaspesa=range(12)

crea una lista che parte da 0 e finisce con 11, perché come detto prima, si inizia a contare da zero in Python.

Le tuple differiscono dalle liste perché sono immutabili, inoltre si identificano tra parentesi tonde, a differenza delle liste che usano le parentesi quadre.

settimana = ('Lunedì','Martedì','Mercoledì','Giovedì','Sabato')

I dizionari sono invece definiti tra parentesi graffe, ogni elemento del dizionario è infatti composto da una chiave ed un valore, la prima serve per il recupero del
secondo.

libro = {'titolo':'Bioinformatics Programming Using Python','autore':'Gualtiero Spampinato della Rovere','editore':'scilla e cariddi edizioni'}

Anche in questo caso esistono funzioni utili:

len che indica quanti elementi compongono il dizionario

print len(libri) darà come risultato 3

has_key indica se esiste una specifica chiave

libri.has_key('autore') restituisce 1

keys restituisce una lista contenente il nome delle chiavi del dizionario

print libri.keys() darà ['titolo','autore','editore']

similarmente values restituisce la lista dei valori

del come per le liste, permette di cancellare una chiave ed il suo valore

del libri['autore']

Per aggiungere valori, si usa append come segue nell’esempio:

libri.append({'titolo':'Il cane di terracotta','autore':'Ermenegildo Francesco Camilleri','editore':'librerie fellerio'})

Le parentesi graffe in Linux si ottengono con le combinazioni di tasti ALT GR + il numero 7 oppure il numero 0, rispettivamente per “aperta graffa” e “chiusa graffa”.

pdftk


PDFtk è un programma molto utile se dovete manipolare file nel comune formato di Adobe Acrobat. Ecco come si usa per unire più documenti in un unico file:

pdftk file1.pdf file2.pdf file3.pdf cat output nuovofile123.pdf
pdftk A=1.pdf B=2.pdf cat A B output 12.pdf
pdftk *.pdf cat output sommadeifile.pdf

Per estrarre solo alcune pagine da certi file e costituire con esse un nuovo file che le accorpa:

pdftk A=one.pdf B=two.pdf cat A1-7 B1-5 A8 output combined.pdf

Si può gestire anche la cifratura di un file PDF scrivendo (la password è “stigghiole”):

pdftk documento.pdf output doccifrato.a128bit.pdf owner_pw stigghiole

Per decifrare il file:

pdftk secured.pdf input_pw foopass output unsecured.pdf

Oppure fare la stessa cosa senza chiudere il file con una password:

pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz

Impedire la stampa:

pdftk mydoc.pdf output mydoc.128.pdf owner_pw foo user_pw baz allow printing

Integrare due file, di cui uno cifrato:

pdftk A=secured.pdf mydoc.pdf input_pw A=foopass cat output combined.pdf

E se volessimo prelevare il testo di un file PDF per usarlo con un elaboratore di testi?

pdftk mydoc.pdf output mydoc.clear.pdf uncompress

Provare a riparare un file PDF danneggiato (se possibile):

pdftk broken.pdf output fixed.pdf

Estrarre tutte le pagine di un documento PDF in singoli documenti e produrre un elenco dei medesimi:

pdftk mydoc.pdf burst

pdftk mydoc.pdf dump_data output report.txt

Un buon front-end è il programma PDFChain

reperibile sul sito pdfchain.sourceforge.net mentre PDFtk è disponibile sul sito www.pdflabs.com

Altrimenti potete provare PDFedit, un altro strumento per GNU/Linux in grado di modificare i file .pdf ma è senza dubbio il primo veramente utilizzabile.

PDFedit si trova su http://sourceforge.net/projects/pdfedit

Interrogare un server LDAP


Questo frammento di codice serve per verificare se un certo server LDAP è raggiungibile


import ldap

try:
l = ldap.open(“indicepa.gov.it”)
l.protocol_version = ldap.VERSION3
except ldap.LDAPError, e:
print e
baseDN = “c=it”
searchScope = ldap.SCOPE_SUBTREE
retrieveAttributes = None
searchFilter = “oU=MIAV*”

try:
ldap_result_id = l.search(baseDN, searchScope, searchFilter, retrieveAttributes)
result_set = []
while 1:
result_type, result_data = l.result(ldap_result_id, 0)
if (result_data == []):
break
else:
if result_type == ldap.RES_SEARCH_ENTRY:
result_set.append(result_data)
print result_set
except ldap.LDAPError, e:
print e

Il risultato è questo:

[[('ou=MIAVIMAR,o=m_d,c=it', {'provincia': ['RM'], 'description': ["Ufficio dell'Ispettore dell'Aviazione per la Marina Militare - Roma (ISPAVIAMAR Roma)"], 'regione': ['Lazio'], 'cognomeResp': ['dichiarato'], 'objectClass': ['top', 'organization', 'organizationalUnit', 'ufficio'], 'l': ['Roma'], 'o': ['m_d'], 'street': ['Piazza della Marina, 4'], 'aooRef': ['aoo=MIAVIMAR,o=m_d,c=it'], 'nomeResp': ['non'], 'postalCode': ['00196'], 'mail': ['ispaviamar.roma@marina.difesa.it'], 'ou': ['MIAVIMAR']})]]

i miei “vecchi amici” di ISPAVIAMAR…

Riferimenti:

ttyS0 – terminal on serial connection


I actually planned to do this for quite a long time, but since I haven’t had any suitable client hardware, I procrastinated this.

Now, the old laptop I’ve got from my dad, features an RS-232 port. So, now that I had technically a client, that I could test my RS-232 connection with, I ordered a null modem cable.

There is no RS-232 outlet on my desktop computer directly on the mainboard, but theres a connector on the mainbord, where a RS-232 outlet can be attached to. The outlet will then cover up a PCI slot.

Activating RS-232

Ok, once all cables were in place, I tried to access both RS-232 ports by reading from them directly. They’re usually ttyS0 or ttyS1, depending what COM-Port it is.

From the file /proc/tty/driver/serial, information about the serial setup can be obtained.
A setserial -q /dev/ttyS0 might be usefull as well. Usually, the UART Type is 16550A, on a standard PC. Mine wasn’t working though.

At leas not right from the start, when I tried to read the interface with cat /dev/ttyS0, I got the following error:

# cat /dev/ttyS0
cat: /dev/ttyS0: Input/output error

Obviously, the driver couldn’t activate the hardware. Reason was, it was deactivated in BIOS. After activating RS-232 there, it worked well.

As a last action, I added myself to the uucp group, so I have user permission to the serial lines. It is not necessary for the terminal setup, but a good idea to do so, just for future projects, maybe…

Setting up a terminal

Once the Serial line is configured and working properly, it’s time to let a terminal run on that port. This is what I added to my /etc/inittab:

s0:2345:respawn:/sbin/agetty -L 38400 ttyS0

I added it quite on the top of that file, right below the 'si' statment, mingetty cannot be used for serial connections, it cannot be run in a console, too. I tried it for testing purposes, but the cosole – along with your login program – will log you out, as soon as you log in over your serial line.

'-L' means this is a local line, with no carrier signal. 38400 is the standard speed of a Linux console, it might be a bit high, I was told, but it works well. I tested that with some higher values as well (115200) and it worked too, I guess it tepends on things like cable length, etc. Last parameter, is the serial tty to listen on. The terminal type can be specified as an additional parameter at the end of the parameter list, vt102, for instance. This is sometimes required, depending on the client.

After finishing editing /etc/inittab, an init q will make the system re-read /etc/inittab and apply changes. The agetty> should now be listening on ttyS0>.

Setting up a client

It’s time to establish a connection and test the serial line. I use a laptop, that has an RS-232 port, so some preliminary setup is required. I tried minicom as terminal initially, but it turned out, not to be the best client. It initializes the modem, this lasts quite long, and it doesn’t convey ANSI colors. So the better option is cu, it’s part of the UUCP-Package.

Oh, and the serial port of that computer, has to be accessible as well, of course.

Once everything was set up, I established the connection:

$ cu -l ttyS0 -38400 --nostop

Pretty self explanatory, I think. The --nostop option disables XON/XOFF handling.

root access over ttyS0

In order to become root over the serial terminal, the tty needs to be added to /etc/securetty

I appended ttyS0 to the end of the file. It is now possible, to gain root access over the serial terminal. The agetty process needs to be restarted to apply changes.

Accessing GRUB over ttyS0

To make bootloader access possible over ttyS0, some changes to /boot/grub/menu.lst need to be done. (GRUB is the bootloader I use, I suppose LiLo has similar capabilities.)

Those are the lines, I appended to the top of my menu.lst:

serial --unit=0 --speed=38400 --word=8 --parity=no --stop=1
terminal --timeout=3 serial console

The serial command initiates the serial terminal option, --unit=0 defines our first serial connector, I my case, it’s the only one I have on my machine. I used the standard Linux-Console speed, as well as the “8N1″ connection strategy.

terminal defines the terminal priorities, first terminal (serial) is the standard one, the last one is the secondary terminal (console).

--timeout=3 enables a delay on both consoles, with a prompt for a keystroke. Depending on which terminal, the key is pressed, this terminal, will be used. If no key is pressed after the timeout, the standard console (in my case serial) will be used.

Relaying Kernel output on boot

The Kernel accepts multiple console options, of which the last one, is the standard console, and the one that will be used in Single User mode. These are my Kernel options:

title Fedora Core (2.6.20-1.2316.fc5)
root (hd0,0)
kernel /vmlinuz-2.6.20-1.2316.fc5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet vga=795 console=tty0 console=ttyS0,38400
initrd /initrd-2.6.20-1.2316.fc5.img

console=tty0 is the standard console, located on the machine, i.e. monitor and keyboard.

Iscriviti

Get every new post delivered to your Inbox.

Join 35 other followers