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

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.

Notizie collegate
88 Commenti alla Notizia PI Guide/ La Shell di GNU/Linux anche su Windows
Ordina
  • > l'utilissimo comando grep di Bash
    ...non esiste un comando grep di bash.
    grep è un tool a riga di comando che funziona su tutte le shell, funziona anche in cmd.exe di windows nt.
    > il comando echo è rappresentato nella PowerShell con la dicitura Write-Host
    Cioè se scrivo "echo ciao" in powershell, non scrive "ciao"? Ma per favore.
    > Cygwin, una sorta di "Wine al contrario"
    Wine traduce al volo le chiamate alle api windows in chiamate alle api native del sistema sul quale wine sta girando.
    Cygwin è un ambiente NATIVO; se l'articolista non coglie la differenza, dovrebbe cambiare mestiere.
    > Putty, ma questo programma ha una limitazione: non può eseguire tunnel Xorg
    Putty: connection, ssh,x11, Enable X11 forwarding

    > il sistema grafico Xorg non esiste in Windows.
    A parte che due secondi dopo aver scritto l'ennesima inesattezza, ci si contraddice dicendo che Cygwin fornisce un server Xorg, ma per il resto...
    Xming,NX,VcXsrv e chissà quanti altri.

    Seriamente, da licenziamento quanto a incompetenza e diffusione di notizie false.
    non+autenticato
  • - Scritto da: Carlo
    > > l'utilissimo comando grep di Bash
    > ...non esiste un comando grep di bash.
    > grep è un tool a riga di comando che funziona su
    > tutte le shell, funziona anche in cmd.exe di
    > windows
    > nt.

    C:\>grep
    "grep" comando non riconsciuto.

    > > il comando echo è rappresentato nella
    > PowerShell con la dicitura
    > Write-Host
    > Cioè se scrivo "echo ciao" in powershell, non
    > scrive "ciao"? Ma per
    > favore.

    E dove lo scrive?

    > > Cygwin, una sorta di "Wine al contrario"
    > Wine traduce al volo le chiamate alle api windows
    > in chiamate alle api native del sistema sul quale
    > wine sta
    > girando.
    > Cygwin è un ambiente NATIVO; se l'articolista non
    > coglie la differenza, dovrebbe cambiare
    > mestiere.

    Qui nessuno ha bisogno dell'articolista. Sappiamo tutti che cos'e' wine e che cos'e' cygwin

    > > il sistema grafico Xorg non esiste in
    > Windows.
    > A parte che due secondi dopo aver scritto
    > l'ennesima inesattezza, ci si contraddice dicendo
    > che Cygwin fornisce un server Xorg, ma per il
    > resto...
    > Xming,NX,VcXsrv e chissà quanti altri.

    Quando si dice "non esiste in windows" si intende ovviamente "non esiste in windows out of the box"
    E' chiaro che dopo aver installato tutto quello che serve da terze parti, si ha tutto, ma a quel punto non si chiama piu' windows.

    > Seriamente, da licenziamento quanto a
    > incompetenza e diffusione di notizie
    > false.

    Ma che ti frega?
    Gli articoli mica li leggiamo.
  • - Scritto da: panda rossa
    > - Scritto da: Carlo
    > > > l'utilissimo comando grep di Bash
    > > ...non esiste un comando grep di bash.
    > > grep è un tool a riga di comando che
    > funziona
    > su
    > > tutte le shell, funziona anche in cmd.exe di
    > > windows
    > > nt.
    >
    > C:\>grep
    > "grep" comando non riconsciuto.
    http://lmgtfy.com/?q=grep+for+windows


    > > > il comando echo è rappresentato nella
    > > PowerShell con la dicitura
    > > Write-Host
    > > Cioè se scrivo "echo ciao" in powershell, non
    > > scrive "ciao"? Ma per
    > > favore.
    >
    > E dove lo scrive?

    E' nel tuo quote:
    "il comando echo è rappresentato nella PowerShell con la dicitura Write-Host"
    Vogliamo accondiscendere credendo che manchi un "anche" tra "è" ed "è rappresentato"?
    Sarebbe comunque falso, dal momento che echo e Write-Host fanno "anche" cose diverse.

    > Qui nessuno ha bisogno dell'articolista. Sappiamo
    > tutti che cos'e' wine e che cos'e'
    > cygwin

    Non lo sanno tutti.

    > Quando si dice "non esiste in windows" si intende
    > ovviamente "non esiste in windows out of the
    > box"

    Ci può stare...
    non+autenticato
  • Su Windows 10 esiste la funzionalità Windows Subsystem for Linux, un ambiente Linux completo (bash inclusa ovviamente) per eseguire i binari nativi Linux.
    https://www.ictpower.it/sistemi-operativi/windows-...
    non+autenticato
  • E a che serve a parte testing e sviluppo di qualcosa per Linux senza averlo installato?
    iRoby
    8574
  • In che senso senza averlo installato? E' installato, è un componente di Windows ma è una vera e propria distribuzione Linux, una Ubuntu in particolare
    non+autenticato
  • Beh serve anche per fare management di macchine Linux remote, o ad esempio usare grep, sed ed awk per analisi di log e gestione di script, o per qualsiasi cosa serva CygWin o simili, con la differenza che è parte del sistema operativo quindi supportato da Microsoft
    non+autenticato
  • Supportato da microsoft.... HAHAHAHAHAHAHHAAHAHA
    non+autenticato
  • È un progetto notevole e non è proprio un WINE al contrario, come dice l'articolo, infatti non esegue programmi linux nativi ma implementa un ambiente POSIX su windows con una semplice DLL e ricompila il tutto per essere windows nativo.

    L'integrazione è completa e trasparente, nel senso che per esempio puoi aprire un cmd.exe e lanciare per esempio un ssh in linea di comando, senza sbatterti col putty, oppure il perl, gnu-make e roba simile, quindi c'è molta più sostanza di quello che si pensa.

    Non è nemmeno "sperimentale" come dice l'articolo, perché l'infrastruttura è completa e funziona, solo che fa schifo perché è lasciato molto a se stesso ed è un vero peccato.

    Comunque esistono anche versioni della BASH e dei vari tools che non passano per CYGWIN, sono semplicemente un po` modificati compilati con MINGW che implementa nelle librerie tutto quello che serve per creare programmi compatibili POSIX che girano su Windows.
    non+autenticato
  • Tentativo grottesco e senza capo ne coda

    Se siete d'accordo mettente un + oppure un like come risposta al mio commento
    non+autenticato
  • Powerascella un classico esempio di more is less.
    non+autenticato
  • - Scritto da: TrollyPop
    > Powerascella un classico esempio di more is less.

    Una qualche argomentazione in proposito?
  • Shell prolissa, dipendente da un intero framework, documentazione scarsa, l'azienda produttrice è famigerata per la sua tendenza al monopolio e al lock-in, progetto senza un obiettivo e target chiaro di utenti.

    Per schiarirti le idee ti posto una discussione che ho letto qualche giorno fa:

    https://arstechnica.com/civis/viewtopic.php?t=1549...
    non+autenticato
  • - Scritto da: Zucca Vuota
    > - Scritto da: TrollyPop
    > > Powerascella un classico esempio di more is
    > less.
    >
    > Una qualche argomentazione in proposito?

    Per esempio: ottenere la data di ieri.

    bash$ date -d yesterday

    Una riga, un comando con uno switch e un parametro
    17 caratteri in tutto compresi gli spazi.


    Fammi vedere come riesci a fare altrettanto con PS.
    (sempre che tu ci riesca, beninteso)
  • (Get-Date).AddDays(-1)
    non+autenticato
  • - Scritto da: antispam
    > (Get-Date).AddDays(-1)


    Funziona!
CONTINUA A LEGGERE I COMMENTI
Successiva
(pagina 1/2 - 10 discussioni)