Sono tanti i fattori che possono influenzare negativamente la connessione ssh; dopo tutto stiamo parlando di una connessione cifrata in remoto che avviene tra due host; è sufficiente che uno dei due non sia in grado di "colloquiare" al meglio perchè la connessione fallisca; non solo; ovviamente anche tutto il percorso deve essere aperto, perchè è sufficiente che la porta di comunicazione (di default la 22) sia bloccata in uno dei dispositivi di passaggio (router) tramite firewall perchè la comunicazione non avvenga.
Il protocollo SSH è suddiviso architetturalmente in 3 differenti layers: Transport Layer Protocol, User Authentication Protocol e Connection Layer Protocol ed ovviamente perchè la connessione avvenga correttamente non ci devono essere problemi in nessuno dei 3; sono quindi molteplici i fattori da tenere in considerazione ed uno dei momenti più "critici" è lo scambio delle chiavi cifrate tra i due host, in quanto entrambi devono essere in grado di riconoscere correttamente le credenziali passate, riconoscendo opportunamente le chiavi.
In questo articolo mi soffermerò in un errore piuttosto comune, ovvero quello del broken pipe; l'errore broken pipe indica in modo molto generico che qualcosa è andato storto nella connessione a livello di network di rete; sono molteplici i fattori che possono determinarlo come ad esempio un firewall non correttamente configurato, un conflitto di indirizzi, o latenze di rete troppo alte; ovviamente, come detto prima affinchè una connessione ssh possa avvenire è necessario che tutte le condizioni di collegamento siano possibili e non siano bloccate per policy aziendali di sicurezza o altri legittimi motivi; talvolta ad esempio sono gli stessi provider che non consentono la connessione ssh, per cui in questo caso c'è ben poco da poter fare, se non provare a contattare direttamente il fornitore del servizio, confidando nella sua "clemenza" (non fatevi grosse illusioni).
Nel caso la mancata connessione ssh sia imputabile a problemi di time-out possiamo risolvere il problema inserendo nel file config della connessione ssh (~/.ssh/config o /etc/ssh/ssh_config).
TCPKeepAlive yes
ServerAliveInterval 5
Queste istruzioni aumentano la tolleranza di attesa durante il tentativo di connessione consentendo che non si verifichi il time-out.
Altre problematiche
Nel mio caso specifico, le istruzioni indicate non risolvevano il problema "broken pipe" perchè la causa era in realtà connessa alla gestione delle chiavi da parte del portafoglio di Gnome della mia distribuzione linux (Arch linux); in questo caso la soluzione è stata aggiungere al file config, l'istruzione IPQoS=throughput per risolvere il problema (guarda l'immagine)
Il mancato login potrebbe essere connesso alla mancata "comprensione" della chiave, magari perchè non generata secondo le modalità e caratteristiche attese dal server; in questo caso si potrebbe tentare una nuova generazione di chiave per fare in modo che venga riconosciuta in modo corretto.
Tutta la potenza di bash svelata con pochi e semplici articoli; questa volta prendiamo in esame come utilizzare gli array in Bash e perchè sono utili...
Bash è una shell testuale disponibile nel mondo unix-linux; il suo utilizzo, dopo pochissimo tempo diventa praticamente indispensabile, per via della sua praticità, velocità e razionalità; utilizzare una shell significa poter disporre di un metodo potente per compiere piccole e grandi operazioni di routine nell'utlizzo di un computer; l'uso di una shell è insuperabile quanto a velocità di esecuzione e leggerezza, se paragonata ad una qualuneu interfaccia grafica; inoltre, il ritorno alla linea di comando per molti sarà poi un deja-vu pieno di ricordi ed emozione.
Avevo l'esigenza di archiviare i file di log di produzione del mio impianto fotovoltaico; quello che volevo realizzare era un sistema automatico di ripartizione dei file di log in varie directory ognuna per ciascun mese e per ogni anno; in pratica volevo che una procedura automatica prendesse il file di log , ne leggesse il nome e da quello ricavasse la data e quindi venisse copiato in una struttura a albero che comprendesse anno e come directory figlie il nome del mese (in italiano); poichè desideravo automatizzare il tutto con un cronjob in esecuzione una volta alla settimana, optare per una distribuzione linux era quello che ci voleva.
Le unità nas oggigiorno sono molto diffuse e sono passate da un ambito prettamente aziendale a quello domestico in modo naturale visto il moltiplicarsi dei flussi dati verso pc, tablet telefonini presenti praticamente in ogni casa. Io possiedo un nas Synology, ma praticamente quasi tutti possiedono embedded delle versioni custom di linux che rendono possibile lo svolgimento di task come quello che descrivo in questo articolo; ovviamente è possibile fare la stessa cosa da un pc, e per come ho concepito io il tutto non è ovviamente necessario che stia acceso 24 ore su 24 ma che lo sia ovviamente quando il cron job andrà in esecuzione.
Per i lettori che non lo sanno, un cron job è una sequenza di istruzione che viene eseguito ad un orario prestabilito che può essere anche multiplo (esempio ogni 10 minuti) o ricorrente nel tempo (es. ogni settimana, ogni giorno ecc); la sua sinstassi è piuttosto intuitiva
I miei file di log sono d questo tipo 17-08-08.CSV ovvero anno-mese-giorno.CSV; l'idea di fondo è scomporre in nome del file ricavando giorno, mese e anno e creando la struttura di directory di conseguenza.
Ecco lo script
#!/bin/sh
LANG=it_IT.utf8
cd /homes/utente/dir_con_file_di_log/
for x in *.CSV; do
nomefile= basename $x .CSV
anno=`expr substr "$x" 1 2`
mese=`expr substr "$x" 4 2`
giorno=`expr substr "$x" 7 2`
annolungo=$(date -d "$anno-$mese-$giorno" +'%Y')
meselungo=$(date -d "$anno-$mese-$giorno" +'%B')
mesebreve=$(date -d "$anno-$mese-$giorno" +'%m')
mkdir -p "$annolungo"
mkdir -p "$annolungo/$mesebreve-$
mv "$x" "$annolungo/$mesebreve-$
done
Piccola annotazione: l'istruzione LANG=it_IT.utf8 è necessaria per essere sicuri che i nomi dei mesi in forma letterale siano in italiano.
Lo script è piuttosto semplice ma efficace; in sostanza un ciclo tra i file di tipo csv (i nostri file di log) si incarica di estrarre dal nome del file giorno mese e anno e creare le directory nel formato xx-nomemese con x il numero del mese (esempio 01-gennaio e poi spostrvi il relativo file di log.
Chiamiamo questo file copia_log.sh e rendiamolo eseguibile con il comando
chmod +x copia_log.sh
A questo punto è sufficiente inserirlo in un cronjob ricordando l'ordine di inserimento
Minuti | Ora | Giorno | Mese | GiornoSettimana | Comando |
---|
0 | 1 | * | * | 0 | /bin/sh /home/helloait/public_html/clean_index.sh |
In sostanza questa istruzione manda in esecuzione lo script tutte le domeniche all'una di notte.
Ci sono tanti buoni motivi per collegarsi ad un server via ssh; oltre agli indubbi benefici in termini di sicurezza, questa modalità è di fatto lo standard per connessione ai server remoti... Vediamo come realizzare un collegamento sicuro ed efficiente...