Linux: output comandi shell su file


Indirizzare l’output dei comandi shell in un file.

Cosa potrebbe serivre questa funzionalita’? Potrebbe essere necessario monitorare uno script controllandone l’esecuzione o gli errori, oppure potrebbe essere utile per indirizzare l’output del comando in un file su cui un’altro script recuperera’ le informazioni per eseguire altre funzioni.

Vediamo ora i diversi metodi per indirizzare l’output in un file

user@linux:$ comando > nomefile.txt

Questa modalita crea all’esecuzione di ‘comando’ un file di nome ‘nomefile.txt’ con all’interno tutto quello che sarebbe stato stampato a video nella shell di esecuzione, se il file non esiste lo crea, altrimenti se gia’ esistente lo sovrascrive. Dunque il simbolo ‘>’ sta a indicare la modalita di scrittura nel file. Vediamo quali sono le opsioni che possiamo usare :

simbolodescrizione
>Scrive in nuovo file, se esiste lo sovrascrive
>>Scrive accodando alla fine del file se esiste, se non presente crea il file
2>Scrive solo gli errori standard se file esiste lo sovrascrive. L’output del comando viene mandato a video
2>>Come sopra ma accoda gli errori alla fine del file
&>Scrive sia l’output che gli errori standard sul file e non visualizza nulla sul video
&>>come sopra ma accoda alla fine del file

Un secondo metodo per reindirizzare e’ l’uso di tee. Se con il metodo precedente l’output del comando veniva reindirizzato sul file senza mostrare nulla a monitor, con tee e’ possibile indirizzare l’output nel file ed allo stesso tempo visualizzarlo sul monitor.

user@linux:$ comando | tee nomefile.txt

Nella tabella sotto sono riportati le varie versioni del comando e il loro risultato.

metododescrizione
| teemanda a schermo il risultato del comando in piu scrive sul file, se il file esiste lo sovrascrive
| tee -amanda a schermo il risultato del comando in piu scrive sul file, se il file esiste aggiunge il testo alla fine
|& teeManda a schermo sia l’output che gli errori standard in piu scrive tutto sul file , se esiste lo sovrascrive
|& tee -aManda a schermo sia l’output che gli errori standard in piu scrive tutto sul file se esiste aggiunge il testo alla fine

PHP eseguiamo comandi shell sul server

Con l’ausilio dell’ istruzione exec() e’ possibile far eseguire dei comandi o degli script nella shell del server in cui sta girando PHP. L’utente con cui verranno eseguiti i comandi o gli script sara’ chiaramente l’utente web di default cioe’ wwwdata, pertanto i permessi di esecuzione lettura e scrittura sul disco saranno giustamente limitati. Siccome il PHP e’ un linguaggio interpretato che lavora lato server e’ chiaro che tutti i comandi lanciati tramite la pagina web, eseguiranno le operazioni lato server e non lato client. vediamo un semplice esempio di come funziona il comando.

<?php
exec("ls", $output, $result);
?>

Il codice sopra non ritornera’ nulla sulla pagina eseguita! infatti i dati in uscita dal comando ‘ls’ saranno memorizzati nel array $output, mentre nella variabile $result sara’ contenuto 1 se il comando ha restituito un errore o non ha restituito nulla, 0 se il comando e’ stato eseguito correttamente.

Andiamo ora a stampare a video il risultato del comando ls:

<?php
exec("ls", $output, $result);
if(!$result){
   echo "stampo l'output di ls:<br>";
   for($i=0; $i < count($output); $i++){
       echo $output[$i]."<br>";
      }
}
?>

questo sara’ il risultato :

Possiamo vedere i due file presenti nella directory di esecuzione del comando, se volessimo sapere quali file sono presenti nella directory radice, e’ sufficiente sostituire “ls” con “ls ../../”

Conoscendo la potenza della shell e dei sui script e’ possibile fare qualsiasi cosa sul server, direttamente non puo’ creare, modificare o cancellare file ma attraverso degli appositi script e’ possibile fare molti danni, come la cancellazione di file o di intere directory!

Comandi Linux

Tabella comandi shell di linux comparati per funzione

Con le nuove distribuzioni di linux alcuni comandi sono cambiati. Nella tabella successiva verdiamo i comandi piu’ utilizzati e i loro nuovi corrispondenti

DescrizioneComando classicoComando Nuovo
Spegnimento del sistemaroot@host:~# haltroot@host:~# systemctl poweroff
Riavvio del sistemaroot@host:~# rebootroot@host:~# systemctl reboot
Disabilita interfaccia reteroot@host:~# ifconfig <eth> downroot@host:~# ip link set <eth> down
Abilita interfaccia di reteroot@host:~# ifconfig <eth> uproot@host:~# ip link set <eth> up
Visualizza info di reteroot@host:~# ifconfig <eth> root@host:~# ip address

Port forwarding con IPTABLES su linux

SCENARIO.

Analizziamo il caso in cui il client attraverso la rete internet, voglia accedere alla pagina web che risponde alla porta 8080 sul SERVER A con ip privato 192.168.0.1. Di questa pagina abbiamo una copia perfetta sul SERVER B con ip privato 192.168.0.2 che risponde sulla porta 80.

In condizioni normali, quindi, il client aprira’ il suo browser ed inserira’ nella barra degli indirizzi http://10.1.1.1:8080 corrispondente all’ip pubblico del router. La richiesta arriva al router che tramite le sue regole di nat indirizzera’ la richiesta al SERVER A il quale rispondera’ con la pagina web contenuta nel suo disco rigido.

Oggi pero’ abbiamo deciso di eseguire una manutenzione al WEB del SERVER A e chiaramente non possiamo permetterci che i CLIENT non abbia il servizio se richiesto. Non abbiamo accesso al firewall per modificare gli instradamenti e pertanto dobbiamo escogitare un trucco in modo che ad ogni richiesta della pagina WEB fatta al SERVER A sulla porta 8080, risponda il SERVER B sulla 80.

SOLUZIONE.

Sulle macchine linux ci viene in aiuto IPTABLES. IPTABLES e’ l’utility a riga di comando che ci permette di modificare le regole di firewall e di instadamento sui pacchetti che arrivano al o partono dal server.

Non faro’ qui un trattato su cosa sia un firewall e come lavori in quanto ci vorrebbero pagine e pagine di articoli ma mi limito brutalmente a dire che il firewall e’ quella parte di software che decide del destino dei pacchetti che nascono o che arrivano alla porta ethernet del server(detta veramente in modo brutale).

Vediamo ora cosa dobbiamo fare fisicamente sulla consolle della macchina SERVER A in modo che ad ogni richiesta che gli arriva sulla sua porta ethernet sulla porta 8080 giri la richiesta alla porta 80 del SERVER B.

Innanzi tutto per questo esempio ho usato due SERVER con installato DEBIAN 11, ma il concetto rimane valido per tutti i sistemi LINUX, prima operazione da fare e’ verificare che sia attiva la funzione FORWARDING del KERNEL mediante il seguente comando dal terminale.

root@SERVER_A:cat /proc/sys/net/ipv4/ip_forward

dovrebbe rispondere semplicemente con un 1. Nel caso la risposta sia 0 , sara’ necessario abilitare il forwarding e riavviare il servizio di rete con i seguenti comandi

root@SERVER_A: echo 1 > /proc/sys/net/ipv4/ip_forward
root@SERVER_A: systemctrl restart network 

per le ultime verisioni di UBUNTU e DEBIAN 

root@SERVER_A: systemctrl restart NetworkManager

Fatto questo dobbiamo inserire la regola nel firewall del SERVER_A tramite IPTABLES

root@SERVER_A: iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.2:80

Verifichiamo che la regola sia stata inserita con il seguente comando

root@SERVER_A: iptables -t nat -L --line-numbers

Rispondera con una serie di regole tra cui troverete le seguenti righe

Chain PREROUTING (policy ACCEPT)
num target  prot   opt   source      destination
1   DNAT    tcp    --    0.0.0.0/0   0.0.0.0/0  tcp dpt:80 to:192.168.0.2         

A questo punto abbiamo finito, il client richiedera’ quindi la pagina web sempre all’indirizzo:porta pubblico http://10.1.1.1:8080 il router/firewall indirizzera’ la richesta sempre al SERVER A che ora pero’ invece di rispondere con il contenuto della pagina, rimandera’ la richiesta al SERVER B sulla porta 80 il quale mandera’ il contenuto della pagina WEB al client che l’ha richiesta.

Cosa dobbiamo fare invece se volessimo cancellare la regola e ripristinare la situazione iniziale? e sufficiente inserire il seguente comando

root@SERVER_A: iptables -t nat -D PREROUTING 1
dove 1 sta' per il numero di regola(num)

Ora il SERVER A riprendera’ a rispondere direttamente alle richieste sulla porta 8080.

ESP-12 utilizzo e programmazione.

Modulo estremamente piccolo di dimensioni (2,4×1,6 cm) ma eccezionale per applicativi IOT, equipaggiato con un processore 32bit a 160Mhz e un modulo WiFI 2,4Ghz capace di trasmettere fino a 25dBm. unico ‘neo’ ha solo un ingresso analogico con tensioni in ingresso da 0 a 1 volt (0-1024). I consumi sono molto ridotti si parla di 70mA in trasmissione (con picchi di 500mA), 20mA con modulo wifi in stand-by, fino a 0,02mA in modalita’ sleep. Come tutta la famiglia ESP l’alimentazione e tutti gli ingressi/uscite, e’ a 3,3Vdc.

Utilizzo.

Non perdiamo troppo tempo con le caratteristiche, volendo le possiamo approfondire leggendo il data sheet che potete scaricare al link in fondo alla pagina, ma passiamo a vedere come utilizzare il modulo nei circuiti.

Innanzi tutto dobbiamo sapere che per far funzionare il modulo nelle varie modalita’, flashing, upload-firmware e normal use, e’ necessario fornire i giusti segnali ad alcuni piedini che sono:

  • RST reset PIN1
  • EN/CH_PD enable PIN3
  • GPIO0 ingresso 0 PIN18
  • GPIO15 ingresso 15 PIN 16

Ne caso dell’utilizzo normale (normal use) del modulo i suddetti pin dovranno essere collegati come da schema.

Caricamento firmware con IDE arduino

Per caricare i firmware utilizzando l’IDE di arduino, possiamo sfruttare un semplicissimo ed economico adattatore USB->TTL, collegando i pin come evidenziato nello schema qui sotto.

Vediamo di seguito come impostare l’ide di arduino per caricare il firmware

E’ buona norma non utilizzare l’eventuale uscita di alimentazione del convertitore USB->TTL per alimentare il modulo durante la programmazione, in quanto potrebbe non fornire abbastanza corrente per l’operazione, ma e’ preferibile fornire l’alimentazione al modulo tramite una fonte esterna, anche perche’ se il modulo non andasse in scaricamento del firmware e’ necessario disalimentare e rialimentare senza scollegare la porta USB.

Data-sheet ESP12F