Linux: cambiare cartella corrente navigando con le frecce della tastiera

Per come è intrinsecamente sviluppato il kernel di Linux, non risulta possibile creare un’app che:
1. L’utente lancia.
2. Naviga nella cartella desiderata.
3. Esce e si trova nella cartella desiderata.

Per farlo bisogna adottare un escamotage.

Come prima cosa, consiglio di installare “nnn” (o n3), tramite sudo apt install nnn .

Dopodichè, bisogna creare o aggiungere al file ~/.bash_aliases il seguente codice:

n() {
    # Blocca un file temporaneo per memorizzare l'ultima directory
    export NNN_TMPFILE="${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.lastd"

    # Avvia nnn
    nnn "$@"

    # Legge l'ultima directory ed esegue il cd se il file esiste
    if [ -f "$NNN_TMPFILE" ]; then
        . "$NNN_TMPFILE"
        rm -f "$NNN_TMPFILE"
    fi
}

Per farlo è sufficiente un nano ~/.bash_aliases è incollare il codice sopra, quindi, riavviare il terminale.

Dopodiché, con n parte il programma, con le frecce ci si sposta e con q si esce nella cartella scelta!

Il programma nnn è un file manager minimale e atipico, con ? si ottiene la guida agli altri comandi disponibili, a voi la scelta se usarli o meno.

Eseguire un bat che si “auto-invoca” per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.

Il comando di esempio che propongo come soluzione è questo:
powershell -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin" -Command "$p = Start-Process cmd.exe -ArgumentList '/c', 'C:\percorso\raggiungibile\da\admin\script.bat', '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3' -Verb RunAs -Wait -PassThru; exit $p.ExitCode"

Leggi tutto: Eseguire un bat che si “auto-invoca” per richiedere i privilegi di amministratore (se non presenti) e restituisce un codice di uscita.

Scenario: ho un file bat che deve eseguire delle operazioni con privilegi elevati (nel mio caso specifico, giusto per dare un esempio: registrare una DLL che rappresenta un Add-in del CAD SolidWorks) e – se non trovati – auto-invocarsi dopo aver chiesto le credenziali di amministratore, attendere che la “propria copia” eseguita nel “cmd.exe” appositamente creato faccia il suo lavoro e termini con un codice di uscita, il quale, deve poi essere catturato dal processo iniziale e gestito.

Lo so, scritta così, è un po’ “arzigogolata” la cosa; una AI la scriverebbe così:

Ho un file batch che deve eseguire operazioni con privilegi elevati (ad esempio, registrare una DLL che funge da add‑in per SolidWorks). Se la DLL non è presente, il batch deve:

  1. Richiedere le credenziali di amministratore.
  2. Ri‑eseguire se stesso in una nuova istanza di cmd.exe con i privilegi ottenuti.
  3. Attendere che la copia “eseguita” completi il lavoro e termini con un codice di uscita.
  4. Catturare quel codice di uscita nella sessione originale e gestirlo di conseguenza.

Forse sono io che ho posto male la domanda all’AI quando gli ho chiesto di realizzare la cosa ma, avendo tribolato molto per ottenere un risultato funzionante, magari l’esempio sopra può servire a qualche disperato come me.

Per quanto riguarda il comando di esempio, espongo la relativa descrizione (sempre fatta da AI):

Spiegazione dettagliata del comando

powershell `
  -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin" `
  -Command "$p = Start-Process cmd.exe `
              -ArgumentList '/c', `
                           'C:\percorso\raggiungibile\da\admin\script.bat', `
                           '/comando1', `
                           '\"C:\un percorso con spazi\giusto\di\esempio\"', `
                           'PARAMETRO3' `
              -Verb RunAs `
              -Wait `
              -PassThru; `
          exit $p.ExitCode"

1. powershell – avvio di PowerShell

Il comando è eseguito da un prompt di comando (cmd.exe) o da un altro script batch.
powershell lancia una nuova istanza di PowerShell in modalità interattiva (o in modalità script, a seconda del contesto).


2. -WorkingDirectory "C:\cartella\di\lavoro\raggiungibile\da\admin"

Imposta la cartella di lavoro corrente della sessione PowerShell.
Tutto ciò che viene eseguito all’interno di PowerShell (ad esempio i file batch o i comandi) verrà cercato in questa directory se non viene specificato un percorso assoluto.


3. -Command "<script>"

Il parametro -Command indica a PowerShell di eseguire immediatamente la stringa di script che segue.
La stringa è racchiusa tra virgolette doppie ("), quindi è interpretata come un unico argomento per PowerShell.


4. $p = Start-Process cmd.exe ...

a. $p =

La variabile $p conterrà l’oggetto Process restituito da Start-Process.
Questo oggetto fornisce, tra le altre cose, la proprietà ExitCode che verrà usata alla fine.

b. Start-Process cmd.exe

Avvia un nuovo processo cmd.exe.
Questo è il motivo per cui il comando è avvolto in PowerShell: Start-Process è un cmdlet nativo di PowerShell, non di cmd.exe.

c. -ArgumentList '/c', 'C:\percorso\raggiungibile\da\admin\script.bat', '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3'

-ArgumentList specifica gli argomenti che verranno passati a cmd.exe.

  • '/c' dice a cmd.exe di eseguire il comando che segue e poi chiudersi.
  • 'C:\percorso\raggiungibile\da\admin\script.bat' è il file batch da eseguire.
  • '/comando1', '\"C:\un percorso con spazi\giusto\di\esempio\"', 'PARAMETRO3' sono gli argomenti che il batch riceverà.
  • L’argomento con spazi è racchiuso tra virgolette doppie (\"...\") per garantire che venga passato come un singolo parametro a cmd.exe.
  • Le virgolette doppie sono escape (\") perché la stringa è già racchiusa tra virgolette doppie di PowerShell.

d. -Verb RunAs

Chiede a Windows di eseguire il processo con privilegi elevati (prompt UAC).
Se l’utente non è già amministratore, verrà mostrata la finestra di dialogo “Richiesta di credenziali”.

e. -Wait

Il comando PowerShell attende che il processo cmd.exe termini prima di continuare.
Ciò garantisce che il batch abbia finito di lavorare prima di procedere.

f. -PassThru

Restituisce l’oggetto Process (che viene assegnato a $p).
Se non fosse presente, $p sarebbe null e non si potrebbe leggere ExitCode.


5. exit $p.ExitCode

Dopo che cmd.exe è terminato, PowerShell esce con lo stesso codice di uscita del processo avviato.
Questo è fondamentale se il batch viene chiamato da un altro script o da un sistema di automazione: il valore di ritorno indica se l’operazione è andata a buon fine o se è stato riscontrato un errore.


Riepilogo in un unico flusso

  1. PowerShell viene lanciata con una cartella di lavoro specificata.
  2. All’interno di PowerShell, si avvia cmd.exe con:
    • cmd.exe /c script.bat … (il batch e i suoi argomenti)
    • privilegi elevati (RunAs)
    • attesa della terminazione (-Wait)
    • restituzione dell’oggetto processo (-PassThru)
  3. Una volta terminato il batch, PowerShell termina con lo stesso codice di uscita del batch.

Tastiera Italiana per Sviluppatori

Purtroppo, la tastiera italiana di default (quantomeno su Windows 11) fa schifo, mancano alcune sequenze comode, obbligando ad arrangiarsi con il tastierino numerico.
Ad esempio manca l’accento grave (`) e la tilde (~).

Per risolvere il problema ho scaricato ed installato (dopo aver controllato tramite VirusTotal ) un software che aggiunge la tastiera italiana, lo trovate (spero) a questo link (si tratta di una condivisione su OneDrive, non il massimo, lo ammetto … e sia chiaro: non è roba mia e non ho idea di chi l’abbia prodotta!).

Dopodiché, questo è l’elenco dei tasti che va a risolvere:

` (AltGr + ')
~ (AltGr + ì)
À (AltGr + shift + a)
È (AltGr + shift + e)
Ì (AltGr + shift + i)
Ò (AltGr + shift + o)
Ù (AltGr + shift + u)
® (AltGr + r) registered
© (AltGr + c) copyright

Si tratta di roba che ho trovato tramite SuperUser .

Montare una cartella condivisa di Windows Server 2022 su Debian 12 (risolvendo “Permission denied”)

Montare una cartella condivisa SMB su Linux a volte può sembrare semplice… finché non appare il temuto errore:

mount error(13): Permission denied
Refer to the mount.cifs(8) manual page (e.g. man mount.cifs) and kernel log messages (dmesg)

Ecco come risolvere il problema passo per passo.

Leggi tutto: Montare una cartella condivisa di Windows Server 2022 su Debian 12 (risolvendo “Permission denied”)

Scenario

  • Server Linux: Debian 12.x
  • Server Windows: Windows Server 2022, Domain Controller
  • Condivisione SMB: //SERVER-NOME/Condivisione
  • Dominio Active Directory: DOMINIO.LOCAL
  • Utente dominio: username

Sintomo

Montando con:

sudo mount /mnt/Condivisione

compare l’errore “Permission denied” e nei log (dmesg) appare:

CIFS: Status code returned 0xc000006d STATUS_LOGON_FAILURE

Causa

mount.cifs gestisce in modo diverso le credenziali rispetto a smbclient.
Mentre con smbclient funziona:

smbclient -L //SERVER-NOME -U "DOMINIO\\username%password"

con mount.cifs il backslash (\) nell’username causa un fallimento dell’autenticazione.

Soluzione

1. Crea la directory di mount

sudo mkdir -p /mnt/Condivisione

2. Crea un file credenziali sicuro

Crea /etc/samba/credentials/server:

username=nome_utente
password=password_complicata_e_sicura
domain=DOMINIO

Nota: Usa domain=DOMINIO (NetBIOS), non DOMINIO.LOCAL.

(ovviamente devi personalizzare i valori del file!)

Imposta i permessi:

sudo chmod 600 /etc/samba/credentials/server

3. Aggiungi la riga in /etc/fstab:

//SERVER-NOME/Condivisione /mnt/Condivisione cifs credentials=/etc/samba/credentials/server,iocharset=utf8,vers=3.1.1,sec=ntlmssp,uid=1000,gid=1000,file_mode=0660,dir_mode=0770 0 0

(si tratta di un’unica riga, mi raccomando!)

Parametri chiave:

  • vers=3.1.1 → protocollo SMB di default su Windows Server 2022
  • sec=ntlmssp → autenticazione moderna supportata da AD
  • uid e gid → proprietario dei file su Linux
  • file_mode e dir_mode → permessi di default

Per eseguire il mount senza errori, dovrebbe bastare un semplice:

sudo mount /mnt/Condivisione

Copia guidata impostazioni di SOLIDWORKS: Impossibile caricare le informazioni sulle impostazioni di SOLIDWORKS da ‘nome.utente’.

Ti capita di voler salvare le impostazioni di SolidWorks e ottieni questo messaggio di errore:

Leggi tutto “Copia guidata impostazioni di SOLIDWORKS: Impossibile caricare le informazioni sulle impostazioni di SOLIDWORKS da ‘nome.utente’.”

Un Batch per archiviare una cartella tramite 7z usando Invia A di Windows

Creare un bat per Windows che utilizza 7z per archiviare una cartella selezionata in Esplora File ed inviata tramite “invia a” del menu contestuale.

Forse servirà solo a me ma – spesso – mi trovo ad archiviare una cartella, prima di modificarla, per averne una copia di backup.

Però mi piace che il backup abbia un “codice di versione”, ovvero: se archivio la cartella “pippo” voglio che l’archivio si chiami “pippo_2024-11-02_2034.7z” dove, tutto quello che viene dopo “pippo”, è un codice progressivo che identifica data e ora di creazione del backup, così che siano sequenziali, in ordine.

Per farlo, procedere come segue:

1] Aprire la cartella del “Invia a:” di Windows; usare win+r e digitare:

shell:sendto

2] Nella cartella che si apre, creare un file di testo e rinominarlo come:

ARCHIVIA_CARTELLA.bat

3] Aprire in modifica il file di cui sopra ed incollare il seguente codice:

@echo off
setlocal enabledelayedexpansion

:: ******************************************************************
:: Script per creare l'archivio della cartella passato come parametro, usando
:: 7z ed associando un codice progressivo automaticamente.
::
:: Versione 202-11-02
:: budus@hotmail.it
:: ******************************************************************

set percorso7z=
set archive_code=
set archive_name=

:: Immagazzina la data e ora corrente.
for /f "tokens=1-4 delims=/ " %%a in ('date /t') do (
	set anno=%%c
	set mese=%%b
	set giorno=%%a
)

for /f "tokens=1-2 delims=: " %%a in ('time /t') do (
	set ora=%%a
	set minuti=%%b
)

set archive_code=!anno!-!mese:~0,2!-!giorno:~0,2!_!ora:~0,2!!minuti:~0,2!

:: Verifica che il parametro sia una cartella e che esista.
if exist "%~1" (
	if not exist "%~1\*.*" (
		echo [I] Il percorso
		echo     "%~1"
		echo     e' una cartella vuota.
	) else (
		if exist "%~1\*" (
			echo [I] Il percorso
			echo     "%~1"
			echo     e' una cartella.
		) else (
			echo [I] Il parametro
			echo     "%~1"
			echo     risulta essere un file.
			goto end_with_error
		)
	)
) else (
	echo [I] Il parametro
	echo     "%~1"
	echo     non risulta essere una cartella.

	goto end_with_error
)

:: Estrapola il nome della cartella da archiviare.
for /f "delims=" %%a in ("%~1") do (
	set archive_name=%%~nxa
)

echo [I] Archiviazione della cartella:
echo     %1
echo     con il codice: %archive_code%
echo     nell'archivio: %archive_name%

for /f "delims=" %%a in ('where /R "%ProgramFiles%" 7z.exe') do (
	if not defined percorso7z set percorso7z=%%a
	goto end
)

:end
:: Se non è stato trovato 7z, emette errore.
if not defined percorso7z goto error__no7z

:: Esegue l'archiviazione usando 7z.
"%percorso7z%" a -bd -- "%archive_name%_%archive_code%" "%~1"
timeout 3
exit /B %errorlevel%


:error__no7z
echo [E] 7z non e' stato trovato in:
echo     %ProgramFiles%

:end_with_error
@pause
exit /B 1

4] Chiudere e salvare il file bat.

Ora è sufficiente usare il menu contestuale di Esplora File di Windows (per Windows 11 si rende necessario aprire le opzioni aggiuntive, cosa fattibile se si tiene premuto il tasto Maiuscola/Shift), quindi, “Invia a” e “ARCHIVIA_CARTELLA.bat”.

Nel bat ho messo diversi commenti, dovrebbe essere chiaro (sì, fino ad un certo punto, me ne rendo conto …) cosa fa ogni pezzo di codice. Se proprio siete curiosi di approfondire, potete chiedermelo o usare qualsiasi AI ed incollare la porzione di codice che vi lascia perplessi, se non l’intero script.

Nel caso in cui preferiate eliminare la cartella dopo l’archiviazione, potente modificare la riga:

"%percorso7z%" a -bd -- "%archive_name%_%archive_code%" "%~1"

in:

"%percorso7z%" a -bd -sdel -- "%archive_name%_%archive_code%" "%~1"

error: cannot communicate with server: Post http://localhost/v2/snaps/core: dial unix /run/snapd.socket: connect: no such file or directory

Provando ad usare il comando:

snap list

a seguito dell’installazione di snapd, tramite i seguenti comandi:

apt update
apt install snapd

su una distribuzione GNU Linux/Debian 10.13 (ormai vecchiotta, ma è LTS, prima o poi dovrò aggiornarla), ottengo l’errore in oggetto.

Il problema è dovuto al fatto che il demone è stato sì installato, ma non attivato!

Per farlo, usare:

systemctl enable snapd.service
systemctl start snapd.service

Se non parte, beh, significa che c’è qualche problema nel sistema e bisogna indagare, cercando in giro, mi spiace.

Roundcube: PHP Fatal error: Uncaught Error: Call to undefined method rcmail::action_handler()

Aggiornando il Client di Posta Roundcube, mi è capitato di ricevere il messaggio in oggetto.

Per risolvere il problema:

systemctl restart apache2

Sì, è sufficiente riavviare il web-server per aggiornare la cache di PHP.

Nel mio caso, il problema, non si presentava cercando di accedere alla cartella dove effettivamente ho installato Roundcube mentre, usando il solito percorso (in pratica un link simbolico alla cartella dove ho installato, cosicché possa installare più versioni e modificare il link per decidere quale usare … più che altro uso questo modus operandi durante l’aggiornamento), ottenevo un errore subito dopo il login (maledettamente non l’ho salvato).

Spero la cosa vi aiuti.