PI Guide/ La Shell di GNU/Linux anche su Windows

PI Guide/ La Shell di GNU/Linux anche su Windows

Sei costretto a lavorare sugli OS di Microsoft ma senza il terminale ti senti spaesato? Nessun problema: ecco la soluzione che fa per te
Sei costretto a lavorare sugli OS di Microsoft ma senza il terminale ti senti spaesato? Nessun problema: ecco la soluzione che fa per te

A tutti gli utenti GNU/Linux capita di avere a che fare con PC equipaggiati con Microsoft Windows. Al lavoro, a scuola o a casa di qualche amico ci si può trovare a dover svolgere una serie di compiti su un sistema con il quale si ha poca pratica e che, per chi è abituato alla libertà e flessibilità di GNU/Linux, risulta scomodo.

Microsoft ha ritenuto opportuno offrire uno strumento che si avvicini alla shell Bash di GNU/Linux: la PowerShell è un terminale programmabile che consente di automatizzare molte operazioni. Non è comoda quanto Bash, la sua sintassi è più lunga e macchinosa, però è progettata per essere più intuitiva. Ad esempio, l'utilissimo comando grep di Bash è realizzato nella PowerShell col nome di findstr . Similmente, il comando echo è rappresentato nella PowerShell con la dicitura Write-Host . Va detto dunque che la PowerShell permette di fare molte cose che con l'unica alternativa, gli script batch di DOS, non è possibile fare. Gli script Bash, infatti, non sono automaticamente traducibili in PowerShell, ma è possibile tradurli manualmente prestando attenzione alle differenze tra i due sistemi.

Se invece si vuole utilizzare tutta la potenza di Bash con i vari programmi per GNU/Linux, è possibile utilizzare Cygwin , una sorta di “Wine al contrario”. Cygwin contiene infatti Bash e tutti i comandi di base di un sistema GNU/Linux, oltre a un gestore dei pacchetti che permette l'installazione di molti programmi, inclusi quelli degli ambienti grafici di GNU/Linux, come KDE e GNOME. Cygwin può essere installato anche se non si dispone dei privilegi di amministrazione su Windows, ma non è possibile installarlo su pendrive in versione “portable”. Esiste però un progetto non ufficiale che ne consente l'installazione portable: è ancora in fase sperimentale, ma ci permette di portare nel taschino un terminale Bash e i tool GNU/Linux preferiti per utilizzarli, quando necessario, anche sui sistemi Windows.

Accesso alla PowerShell di Windows
Se si devono impartire soltanto un paio di comandi, si può raggiungere la PowerShell direttamente dal menu Start , nella cartella Accessori . I comandi Bash non sono perfettamente compatibili: ad esempio ls | grep "do" diventa ls | findstr "do" .

Se invece si vuole realizzare uno script, conviene rivolgersi al programma PowerShell ISE , che si trova sempre nel menu Start tra gli Accessori di Windows. È un ambiente di sviluppo che facilita la scrittura e l'uso di script PowerShell.

Da Bash a PowerShell
Come accennato, tradurre automaticamente uno script Bash in uno PowerShell non è possibile. Le differenze tra le due shell e soprattutto tra i due sistemi operativi sono tante. Per fare un esempio semplice, su GNU/Linux si può configurare qualsiasi parte del sistema semplicemente leggendo e scrivendo file di testo. In Windows è invece necessario utilizzare delle API. Un corollario è che mentre in Bash si lavora con semplici stringhe, nella PowerShell i comandi restituiscono spesso degli oggetti (ad esempio array JSON). Se si vuole tradurre uno script Bash per la PowerShell, la cosa non è comunque impossibile ma si deve procedere manualmente. Per facilitare l'operazione si può tenere sotto mano una comoda tabella di confronto dei comandi.

Cercare dispositivi nella LAN: esempio pratico
Spesso capita di avere la necessità di controllare quali dispositivi siano connessi alla nostra rete locale (la LAN). Su un sistema GNU/Linux basta realizzare questo semplice script:

mynet=192.168.1.
fping -c1 -g $mynet'0/24'

Con la PowerShell il discorso è leggermente più complicato, ma comunque risolvibile in poche righe:

$i = 0
$AddrIP = "192.168.1."
Do {
$IpHost = $AddrIP + $i
$Pingo = Get-WmiObject Win32_PingStatus -f "Address='$IpHost'"
$Pingo | Format-Table Address, StatusCode -auto; $i++
}
until ($i -eq 255)

In poche parole, si esegue un ciclo until che scorre i numeri da 0 a 255, per controllare tutti gli indirizzi IP da 192.168.1.0 a 192.168.1.255, e tali indirizzi vengono forniti all'API di Windows Win32_PingStatus .

Come inviare email con la PowerShell
Automatizzare l'invio di messaggi di posta elettronica è un'operazione che risulta utile per molti amministratori di sistema. Ad esempio ci si può far inviare ogni giorno, lanciando lo script con un pianificatore di operazioni, un elenco dei file presenti in una determinata cartella, in modo da essere sempre al corrente di eventuali cambiamenti. Questa è una operazione sorprendentemente simile tra Bash e la PowerShell. Su GNU/Linux è infatti possibile usare il comando sendmail, mentre nella PowerShell si può ricorrere a Send-MailMessage . Ad esempio, per utilizzare Gmail si può ricorrere ad uno script di questo tipo:

$From = "mittente@gmail.com"
$To = "destinatario@dominio.com"
$Cc = "altrodestinatario@dominio.com"
$Attachment = "C:\temp\file.txt"
$Subject = "Email da PowerShell"
$Body = "Ciao, questa è una email."
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject -Body $Body -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential (Get-Credential) -Attachments $Attachment

È quindi sufficiente specificare i vari parametri del messaggio e del server di posta. Naturalmente, i moderni server SMTP sicuri richiedono l'autenticazione, quindi è necessario fornire al server anche nome utente e password del proprio account Google. Questa operazione viene svolta manualmente grazie al comando Get-Credential , quindi lo script non è del tutto automatico perché richiede l'inserimento delle credenziali di posta elettronica.
Tuttavia, le credenziali possono anche essere fornite al comando Get-Credential specificando il nome con cui sono state salvate nell'elenco credenziali del sistema operativo, come indicato in questa guida. In tal modo lo script sarebbe totalmente automatico.

Installare stampanti con uno script in PowerShell
Per un amministratore di una rete locale, uno dei compiti più fastidiosi consiste nell'installazione delle stampanti su tutti i computer della rete. Su GNU/Linux il problema può essere risolto con CUPS, automatizzando l'installazione delle stampanti (locali e di rete) con il comando lpadmin ed un semplice script. Fino a qualche anno fa, l'unico modo per installare una stampante su Windows era tramite una procedura con interfaccia grafica non automatizzabile. Ma grazie alla PowerShell è possibile realizzare uno script ed eseguirlo su tutti i computer Windows della propria rete:

$PrinterIP = "192.168.1.76"
$PrinterPort = "9100"
$PrinterPortName = "IP_" + $PrinterIP
$DriverName = "KONICA MINOLTA bizhub C35P PS"
$DriverPath = "\\UNC_Path\To\My\Drivers"
$DriverInf = "\\UNC_Path\To\My\Drivers\KOBJQA__.inf"
$PrinterCaption = "Konica Minolta C35P"

$ComputerList = @(“lucaPC”, “gianni-laptop”)

Function CreatePrinterPort {
param ($PrinterIP, $PrinterPort, $PrinterPortName, $ComputerName)
$wmi = [wmiclass]”\\$ComputerName\root\cimv2:win32_tcpipPrinterPort”
$wmi.psbase.scope.options.enablePrivileges = $true
$Port = $wmi.createInstance()
$Port.name = $PrinterPortName
$Port.hostAddress = $PrinterIP
$Port.portNumber = $PrinterPort
$Port.SNMPEnabled = $false
$Port.Protocol = 1
$Port.put()
}

Function InstallPrinterDriver {
Param ($DriverName, $DriverPath, $DriverInf, $ComputerName)
$wmi = [wmiclass]”\\$ComputerName\Root\cimv2:Win32_PrinterDriver”
$wmi.psbase.scope.options.enablePrivileges = $true
$wmi.psbase.Scope.Options.Impersonation = ‘
[System.Management.ImpersonationLevel]::Impersonate
$Driver = $wmi.CreateInstance()
$Driver.Name = $DriverName
$Driver.DriverPath = $DriverPath
$Driver.InfName = $DriverInf
$wmi.AddPrinterDriver($Driver)
$wmi.Put()
}

Function CreatePrinter {
param ($PrinterCaption, $PrinterPortName, $DriverName, $ComputerName)
$wmi = ([WMIClass]”\\$ComputerName\Root\cimv2:Win32_Printer”)
$Printer = $wmi.CreateInstance()
$Printer.Caption = $PrinterCaption
$Printer.DriverName = $DriverName
$Printer.PortName = $PrinterPortName
$Printer.DeviceID = $PrinterCaption
$Printer.Put()
}

foreach ($computer in $ComputerList) {
CreatePrinterPort -PrinterIP $PrinterIP -PrinterPort $PrinterPort ‘
-PrinterPortName $PrinterPortName -ComputerName $computer
InstallPrinterDriver -DriverName $DriverName -DriverPath ‘
$DriverPath -DriverInf $DriverInf -ComputerName $computer
CreatePrinter -PrinterPortName $PrinterPortName -DriverName ‘
$DriverName -PrinterCaption $PrinterCaption -ComputerName $computer
}

Lo script è più lungo e complesso di quello che si scriverebbe su un sistema GNU/Linux, ma ha il vantaggio di permettere l'installazione su più computer: basta infatti elencare i computer su cui si vuole installare la stampante specificando il loro nome nella lista $ComputerList . Il nome di un computer è quello che lo identifica all'interno della rete locale di Windows, il nome con cui lo si vede apparire nella cartella Rete di Esplora Risorse . Lo script può essere recuperato al seguente indirizzo .

Vediamo ora come installare Cygwin
Prima di tutto occorre scaricare l'ultima versione del setup dal sito ufficiale del progetto Cygwin. Bisogna scegliere la versione a 32 o 64 bit in base a quella del sistema operativo in uso. Si può verificare l'architettura di Windows andando nella sezione Sistema del Pannello di Controllo .

La prima scelta da fare consiste nell'installare il programma per tutti gli utenti oppure solo per se stessi. Questa seconda opzione è utile se l'utente che si sta utilizzando non ha i privilegi di amministrazione.

Si deve poi scegliere un “mirror”, che fondamentalmente funziona come un repository: contiene i pacchetti installabili. Conviene scegliere quelli del GARR italiano, come il server HTTP bo.mirror.garr.it .

Al passaggio successivo della procedura guidata viene aperto il gestore dei pacchetti. Funziona come una sorta di Synaptic elementare, mostra i vari pacchetti e con un doppio clic sul nome è possibile installarli. Per esempio, si può installare l'editor nano .

Un terminale Bash su Windows
Prepariamoci ora ad avviare il terminale Bash su qualsiasi OS Microsoft.
Per accedere ai dispositivi USB da CygWin sarà necessario installare anche la libreria libusb-win32 . La si può scaricare da SourceForge .

Con libusb è possibile aggiungere filtri USB, per mostrare o nascondere alcuni dispositivi all'ambiente Cygwin (un po' come si fa con VirtualBox). Tuttavia, se non si fa nulla tutti i dispositivi sono visibili.

Terminata l'installazione, si può finalmente avviare Cygwin. La finestra che si apre è un terminale Bash, con tutti i comandi che siamo abituati ad utilizzare su GNU/Linux. Se vogliamo avere due terminali aperti contemporaneamente, basta avviare di nuovo Cygwin.

Nel terminale si possono eseguire i programmi installati tramite il gestore dei pacchetti, ad esempio nano per scrivere script. Se vogliamo installare altri programmi, basta avviare di nuovo il setup di Cygwin e arrivare al gestore dei pacchetti.

Usare Xorg in Cygwin
SSH è certamente uno strumento molto utile per un utente GNU/Linux, perché permette l'accesso ad un proprio server da qualsiasi sistema, utilizzando i programmi presenti sul server. Per accedere ad SSH da Windows si può utilizzare Putty, ma questo programma ha una limitazione: non può eseguire tunnel Xorg, per il semplice motivo che il sistema grafico Xorg non esiste in Windows. Quindi, si può accedere al proprio server, ma non si possono avviare programmi con interfaccia grafica. La soluzione consiste nell'utilizzare Cygwin installando in esso il pacchetto xinit , insieme ai pacchetti xorg-server ed ssh . Eseguita l'installazione, è possibile avviare il server grafico in Cygwin dando il comando startxwin . La finestra di Cygwin in cui è avviato tale comando non va assolutamente chiusa: bisogna invece aprirne un'altra, avviando di nuovo Cygwin dal menu Start di Windows, e in questo terminale dare il comando export DISPLAY=:0.0 . Su questo stesso terminale si può dare il comando ssh -Y utente@indirizzoIP per accedere al proprio server con la possibilità di avviare programmi dotati di interfaccia grafica, come VLC, Kdenlive o Firefox.

Link copiato negli appunti

Ti potrebbe interessare

27 03 2017
Link copiato negli appunti