Google

[Blog] [MP3 Musica] [MP3 Audiobook] [Letture Creative] [Musica Creativa]

[Deutsch] [Español] [Português]

[Punch] [Appunti di informatica libera]

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [violazione licenza] [translators] [docinfo] [indice analitico] [volume] [parte]


Capitolo 645.   Reti e rete Internet

645.1   Generalità e configurazione di una rete locale

645.1.1)   Come si imposta un dominio virtuale?

Per impostare un dominio virtuale, si deve modificare il file httpd.conf che generalmente è presente nella directory /etc/apache/ o in /etc/. Oltre a questa modifica si deve predisporre un servizio di risoluzione dei nomi. Quest'ultimo può essere fatto mediante pacchetti appositi che gestiscono il DNS (BIND) oppure modificando il file /etc/hosts.(1)

Le modifiche da apportare al file httpd.conf sono le seguenti:

NameVirtualHost ip_macchina

<VirtualHost dominiovirtuale>
   ServerAdmin amministratore@macchina
   DocumentRoot /usr/local/httpd/dominiovirtuale/htdocs 
   ServerName dominio_virtuale
   ErrorLog log/dominiovirtuale.error.log
   CustomLog log/dominiovirtuale.custom.log
</VirtualHost>

Se l'indirizzo della macchina è 127.0.0.1 ed il suo nome è localhost, il file /etc/hosts si presenterà circa così:

127.0.0.1       localhost

Si dovrà semplicemente aggiungere un'altra riga relativa al dominio virtuale:

127.0.0.1       localhost
127.0.0.1       dominiovirtuale

Potrebbe essere necessario permettere l'accesso alla directory contenente i file del dominio virtuale. In tal caso si dovrà modificare il file access.conf che generalmente è presente nella directory /etc/apache/ o in /etc/. La modifica consisterà nell'aggiunta delle seguenti righe al file:

<Directory /usr/local/httpd/dominiovirtuale/htdocs>
  Options Indexes SymLinksIfOwnerMatch
  AllowOverride None
  order deny,allow
  allow from all
</Directory>

Per rendere effettive tutte le modifiche apportate, sarà necessario rilanciare il demone apache con:

apache restart[Invio](2)

645.1.2)   Come si può controllare il traffico giornaliero del sistema?

Per poter visualizzare il traffico giornaliero dei servizi HTTP, SMTP, POP3, si potrà utilizzare il seguente script: (3) 2.2.x, con le opzioni CONFIG_FIREWALL e CONFIG_IP_FIREWALL abilitate.

#!/bin/sh
# Flusho i rules
ipchains -F
# Cancello i vari chain
ipchains -X HTTP
ipchains -X IMAP
ipchains -X POP3
ipchains -X SMTP-OUT
ipchains -X SMTP-IN
#creo i vari chain
ipchains -N HTTP
ipchains -N IMAP
ipchains -N POP3
ipchains -N SMTP-OUT
ipchains -N SMTP-IN
#ridirigo il traffico verso i chain creati
ipchains -I output -j HTTP --source-port 80 -p tcp
ipchains -I output -j IMAP --source-port 143 -p tcp
ipchains -I output -j POP3 --source-port 110 -p tcp
ipchains -I output -j SMTP-OUT --source-port 25 -p tcp
ipchains -I input -j SMTP-IN --destination-port 25 -p tcp

Dopo averlo lanciato, con i privilegi dell'utente root, per visualizzare il traffico giornaliero si dovrà impartire il comando:

ipchains -L -n -v[Invio]

Ecco l'output di una condizione neutra:

Chain input (policy ACCEPT: 23 packets, 6746 bytes):
 pkts bytes target     prot opt    tosa tosx  ifname     mark       
    0     0 SMTP-IN    tcp  ------ 0xFF 0x00  *                     
Chain forward (policy ACCEPT: 0 packets, 0 bytes):
Chain output (policy ACCEPT: 23 packets, 6746 bytes):
 pkts bytes target     prot opt    tosa tosx  ifname     mark       
    0     0 SMTP-OUT   tcp  ------ 0xFF 0x00  *                     
    0     0 POP3       tcp  ------ 0xFF 0x00  *                     
    0     0 IMAP       tcp  ------ 0xFF 0x00  *                     
    0     0 HTTP       tcp  ------ 0xFF 0x00  *                     
Chain HTTP (1 references):
Chain IMAP (1 references):
Chain POP3 (1 references):
Chain SMTP-OUT (1 references):
Chain SMTP-IN (1 references):

outsize  source                destination           ports
         0.0.0.0/0            0.0.0.0/0             * ->   25


outsize  source                destination           ports
         0.0.0.0/0            0.0.0.0/0             25 ->   *
         0.0.0.0/0            0.0.0.0/0             110 ->   *
         0.0.0.0/0            0.0.0.0/0             143 ->   *
         0.0.0.0/0            0.0.0.0/0             80 ->   *

645.1.3)   Come si abilita il masquerading in una rete locale?

Qualora si voglia mascherare dietro un firewall le macchine di una rete 192.168.1.0, si dovrà innanzitutto ricompilare il kernel con le seguenti opzioni abilitate:(4)

Network Firewalls
IP: firewalling
IP: always defragment
IP: transparent proxy supp
IP: Masquerading
IP: ICMP masquerading

Dopo aver caricato la nuova immagine del kernel, si dovrà lanciare questo script (e eventualmente provvedere ad automatizzarne l'esecuzione):

#/bin/sh
echo "1" > /proc/sys/net/ipv4/ip_forward
ipchains -M -S 7200 10 160
ipchains -P forward DENY
ipchains -A forward -s 192.168.1.0/24 -j MASQ

645.1.4)   Come si predispone un firewall?

Per impostare un firewall, occorre che la macchina sia dotata di due schede di rete (una che sia collegata con la rete interna e una con la rete esterna. Quest'ultima scheda di rete può anche consistere in un modem). Si deve innanzitutto attivare l'instradamento della rete interna:

route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0[Invio]

Deve essere ora definito l'instradamento predefinito attraverso il router 192.168.1.254:

route add default gw 192.168.1.254 dev eth0[Invio](5)

Utilizzando un kernel di versione 2.2.x o superiori dovrà essere abilitato l'instradamento dei pacchetti attraverso il router:

echo 1 > /proc/sys/net/ipv4/ip_forward[Invio]

Utilizzando il kernel 2.2.x o superiore, l'opzione Always Defrag (un tempo #define attivabile e disattivabile in fase di compilazione), è divenuta una chiamata di sistema. Dato che questa opzione è molto importante, ed è disabilitata in maniera predefinita, è consigliabile eseguire tale comando:

echo 1 > /proc/sys/net/ipv4/ip_always_defrag[Invio]

Questa opzione si preoccupa di riassemblare i pacchetti IP entranti prima che questi possano essere elaborati dal firewall o reindirizzati altrove.

Per impostare le regole che consentono o impediscono il transito dei pacchetti si dovrà utilizzare il comando ipchains con le opzioni relative. Ammettiamo ora che si debbano costituire le seguenti regole:

Le regole sopra esposte si traducono nei seguenti comandi:

ipchains -A input --interface ! lo -s 127.0.0.0/8 -j DENY[Invio]

ipchains -A input -p icmp --icmp-type echo-request -j DENY[Invio]

ipchains -A input -s 192.168.1.0/24 -d 345.125.6.121 21 \
  \-p TCP -j ACCEPT
[Invio]

ipchains -A input -s 192.168.1.0/24 -d 345.125.6.121 20 \
  \-p TCP -j ACCEPT
[Invio]

ipchains -A input -d 345.125.6.121 80 -p TCP -j ACCEPT[Invio]

ipchains -A input -d 345.125.6.121 0:1023 -p TCP -j DENY[Invio]

645.1.5)   Perché non riesco ad uscire dalla rete locale attraverso il gateway? Ho configurato tutto con attenzione ma non ci riesco. Perché?

Se si sono seguite attentamente le regole per impostare correttamente il firewall, occorrerà modificare un parametro del file system /proc. Il file in questione è /proc/sys/net/ipv4/ip_forward. Impartendo il comando cat su questo file presumibilmente si otterrà uno zero:

cat /proc/sys/net/ipv4/ip_forward[Invio]

Per permettere il transito dei pacchetti attraverso il firewall, occorrerà impostare tale valore ad 1:

echo 1 > /proc/sys/net/ipv4/ip_forward[Invio]

Ovviamente questa operazione va ripetuta ad ogni avvio del sistema. Qualora si utilizzi una distribuzione GNU/Linux Red Hat sarà sufficiente rendere vera l'opzione «FORWARD_IPV4» presente nel file /etc/sysconfig/network.

645.2   FTP

645.2.1)   Come si può fornire agli utenti solamente l'accesso FTP al sistema ma non un accesso Telnet?

Per impedire l'accesso Telnet agli utenti si dovrà impartire il seguente comando dopo avere assunto l'identità dell'utente root:

usermod -s /bin/false nome_utente[Invio]

In questo modo l'utente non potrà più fare il login.

Allo stesso modo, si potrà impostare la shell dell'utente cui si vuole negare l'accesso Telnet mediante la modifica del file /etc/passwd sostituendo la shell con /bin/false.

645.2.2)   Come si può impedire l'accesso tramite FTP ad alcuni utenti?

Nel file /etc/ftpusers sono elencati gli utenti che non possono accedere al servizio FTP.

645.2.3)   Dopo essersi connessi ad un sistema remoto, come si fa a mantenere attivo un comando FTP una volta disconnessi dal sistema stesso?

Dopo essersi collegati al server FTP, si potrà interrompere l'operazione che si sta effettuando mediante la combinazione di tasti [Ctrl z]. Questa combinazione provoca l'interruzione del processo. Occorre quindi riattivarlo ma sarà neccessario inviarlo sullo sfondo (background). A questo punto sarà possibile scollegarsi dal server FTP mediante il comando exit.

645.2.4)   Come si può realizzare un comando che invii ogni minuto un file via FTP?

Ecco uno script adatto a questo scopo:

#!/usr/bin/expect -f
set FTP /bin/ftp
set HOST indirizzo_server_FTP_remoto
set USER nome_utente
set PASS mia_password
set COMMAND "put /percorso_file /percorso_locale_file"
set PROMPT ftp>

spawn $FTP $HOST
send "$USER\r"
expect Password:
send "$PASS\r"
expect $PROMPT
send "$COMMAND\r"
expect $PROMPT
send "quit\r"

Occorre definire le variabili nella parte superiore dello script con i valori desiderati. Non si deve dimenticare di fornire i permessi di esecuzione allo script e di inserirlo nelle pianificazioni di lavoro ( crontab) dell'utente desiderato. Ad esempio il comando:

crontab -e tizio[Invio]

aprirà per la modifica il file di configurazione della pianificazione dei lavori dell'utente tizio. Ammettendo che lo script di nome invia_file sia stato copiato nella directory /bin/, la riga da inserire sarà

 */1 * * * *   /bin/invia_file 1> /dev/null 2> /tmp/errori

645.2.5)   Come si concede il permesso di caricare file durante una sessione FTP?

Per permettere ad un utente di poter caricare (upload) un file in una directory del server FTP, si deve creare una directory con il permesso di scrittura abilitato. Occorre inoltre ricordare che il proprietario di tale directory deve essere ftp.

645.2.6)   Descrizione di uno script che permette di automatizzare diverse operazioni FTP.

Automatizzare comandi FTP risulta possibile mediante script. Se ad esempio si volessero automatizzare questi comandi:

  1. scaricare nella directory da cui lo script viene lanciato tutti i file contenuti in una directory remota;

  2. copiare questi file in una directory remota di un altro server FTP.

si dovrà utilizzare uno script simile al seguente:

#!/bin/bash
ftp -ni ftp.server.com << __EOA__
user login password
cd /directory/origine/
mget *
bye
__EOA__

ftp -ni ftp.server2.com << __EOB__
user login2 password2
cd /directory/destinazione/
mput *
bye
__EOB__

L'opzione -n evita il procedimento di auto-login(8) mentre l'opzione -i disattiva la modalità interattiva consentendo la possibilità di trasferire più file(9).

645.3   Telnet

645.3.1)   Come si può visualizzare cosa digita un utente collegato in Telnet?

Per vedere cosa digita un utente in una shell Bash, bisogna innanzitutto individuare il PID della shell Bash; a questo punto è possibile impartire questo comando:

strace -p numero_pid -etrace=read[Invio](10)

L'output può risultare inizialmente caotico. Se nella shell che si sta analizzando è stato digitato il comando ls, strace restituirà quanto segue:

read(0, "l", 1)                      =1
read(0, "s", 1)                      =1
read(0, "\r", 1)                     =1
--- SIGCHLD (Child exited) ---

645.3.2)   Si può permettere l'accesso Telnet al proprio sistema anche mediante un'altra porta?

Per far sì che il demone telnetd resti in ascolto su un'altra porta mantenendo attiva anche quella predefinita, si devono operare alcune modifiche. Telnet viene predisposto attraverso la combinazione di 2 file: /etc/inetd.conf e /etc/services.

Per il Telnet sulla porta 23, che è la porta predefinita, si riscontreranno queste impostazioni nel file services:

telnet      23/tcp

e queste altre nel file inetd.conf:

telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  in.telnetd

Sarà quindi necessario modificare esclusivamente il file services aggiungendo:

telnet  8888/tcp

se si desidera che telnetd accetti le richieste di Telnet sulla porta 8888.

A questo punto occorrerà riavviare il demone inetd per costringerlo a rileggere i file di configurazione.

killall -HUP inetd[Invio]

Si potrà ora digitare sul client:

telnet indirizzo 8888[Invio]

645.3.3)   Si può accedere ad una macchina solo da un terminale remoto?

Anche se sarebbe consigliato mantenere almeno una possibilità di accedere localmente al sistema in oggetto, per ottenere un accesso esclusivamente in remoto al sistema si dovrà modificare il file /etc/inittab commentando (apponendo un # all'inizio delle righe) le righe:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

645.3.4)   Ci si può collegare attraverso Telnet a una macchina remota accedendo come utente root?

Se si è ben coscienti di ciò che si sta facendo e dei rischi che si corrono, si deve rimuovere il file /etc/securetty. Se non si ha una reale necessità di questa operazione, conviene creare un utente ed accedere al sistema da quello acquisendo i privilegi dell'utente root con:

su -[Invio]

645.3.5)   C'è un'alternativa più sicura a Telnet?

In una grande percentuale di casi, non si utilizza più Telnet ma SSH (Secure Shell). Se si deve fornire la possibilità di accesso, andrà installato il demone sshd sulla macchina server. Per accedere invece da remoto ad un server SSH, si dovrà installare il client SSH. Per collegarsi in SSH al server server_remoto si dovrà impartire il seguente comando:

ssh -l utente server_remoto[Invio]

Il pacchetto SSH di una distribuzione Debian GNU/Linux si trova nella sezione non-US (nei CD-ROM o presso gli appositi server come ad esempio <ftp://ftp.non-us.debian.org/debian/dists/stable/>).

Si ricorda che esiste anche un client per MS-Windows, chiamato putty reperibile presso <http://www.chiark.greenend.org.uk/~sgtatham/putty/>.

645.3.6)   Perché alcuni servizi di rete (Telnet, FTP, ecc.) sono molto lenti?

Qualora all'interno di una rete casalinga, i servizi di rete (Telnet, FTP, ecc.) risultino lenti, si può provare ad inserire nel file /etc/hosts della macchina da cui ci si collega, una riga indicante l'IP ed il nome della macchina cui ci si vuole collegare. Ad esempio:

192.168.1.1             server_rete

In genere il rallentamento di questi servizi avvengono perché il server cui ci si collega tenta per un po' di autentificare la macchina richiedente.

645.3.7)   Si possono automatizzare dei comandi da eseguire su un sistema remoto cui si abbia accesso attraverso Telnet?

Il seguente script apre una sessione Telnet, esegue dei comandi associati allo script stesso e infine e chiude la sessione:

#!/usr/bin/expect
# 
# $argv contiene tutti i parametri passati allo script
set cmd $argv

# send_human occorre per l'opzione -h (human) di send
set send_human {.1 3 1 .05 2}

# Inizio del processo di connessione batch.
spawn telnet localhost 23
expect "ogin: "
send "bigpaul\r"
expect "assword: "
send -h "parola_chiave\r"
expect "bigpaul"
send -h "$cmd\r"
expect "bigpaul"
send -h "exit\r"

Si noti la presenza dell'opzione -h di send: essa, a causa del buffer di lettura di login, fa in modo che l'invio dei caratteri avvenga a velocità umana, secondo quanto impostato nella variabile send_human. A volte si utilizza direttamente l'opzione -s (send slow).

Per maggiori informazioni sulle opzioni di send, si dovrà consultare la relativa pagina di manuale expect(1).

Un altro esempio di script, che in questo caso utilizza un ciclo while è il seguente:

#!/usr/bin/expect  
#
# Preleva 3 messaggi di posta via POP3

set num_msg 1
set n 3

spawn telnet mail.commedia.it 110 
expect "+OK" 
send "USER bigpaul\r"   
expect "welcome" 
send "PASS parola_chiave\r"
expect "+OK" 
send "STAT\r"
expect "+OK" 
while {$num_msg <= $n}  {
        send "RETR $num_msg\r"  
        expect "+OK"
        puts "\rScaricato messaggio numero $num_msg\r"
        set num_msg [ expr $num_msg + 1 ]
        }       
send "QUIT\r"

645.3.8)   Come funziona la registrazione degli accessi avvenuti tramite Telnet alle macchine?

Se si esegue una connessione Telnet ad una macchina, ed è attivo il demone syslog essa viene registrata nel file /var/log/daemon.log con una riga simile alla seguente:

Oct  6 19:23:51 irish in.telnetd[221]: connect from irish

La registrazione avviene perché nel file /etc/syslog.conf esiste una riga che determina la registrazione di tutti gli eventi dei demoni del sistema nel file /var/log/daemon.log:

daemon.*                        -/var/log/daemon.log

645.3.9)   Come si impedisce l'accesso al sistema tramite Telnet?

Per evitare gli accessi al sistema occorre modificare i file /etc/hosts.allow e /etc/hosts.deny. Di questi due file viene letto prima il primo e poi il secondo. La politica predefinita consiste nel negare qualsiasi accesso:

ALL: ALL

in /etc/host.deny. I nodi autorizzati sono indicati invece nel file /etc/host.allow:

ALL: LOCAL @some_netgroup
ALL: .foobar.edu EXCEPT terminalserver.foobar.edu

La prima regola concede l'accesso ai nodi del dominio locale e ai membri della rete some_netgroup. La seconda regola permette l'accesso da parte di tutti i nodi del dominio foobar_edu tranne che per il dominio terminalserver_foobar_edu.

645.4   SSH

645.4.1)   Come si copiano i file con SSH?

Per copiare tutti i file della directory corrente in una directory che si trova su una macchina remota accessibile via SSH si deve impartire il comando:

scp * utente@server:/ directory/destinazione/[Invio](11)

645.4.2)   Come si copiano intere porzioni di file system (directory) con SSH?

Per copiare una directory e le eventuali directory in essa contenute si deve utilizzare il comando scp:

scp -r directory utente@server:/ directory/destinazione/[Invio](12)

Per copiare ad esempio la directory /home/utente/prova all'interno della directory /tmp/ della macchina fulmine1 si da il comando:

scp -r /home/utente/prova/ tizio@fulmine1:/tmp/ [Invio]

dove «tizio» è il nome dell'utente della macchina fulmine1.

645.5   CVS: Concurrent Version System

645.5.1)   Cosa è e a cosa serve il CVS?

Il CVS (Concurrent Version System) è un sistema che serve a tener traccia delle versioni di uno o più file. Il CVS permette di poter lavorare in gruppo su un unico progetto evitando di sovrascrivere il lavoro degli altri ed evitando di creare conflitti. È possibile inoltre tener traccia delle modifiche di un file al fine di recuperare vecchie versioni o allo scopo di visualizzarne l'evoluzione nel corso del tempo. Tramite questo sistema è anche possibile dividere le strade di un progetto per poterle eventualmente un giorno ricongiungerle.

645.5.2)   Su cosa si basa il funzionamento del CVS?

Il CVS si basa su un repository (una porzione di file system su un server) sui cui i client invocano dei comandi. Il repository non è altro che un deposito comune del progetto da cui si prelevano i dati aggiornati e cui si inviano le modifiche.

La macchina server può avere uno o più repository. Se infatti ci sono più progetti ogni progetto avrà  il suo repository. Non si lavora direttamente sui file di un repository: si deve creare una copia locale sulla nostra macchina dei file del nostro progetto. Una volta fatta questa operazione in buona sostanza le operazioni che andranno effettuate saranno:

Nelle sezioni seguenti vedremo come questo non sia sempre così immediato.

645.5.3)   Come specificare dove risiede il repository: il metodo pserver ed il metodo ext.

Ogni volta che lavoriamo con il CVS, dobbiamo dichiarare dove risiede il repository, chi è l'utente che utilizziamo, e la metodica di accesso. Per quanto rigarda quest'ultima, si deve ricordare che esiste il metodo pserver ed il metodo ext. L'amministratore del sistema dove risiede il repository o in genere il responsabile del progetto cui si partecipa indicherà  la metodica da utilizzare.

Il metodo pserver utilizza la seguente sintassi:

cvs -d :pserver:nomeutente@uri.server.cvs:/percorso/repository comando

In pratica l'opzione -d serve ad indicare dove risiede il repository. In questo caso risiede sulla macchina (su cui si ha un'utenza nomeutente) uri.server.cvs nella directory /percorso/repository. La prima volta (e solamente in quella occasione), prima di dare i comandi CVS classici, si dovrà  dare effettuare il login:

bigpaul@monique:[~] \
  \cvs -d :pserver:nomeutente@uri.server.cvs:/percorso/repository login
[Invio]

Questo comando provocherà  la richiesta della password dell'utenza nomeutente sulla macchina uri.server.cvs. Questa operazione (login) andrà  effettuata una sola volta dal momento che la password verrà  memorizzata nel file ~/.cvspass. Rimane sottinteso che il login dovrà  essere ripetuto su un'altra macchina o in caso di cancellazione del file ~/.cvspass. I comandi CVS dovranno essere sempre posti come indicato nella sintassi sopra esposta:

cvs -d :pserver:nomeutente@uri.server.cvs:/percorso/repository comando

Nel metodo ext, si utilizza rsh o ssh per connettersi. Occorrerà  infatti dichiarare la metodica utilizzata tramite il seguente comando:

bigpaul@monique:[~] \
  \CVS_RSH=ssh ; export CVS_RSH
[Invio]

I comandi saranno inviati con la stessa modalità  del metodo pserver solo che verrà indicato ext al posto di pserver:

cvs -d :ext:nomeutente@uri.server.cvs:/percorso/repository comando

645.5.4)   Ma si deve obbligatoriamente indicare ad ogni comando la posizione del repository?

Se si utilizza solamente un repository è possibile specificarne l'indirizzo all'interno della variabile CVSROOT:

bigpaul@monique:[~] \
  \export CVSROOT=":ext:bigpaul@www.linuxfaq.it:/var/cvs"
[Invio]

In tal modo invece che dare il comando:

bigpaul@monique:[~] \
  \cvs -d :ext:bigpaul@www.linuxfaq.it:/var/cvs update
[Invio]

si potrà  utilizzare:

bigpaul@monique:[~] cvs update[Invio]

645.5.5)   Come si crea un nuovo progetto?

Se si ha intenzione di iniziare un nuovo progetto e di utilizzare il CVS per gestirlo, si dovranno importare i file iniziali nel repository. Per fare questo è necessario collocarsi all'interno della directory principale della struttura da importare. A questo punto si dovrà  dare il seguente comando (dopo avere eventualmente esportato i valori della variavile CVSROOT):

bigpaul@monique:[~] \
  \cvs import -m "Creazione del progetto \
  \calcolatrice." calcolatrice jrandom start
[Invio]

Questo comando crea il progetto (repository) calcolatrice sulla macchina su cui gira il server CVS indicato nei parametri della variabile CVSROOT assegnando un messaggio iniziale a tale operazione.

Attenzione: la directory da cui è stato invocato l'import del progetto non dovrà  essere utilizzata per ulteriori modifiche. Andrà  subito creata la copia locale e su quella (e solo su quella) si dovranno effettuare le modifiche.

645.5.6)   Come si crea una copia locale?

Per poter partecipare allo sviluppo di un progetto che utilizza il CVS si deve creare una copia locale di tale progetto e si utilizza il comando checkout (o per abbreviazione co).(13):

bigpaul@monique:[~] cvs co calcolatrice[Invio]

cvs checkout: Updating calcolatrice
U calcolatrice/calc.c
U calclatrice/leggimi
cvs checkout: Updating calcolatrice/temp
U calcolatrice/temp/calc.c.old

Questo comando creerà  una copia locale del progetto calcolatrice tramite la creazione della directory calcolatrice e di una sua sottodirectory.

Attenzione: non si può usare la directory utilizzata per la fase di import come copia locale. Si deve necessariamente creare una nuova copia locale per poter lavorare.

645.5.7)   Come si aggiorna una copia locale?

Per poter ricevere gli aggiornamenti delle modifiche che gli altri utenti hanno apportato al progetto si dovrà  dare il comando update. A quel punto la copia locale sarà  una copia esatta del repository. Il comando da invocare (dopo essersi posizionati nella directory radice della copia locale) è:

bigpaul@monique:[~] cvs update[Invio]

Questo comando produrrà qualcosa di simile:

cvs update: Updating .
M calc.c
cvs update: Updating temp

Questo comando, oltra ad aggiornare la copia locale informerà  l'utente che dall'ultima operazione di aggiornamento, il file calc.c è stato modificato. Questa informazione la si ricava dal fatto che è presente la M vicino al file.

645.5.8)   Perché il CVS non mi scarica le nuove directory?

Se siamo a conoscenza del fatto che è stata aggiunta al progetto una nuova directory ma che non riusciamo a ricevere tramite il comando update, dovremo ricordarci di aggiungere l'opzione -d(14):

bigpaul@monique:[~/PRJ/calcolatrice/] cvs update -d[Invio]

645.5.9)   Come si ottiene un rapporto delle differenze tra la copia locale ed il repository?

Per poter visualizzare le differenze intercorrenti tra copia locale e repository si utilizza il comando diff:

bigpaul@monique:[~] cvs diff[Invio]

Questo comando produrrà  qualcosa di simile:

cvs diff: Diffing .
Index: calc.c
==============================================
RCS file: /var/cvs/calcolatrice/calc.c,v
retrieving revision 1.1.1.1
diff -r1.1.1.1 calc.c
2a3
> printf ("Calculate\n");
cvs diff: Diffing temp

645.5.10)   Come si inviano le modifiche effettuate ad una copia locale?

Per poter inviare le modifiche effettuate alla propria copia locale, si dovrà  utilizzare il comando commit (o per abbreviazione ci):

bigpaul@monique:[~] cvs commit -m "aggiunta la radice \
  \quadrata ed i logaritmi" calc.c
[Invio]

Checking in calc.c;
/var/cvs/calcolatrice/calc.c,v <-- calc.c
new revision: 1.2; previous revision: 1.1
done

Tramite questo comando verrà  aggiornato il repository del progetto. La versione 1.2 sarà  infatti la più recente e tutti gli altri utenti dovranno aggiornare le rispettive copie locali.

645.5.11)   Cosa succede se due utenti modificano una stessa parte di codice?

Ammettiamo che un file (esempio.txt) di un progetto sia il seguente:

prima riga
seconda riga
terza riga

L'utente tizio e l'utente caio hanno entrambi una copia locale aggiornata. L'utente tizio decide di aggiornare il file modificandolo come segue:

prima riga
TEST, TEST
terza riga

L'utente tizio invia le modifiche (cvs commit). L'utente caio, ignaro del lavoro svolto da tizio, apporta invece queste modifiche:

prima riga
PROVA - PROVA
terza riga

All'atto del commit l'utente caio riceve una segnalazione di errore di conflitto per cui impartisce il comando di aggiornameto della propria copia locale:

bigpaul@monique:[~] cvs update[Invio]

Il comando genererà  un messaggio simile al seguente:

RCS file: /var/cvs/prova/esempio.txt,v
retrieving revision 1.12
retrieving revision 1.13
Merging differences between 1.12 and 1.13 into esempio.txt
rcsmerge: warning: conflicts during merge
cvs update: conflicts found in esempio.txt
C esempio.txt

Il file esempio.txt assomiglierà  a quanto segue:

prima riga
<<<<<<<< esempio.txt
PROVA - PROVA
=======
TEST, TEST
>>>>>>> 1.13
terza riga

L'utente caio si troverà  a dover scegliere quali delle due porzioni di codice mantenere (o magari integrandole), per poi effettuare nuovamente il commit, risolvendo così il conflitto e creando la versione 1.14 del file:

bigpaul@monique:[~] cvs commit -m "Versione aggiornata del \
  \file esempio.txt" esempio.txt
[Invio]

645.5.12)   Come si cancella un file con il CVS?

Per poter cancellare un file da un progetto, si dovrà  utilizzare il comando commit del CVS . Innanzitutto però, il file andrà  rimosso in maniera convenzionale dalla directory di lavoro:

bigpaul@monique:[~/PRJ/calcolatrice] rm calc.c.old[Invio]

A questo punto pero' il file esiste ancora nel repository per cui si darà  il seguente comando:

bigpaul@monique:[~/PRJ/calcolatrice] cvs remove calc.c.old[Invio]

Il comando genererà  il seguente risultato:

cvs remove: scheduling 'calc.c.old' for removal
cvs remove: use 'cvs commit' to remove this file permanently

A questo punto si dovrà  effettuare un commit:

bigpaul@monique:[~/PRJ/calcolatrice] cvs ci -m "rimuovo il \
  \file calc.c.old perché inutilizzato"
[Invio]

Ecco il risultato:

Removing calc.c.old;
/var/cvs/calcolatrice/calc.c.old,v  <-  calc.c.old
new revision: delete; previous revision: 1.8
done

A questo punto il file sarà  stato rimosso dal repository e al prossimo aggiornamento gli altri utenti ne riceveranno notizia.

645.5.13)   Come si cancella una directory con il CVS?

La cancellazione delle directory con il CVS è un po' particolare. Innanzitutto si dovranno cancellare tutti i file presenti nella directory in questione:

bigpaul@monique:[~/PRJ/calcolatrice/directory_da_cancellare] \
  \rm *
[Invio](15)

A questo punto dalla directory precedente a quella che si vuole cancellare si darà  il comando:

bigpaul@monique:[~/PRJ/calcolatrice] cvs update -P[Invio]

L'opzione -p (prune) serve a ripulire la directory di lavoro dalle directory vuote.

645.5.14)   Come si ripristina una versione precedente di un file con il CVS?

Per ripristinare una versione precedente di un file ci sono vari metodi. Il più semplice consiste nell'utilizzo dell'opzione -j(16). Questa opzione si utilizza davanti le due versioni del file (quella attuale e quella da modificare).

Attenzione: il comando di seguito elencato funziona tramite l'applicazione di patch (17). Risulta quindi molto importante l'ordine dei due file.

bigpaul@monique:[~/PRJ/calcolatrice/] \
  \cvs update -j 1.9 -j 1.6 calc.c
[Invio]

RCS file: /var/cvs/calcolatrice/calc.c.,v
retrieving revision 1.9
retrieving revision 1.6
Merging differences between 1.9 and 1.3

A questo punto si dovrà  fare l'aggiornamento della copia locale. La cosa potrà  sembrare strana ma in realtà , dopo il comando sopra esposto, il file presente nella nostra directory di lavoro contiene già  la "vecchia versione" e infatti al comando:

bigpaul@monique:[~/PRJ/calcolatrice] cvs update[Invio]

Restituirà :

cvs update: Updating .
M calc.c

indicando che il file è stato modificato.(18) È quindi ora di inviare queste (in realtà  false) modifiche al repository:

bigpaul@monique:[~/PRJ/calcolatrice] \
  \cvs ci -m "la nuova funzione è sbagliata. \
  \Ripartiamo dai contenuti della versione 1.6"
[Invio]

Checking in calc.c;
/var/cvs/calcolatrice/calc.c.,v  <--  calc.c
new revision: 1.10; previous revision: 1.9
done

Naturalmente la versione del file con i contenuti della versione 1.6 sarà  la 1.10.

645.5.15)   Come si ripristina la versione precedente di tutti i ifile di un determinato progetto?

È possibile ripristinare una versione precedente di un intero progetto. Questa evenienza può rendersi necessaria allorché un determinato sviluppo abbia portato ad un vicolo cieco, insomma alla necessità  di ripartire da un determinato punto. Qualsiasi modifica vorrebbe dire perdere inevitabilmente tempo. Eventualmente potrebbe anche servire una versione funzionante di un programma che si sta sviluppando mentre il CVS sta gestendo gli ultimi aggiornamenti che rendono la versione inutilizzabile. Ecco allora che è utilie la funzione di istantanea (snapshot). Questa funzione permette di accedere ai contenuti di un progetto di una determinata data oppure precedentemente contrassegnati da un marcatore (tag).

Per ripristinare nella copia locale lo stato del progetto ad esempio del 19 settembre 2003, si dovrà  impartire il seguente comando:

bigpaul@monique:[~/PRJ/calcolatrice/] \
  \cvs -q update -Q "2003-09-19"
[Invio]

esso restituirà :

U calc.c

Attenzione: indicando semplicemente la data e non l'ora, si fa riferimento all'ora 00:00 del giorno indicato per cui ci si riferisce all'inizio del giorno. Se si vogliono ripristinare anche le versioni dei file modificati durante il giorno indicato occorrerà  indicare anche l'ora:

bigpaul@monique:[~/PRJ/calcolatrice] \
  \cvs -q update -Q "2003-09-19 23:59:59 GMT"
(19)[Invio]

Per quanto riguarda il ripristino di una versione del progetto precedentemente marcata con:

bigpaul@monique:[~/PRJ/calcolatrice] \
  \cvs -q tag Versione_Funzionante_19_09_2003
[Invio]

che restituirà :

T calc.c

si dovrà  invocare il comando:

bigpaul@monique:[~/PRJ/calcolatrice] cvs update -r \
  \Versione_Funzionante_19_09_2003
(20)[Invio]

Attenzione: la modifica di versioni ripristinate (da date o marcatori) e il successivo invio (commit) genererà  errore. Il CVS interpreta questa azione come una modifica di una versione nel passato. Occorre rimuovere il riferimento temporale della copia di lavoro. Occorre rimuovere la caratteristica di appiccicosità  della data o del marcatore (sticky properties).

bigpaul@monique:[~/PRJ/calcolatrice] cvs -q update -A[Invio]

A questo punto è possibile inviare le modifiche che assumeranno l'ultimo numero di versione non contenendo nessun riferimento al passato.

645.5.16)   Come si crea un ramo di sviluppo branch?

È possibile creare un ramo di sviluppo parallelo di un progetto. Questa necessità  si ha quando ad esempio si vuole risolvere un malfunzionamento partendo da una versione passata ma lasciando nel repository i file di versione più recente. Per far questo si può aggiornare la copia locale con i contenuti di una versione passata:

bigpaul@monique:[~/PRJ/calcolatrice/] cvs update -r Versione_Funzionante_19_09_2003[Invio]

o meglio creare una nuova directory di lavoro:

bigpaul@monique:[~/PRJ/calcolatrice/]  cvs -q checkout -d ramo_parallelo -r Versione_Funzionante_19_09_2003 [Invio]

esso restituirà :

U ramo_parallelo/calc.c

A questo punto si dovrà  marcare come branch:

bigpaul@monique:[~/PRJ/calcolatrice/] cd ramo_parallelo[Invio]

bigpaul@monique:[~/PRJ/calcolatrice/ramo_parallelo/] \
  \cvs -q tag -b Versione_del_19_09_2003_da correggere
[Invio]

esso restituirà :

T calc.c

Dopo aver modificato il sorgente ed aver inviato (commit) gli aggiornamenti arriverà  il momento di volere fondere (merge) il lavoro svolto con il ramo principale. Si dovrà  eleminare i riferimenti temporali e di versione (rimuovere le sticky properties) e applicare le differenze al ramo principale. Si darà  infatti inizialmente il comando:

bigpaul@monique:[~/PRJ/calcolatrice/ramo_parallelo/] \
  \cvs -q update -d -A
[Invio]

e poi:

bigpaul@monique:[~/PRJ/calcolatrice/ramo_parallelo/] \
  \cvs -q diff -c -r Versione_del_19_09_2003_da correggere
[Invio]

visualizzate le differenze le si applicheranno con l'aggiornamento (update):

bigpaul@monique:[~/PRJ/calcolatrice/ramo_parallelo/] \
  \cvs -q update -d -j Versione_del_19_09_2003_da correggere
[Invio]

per poi inviarle(21) definitivamente:

bigpaul@monique:[~/PRJ/calcolatrice/ramo_parallelo/] \
  \cvs -q ci -m "fusione del ramo parallelo sul \
  \troncone principale"
[Invio]

Con la risoluzione degli eventuali conflitti occorsi, si pone termine all'operazione di fusione di un ramo parallelo di sviluppo sul troncone principale di sviluppo.

645.5.17)   Ha senso trattare un file binario con il CVS?

Può sembrare inutile e potenzialmente dannoso utilizzare il CVS per gestire file come immagini o eseguibili. Non essendo file testuali, risulterebbe difficile poterne gestire le differenze. Ma spesso un progetto si compone anche di tali file. Per ovviare al problema si dovrà  utilizzare l'opzione -kb(22):

bigpaul@monique:[~/PRJ/calcolatrice/] cvs add -kb calc.jpg[Invio]

645.6   La condivisione delle risorse in rete

645.6.1)   Perché non riesco a montare i file system delle macchine di una rete locale?

Qualora venga visualizzato un messaggio di errore simile a mount: RPC: Program not registerd e risulti impossibile condividere le directory all'interno della propria rete, occorre assicurarsi che /sbin/rpc.portmap, /usr/sbin/rpc.mountd e /usr/sbin/rpc.nfsd vengano avviati all'avvio del sistema(23).

Qualora i suddetti script non siano stati avviati automaticamente si tenti di avviarli manualmente riprovando le operazioni di condivisione. Si deve ricordare infine che le directory da condividere vanno definite in /etc/exports. exports(5)

645.6.2)   Come si fa ad utilizzare un'applicazione grafica (che giri sotto il server X) presente su una macchina della rete cui è collegata la propria macchina?

Se macchina_a è la macchina su cui si sta lavorando e macchina_b è la macchina cui ci si collega e che contiene l'applicazione che vogliamo visualizzare sulla macchina_a si deve precedere nel modo seguente. Innanzitutto su macchina_a si deve concedere l'autorizzazione alle richieste del client di macchina_b:

macchina_a:~$ xhost +macchina_b[Invio]

Fatto ciò, dalla macchina_a occorre collegarsi in telnet alla macchina_b:

macchina_a:~$ telnet macchina_b[Invio]

Dopo avere effettuato il login, occorrerà dare il comando:

macchina_b:~$ export DISPLAY=macchina_a:0[Invio](24)

Oppure:

macchina_b:~$ setenv DISPLAY macchina_a:0[Invio](25)

Ciò serve ad esportare la variabile DISPLAY verso l'elaboratore macchina_a.

A questo punto lanciando l'applicazione grafica dalla macchina_b, la si vedrà sul monitor della macchina_a.

645.6.3)   Come si può utilizzare il display di un utente su quello di un altro?

Se lavorando all'interno di un ambiente grafico (X), si volesse mediante un terminale grafico assumere l'identità di un altro utente e lanciare dal terminale stesso un'applicazione grafica, verrà restituito un errore del tipo:

Xlib: connection to ":0.0" refused by server
Xlib: Invalid MIT-MAGIC-COOKIE-1 key
Application initialization failed: couldn't connect to display ":0.0"
Error in startup script: invalid command name "command"
    while executing
...

Per potere quindi essere in grado di lanciare applicazioni grafiche in qualità di altro utente, si dovrà dare il comando:

xhost +localhost[Invio](26)

In seguito, dopo avere assunto l'identità dell'utente desiderato, si dovrà impartire il comando:

export DISPLAY=localhost:0.0[Invio](27)

oppure:

setenv DISPLAY localhost:0.0[Invio](28)

allo scopo di reindirizzare il display del'utente di cui si è assunta l'identità verso il server grafico dell'utente originario. Questo procedimento è identico a quello descritto nella LDR 645.6.2 solo che in quel caso si trattava di due macchine collegate e non di due utenti sulla stessa macchina.

645.6.4)   Come si copiano i file tra le macchine di una rete locale?

Per copiare i file da una macchina all'altra in rete si possono utilizzare i comandi r. Questi comandi permettono di utilizzare shell e comandi in remoto.

Occorre creare nella directory principale (/) delle due macchine (o nella directory $HOME dell'utente) il file .rhosts, nel quale dovranno essere elencati i sistemi al quale si permette l'accesso e gli utenti abilitati a farlo. Se si volesse consentire l'accesso a tutti basterà impartire il seguente comando:

echo "+ +" > .rhosts[Invio]

su entrambe le macchine.

A questo sarà possibile impartire il seguente comando:

rlogin macchina_remota[Invio]

per poter accedere all'altra macchina senza richiesta di login e password. Sarà inoltre possibile copiare file da una macchina all'altra senza FTP mediante il comando rcp:

rcp macchina_remota:/percorso /* .[Invio]

Questo comando copierà tutti i file presenti nella directory remota indicata in percorso nella directory corrente.

rcp * macchina_remota:/percorso [Invio]

Questo comando copierà invece tutti i file presenti nella directory corrente nella directory remota indicata in percorso.

645.7   Terminali

645.7.1)   Come si possono simulare dei terminali sulla propria macchina?

Si possono simulare fino a 6 console virtuali attraverso la combinazione [Alt Fn] dove n è un numero che va da 1 a 6. Questi terminali virtuali sono impostati nel file /etc/inittab:

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.8 1998/05/10 10:37:50 miquels Exp $
...
...
# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
#  <id>:<runlevels>:<action>:<process>
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

Essi possono essere sia rimossi che aggiunti, eliminando o aggiungendo le righe atte a definirli.

645.7.2)   terminal type not supported

Se durante un collegamento Telnet alcuni programmi mostrano un messaggio del tipo: terminal type not supported, occorre modificare il contenuto della variabile TERM:

Sulla console remota si darà quindi il comando:

export TERM=vt100[Invio](29)

Oppure:

setenv TERM vt100[Invio](30)

Oppure:

export TERM=ansi[Invio](31)

Oppure:

$ setenv TERM ansi[Invio](32)

645.8   Server web (Apache, ecc.)

645.8.1)   Perché il mio navigatore non interpreta affatto i tag (marcatori) HTML dei file presenti nel mio server?

Qualora i file .html inseriti nell'albero delle directory del proprio server web, non vengano interpretati correttamente e vengano visualizzati come file testuali, si dovrà modificare il file /etc/mime.types. Probabilmente sarà presente una riga in cui è specificato il formato .htm. Basterà aggiungere un'altra riga identica sostituendo .htm con .html.

645.8.2)   Come vengono gestite le variabili tra due pagine PHP?

Se in un form viene definita una variabile, ad esempio prova nella pagina PHP che il form richiama, tale variabile sarà identificata apponendo $ davanti la variabile. ($prova)

645.8.3)   Come si configura il server Apache per gestire le pagine scritte in PHP?

Per configurare Apache per fare in modo che gestisca pagine PHP, è necessario far caricare ad Apache i moduli relativi a PHP. I file /etc/httpd/conf/httpd.conf(33) e /etc/httpd/conf/srm.conf(34) sono i file di configurazione che vanno modificati. A volte essi contengono le linee necessarie (di solito sono commentate: basta eliminare il carattere # presente all'inizio delle righe che devono essere «attivate».):

Per rendere effettive le modifiche, si deve riavviare Apache:

apache restart[Invio]

645.8.4)   Come si configura il server Apache per gestire le pagine scritte in ASP?

Per fare in modo che Apache utilizzi l'ASP, si devono installare e configurare le opportune librerie:

645.8.5)   Esiste un modo per convertire le pagine scritte in ASP in PHP?

Per convertire gli script ASP in PHP, si può utilizzare asp2php (<http://home.i1.net/~naken/asp2php/>).

645.8.6)   Come si fa a proteggere alcune pagine HTML da una password?

Per permettere l'accesso ad alcune pagine HTML solo a chi ha la password occorre inserire le seguenti direttive nel file /etc/apache/access.conf:(36)

<Directory /directory/da/proteggere>
AuthType Basic
AuthName Nome_della_struttura_di_appartenenza
AuthGroupFile /file/dei/gruppi
AuthUserFile /file/degli/utenti
<Limit GET POST>
require valid-user
</Limit>
</Directory> 

645.9   Samba

645.9.1)   Quale password deve essere inserita se si accede attraverso Samba da una macchina MS-Windows a una GNU/Linux?

Qualora, interrogando la rete da Risorse di Rete di MS-Windows, si tenti di accedere ad una macchina GNU/Linux ricevendo la richiesta della password, si dovranno apportare alcune modifiche. Innanzitutto, nella sezione global di smb.conf, dovrà essere inserita la seguente riga:

null passwords = yes 

Bisogna comunque tenere presenti alcuni punti importanti. Innanzitutto dalle ultime versioni di MS-Windows 95 in poi le password risultano essere criptate. A questo punto ci sono due soluzioni:

  1. Abilitare la criptazione delle password in Samba. Questo si può fare modificando il file /etc/smb.conf e utilizzando smbpasswd per creare le password per ogni utente che andranno inserite in un file che deve a sua volta essere indicato all'interno di /etc/smb.conf;

  2. modificare i registri di MS-Windows con regedit, in questo modo:

    Si può in ogni caso utilizzare anche il file Win98_PlainPassword.reg presente nel pacchetto Samba.

645.9.2)   Qual è un esempio di smb.conf ben configurato?

Il seguente file smb.conf imposta la condivisione delle directory /home/utente/, /tmp/ e /publicfiles/ e della stampante lp.

[global]
 printing = bsd
 printcap name = /etc/printcap
 log file = /var/log/samba-log.%m
 lock directory = /var/lock/samba
 share modes = yes
 workgroup = WORKGROUP

[lp]
 comment = Stampante Linux
 path = /var/spool/lpd/lp
 writable = no
 public = yes
 printable = yes
 browsable = yes

[homes]
 comment = Directory Personale
 browsable = no
 read only = no
 create mode = 0750

[tmp]
 comment = Spazio per file temporanei
 path = /tmp
 read only = no
 public = yes

[public]
 comment = Pubblicamente Accessibile
 path = /publicfiles
 public = yes
 writable = yes

645.9.3)   Come si ricevono i messaggi di WinPopUp con LinPopUp?

Per ricevere i messaggi di WinPopUp con LinPopUp, è necessario, dopo aver installato Samba e LinPopUp inserire in /etc/smb.conf nella sezione [global] le seguenti righe:

message command = /usr/bin/LinPopUp "%f" "%m" %s; rm %s

Occorre ricordarsi ovviamente di modificare opportunamente il percorso di LinPopUp.

645.9.4)   Perché non si vedono le icone delle macchine GNU/Linux in Risorse di Rete di MS-Windows?

Qualora non si vedano le icone delle macchine GNU/Linux connesse alla macchina MS-Windows in Risorse di Rete, occorre mettere la seguente riga nella sezione [global] del file /etc/smb.conf:

interfaces = <ip_interfaccia_di_rete_macchina_GNU/Linux>/24

Ad esempio:

interfaces = 192.168.1.1/24

645.9.5)   Come si copiano i file tra una macchina GNU/Linux e una MS-Windows collegate attraverso Samba?

Per poter copiare file da una macchina MS-Windows ad una GNU/Linux, è possibile accedere a quest'ultima mediante Risorse di Rete o attraverso il protocollo FTP. Per poter invece copiare file da una macchina GNU/Linux a una MS-Windows, si dovrà procedere a montare le directory condivise mediante smbmount:

smbmount //macchina_MS-Windows/directory /punto_di_montaggio [Invio]

645.9.6)   Come si fa a stampare da una macchina GNU/Linux collegata ad una rete MS-Windows tramite Samba?

Per stampare un file da una macchina GNU/Linux collegata ad una macchina MS-Windows mediante Samba, occorrerà dare un comando simile al seguente:

cat file | nome_filtro | smbclient "\\\\SERVER\\STAMPANTE" \
  \PASSWORD -U UTENTE -P -c 'print -'
[Invio]

645.9.7)   Se ci si collega da una macchina MS-Windows ad una GNU/Linux, vorrei che venisse chiesta la password solo per le directory degli utenti e non per la directory indicata in [public]. Come si fa?

Ecco un esempio di smb.conf adatto a questo scopo:

# Global parameters
        workgroup = SOFTHOR
        netBIOS name = LINUX.SOFTHOR
        server string = Linux Server
        security = SHARE
        update encrypted = Yes
        map to guest = Bad Password
        log level = 0
        printcap name = /etc/printcap
        guest account = guestpc
        hosts allow = 192.168.0. 127.
        printing = bsd

[public]
        comment = Public Directory
        path = /home/samba
        read only = No
        guest ok = Yes

[backup]
...

645.9.8)   Come si deve configurare il file smb.conf per dare un nome mediante il name server NetBIOS alla macchina Linux collegata ad una rete servita da un server DHCP?

Per ottenere questo risultato, occorre aggiungere alla sezione global di /etc/smb.conf la seguente riga:

netBIOS name = nome

dove nome è il nome della macchina NetBIOS.

645.10   PLIP

645.10.1)   Come si imposta il MTU (Max Transfer Unit ) di una connessione tramite protocollo PLIP?

Occorre definirlo al momento della dichiarazione dell'interfaccia mediante ifconfig:

ifconfig plip0 mtu 512 10.0.0.1 pointopoint 20.0.0.2 up[Invio]

645.11   Connessione al provider - ppp

645.11.1)   Esiste un programma che faciliti la connessione al provider in una distribuzione GNU/Linux Debian?

Debian GNU/Linux è una distribuzione generalmente accompagnata da pppconfig(37) che è un programma di utilità interattivo creato appunto con lo scopo di stabilire una connessione al proprio provider.

645.11.2)   Come si può verificare se nel sistema è stato installato il protocollo PPP?

Per verificare se il protocollo PPP è stato caricato nel sistema, si procede con i seguenti comandi:

cat /usr/include/linux/autoconf.h | grep PPP[Invio]

o con:

lsmod | grep ppp[Invio]

per verificare se è compilato come modulo o se è stato incluso all'interno dell'immagine del kernel.

Qualora i sopra indicati comandi non restituiscano nulla relativo al protocollo PPP, allora si dovrà procedere alla ricompilazione del kernel includendone il supporto o in modalità monolitica o in modalità modulare.

645.11.3)   Come si possono visualizzare in tempo reale i processi di connessione al provider?

Impartendo il comando ifconfig dopo avere avviato la connessione ad Internet permetterà di sapere se è stata attivata l'interfaccia di rete ppp.

Qualora infatti la connessione avesse avuto successo, con il comando ifconfig si vedrà visualizzata, oltre alla interfaccia di loopback lo (e eventualmente quella o quelle di rete, eth0 ad esempio) l'interfaccia ppp:

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:3924  Metric:1
          RX packets:112 errors:0 dropped:0 overruns:0 frame:0
          TX packets:112 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 

ppp       Link encap: 
...

Un metodo più comodo è sicuramente quello di vedere in tempo reale gli aggiornamenti del file /var/log/messages. Questo può essere fatto con:

tail -d /var/log/messages[Invio]

Potrebbe risultare utile inserire tale comando in uno script. Ad es.:

#!/bin/sh
pppd
xterm -e tail -f /var/log/messages

645.11.4)   pppd: The remote system is required to authenticate itself but...

Qualora, nel corso di un tentativo di connessione, si riscontri questo tipo di errore: «pppd: The remote system is required to authenticate itself but I couldn't find any secret (password) which would let it use an IP address.» occorrerà mettere la riga noauth nel file /etc/ppp/options, per risolvere il problema.

645.11.5)   Si possono ottenere dei dati sulla connessione ad Internet?

Per poter visualizzare alcuni dati concernenti una connessione PPP si utilizza il comando pppstat.

645.11.6)   Perché durante l'avvio di kppp ( KDE 2.x) viene visualizzato un errore relativo al timeout?

Occorre verificare i seguenti punti per risolvere il problema:

645.11.7)   Perché kppp (KDE 2.x ) non riesce a creare il file di lock?

Il file di blocco (lock) ha lo scopo di permettere un utilizzo esclusivo di una determinata risorsa. In pratica, in questo caso, serve per impedire agli altri utenti di utilizzare il modem visto che adesso è impegnato da un altro utente.

Se si vuole disabilitare questa opzione, la si deve deselezionare in kppp oppure si deve commentare(38) l'apposita riga (lock) presente nel file /etc/ppp/option .

645.11.8)   Perché lanciando da utente kppp (KDE 2.x), viene chiesta la password di root?

In genere questo accade perché il file kppp presente in /usr/bin è un collegamento simbolico al programma consolehelper che impedisce l'esecuzione diretta del programma in questione (kppp in questo caso) se non avviene l'autenticazione (mediante la password) di un determinato utente (quasi sempre root).

Per ovviare a questo problema occorre aprire il programma di modifica del menù e cambiare il nome dell'eseguibile in kppp.kdelnk da «kppp» a «/usr/sbin/kppp». Analogamente si può eliminare kppp in /usr/bin e ricrearlo facendolo puntare a /usr/sbin/kppp. Fatto questo basta impostare il bit del set user ID (in qualità di utente root) a /usr/sbin/kppp e i corretti permessi di esecuzione dello stesso file.

645.11.9)   Come può un utente qualsiasi utilizzare kppp (KDE 2.x)?

Dopo aver letto la LDR 645.11.8, e aver provato con le indicazioni in essa presenti, si dovrà modificare il file kppp presente in /etc/security/console.apps/. La riga:

USER=root

andrà modificata in:

USER=utente

In seguito occorre impostare il bit del set user ID (in qualità di utente root) del file kppp presente in /usr/bin/:

chmod u+s kppp[Invio]

645.11.10)   Come si visualizza il proprio indirizzo IP?

Per visualizzare l'indirizzo IP della propria macchina si deve utilizzare il comando ifconfig:

ifconfig[Invio]

L'indirizzo IP è il numero che segue inet addr nell'interfaccia ppp.

645.11.11)   Si può estrapolare solamente l'indirizzo IP da ifconfig?

Il comando da utilizzare è il seguente:

/sbin/ifconfig | head -9 | tail -1 | cut -d\ -f12 | cut -d\: -f2[Invio]

ma occorre accertarsi che, impartendo il comando ifconfig, l'interfaccia ppp sia la seconda in ordine di apparizione. In caso non fosse così si deve adattare questo comando alle proprie esigenze. Se infatti è presente una scheda di rete (che pone l'interfaccia ppp in «terza» posizione) al posto di «head -9» si deve mettere «head -17» e così via aggiungendo 8 per ogni dispositivo di rete che precede l'interfaccia ppp.

645.11.12)   Come si ottengono gli indirizzi DNS dei provider?

Per risalire ai DNS dei provider, si deve utilizzare il comando nslookup:

nslookup[Invio]

> server dns2.nic.it[Invio]

> set query=any[Invio]

> pluto.linux.it[Invio]

Con questi comandi si otterrà una risposta simile alla seguente:

Server:  dns.nic.it
Address:  193.205.245.5

pluto.linux.it  preference = 10, mail exchanger = keycomm.pluto.linux.it
pluto.linux.it  preference = 20, mail exchanger = r-vicenza3.keycomm.it
pluto.linux.it  preference = 30, mail exchanger = r-vicenza1.keycomm.it
pluto.linux.it  preference = 40, mail exchanger = dns.keycomm.it
pluto.linux.it  Internet address = 192.106.105.10
pluto.linux.it  text = "PLUTO Linux User Group"
pluto.linux.it  nameserver = serena.keycomm.it
pluto.linux.it  nameserver = snoopy.psy.unipd.it
pluto.linux.it  nameserver = ns.publinet.it
pluto.linux.it
        origin = serena.keycomm.it
        mail addr = dalla.pluto.linux.it
        serial = 1999110100
        refresh = 86400 (1D)
        retry   = 7200 (2H)
        expire  = 2592000 (4w2d)
        minimum ttl = 86400 (1D)
pluto.linux.it  nameserver = serena.keycomm.it
pluto.linux.it  nameserver = snoopy.psy.unipd.it
pluto.linux.it  nameserver = ns.publinet.it
keycomm.pluto.linux.it  Internet address = 194.184.117.31
r-vicenza3.keycomm.it   Internet address = 194.184.117.4
r-vicenza1.keycomm.it   Internet address = 194.184.117.2
dns.keycomm.it  Internet address = 194.184.116.2
serena.keycomm.it       Internet address = 194.184.117.3
snoopy.psy.unipd.it     Internet address = 147.162.146.17
ns.publinet.it  Internet address = 151.99.137.2

Indicando invece geocities.com:

> geocities.com[Invio]

si otterrà:

Server:  dns.nic.it
Address:  193.205.245.5

Non-authoritative answer:
geocities.com   nameserver = NS2.geocities.com
geocities.com   nameserver = NS1.YAHOO.COM
geocities.com   nameserver = NS2.DCA.YAHOO.COM
geocities.com   nameserver = NS4.geocities.com
Authoritative answers can be found from:
geocities.com   nameserver = NS2.geocities.com
geocities.com   nameserver = NS1.YAHOO.COM
geocities.com   nameserver = NS2.DCA.YAHOO.COM
geocities.com   nameserver = NS4.geocities.com
NS2.geocities.com       Internet address = 209.1.224.100
NS1.YAHOO.COM   Internet address = 204.71.200.33
NS2.DCA.YAHOO.COM       Internet address = 209.143.200.34
NS4.geocities.com       Internet address = 209.1.224.143

Lo stesso discorso vale per tiscalinet.it:

> tiscalinet.it[Invio]

che restituirà:

Server:  dns.nic.it
Address:  193.205.245.5

Non-authoritative answer:
tiscalinet.it   nameserver = ns.tiscalinet.it
tiscalinet.it   nameserver = sns.tiscali.it
tiscalinet.it
        origin = ns.tiscalinet.it
        mail addr = nsadmin.tiscali.it
        serial = 2000042802