Come modificare la codifica utilizzata dal mio server SFTP?

Oct 21 2020

Ho un server Ubuntu che ospita alcuni .pngfile utilizzando SFTP.

Quando provo ad accedere a quei file dal mio laptop Windows, utilizzando FileZilla o WinSCP, i file non vengono trasferiti correttamente se Force UTF-8è selezionato ( Site Manager → Custom Charset ):

I file provengono da VisualCron, in esecuzione su un server Windows e, sebbene abbia modificato la codifica in UTF-8 in VisualCron, non sono sicuro che si applichi poiché è l'unico posto in cui potrebbero iniziare a essere codificati in modo diverso.

Impostare:

  • OpenSSH sshd_config:
    # AcceptEnv LANG LC_*
    Subsystem sftp      = /usr/lib/openssh/sftp-server -l INFO
    Match Group         = sftp_users
    ChrootDirectory     = /ftproot/owners/%u
    ForceCommand        = internal-sftp
    

Si noti che ho commentata: AcceptEnv LANG LC_*. Secondo qui , ciò significa che il server non consentirà al client di passare le variabili di ambiente della locale. In questo caso, anche se il server Windows che utilizza VisualCron inviasse file utilizzando una codifica "sbagliata", il server non dovrebbe accettarla e utilizzare UTF-8. Destra?

  • Impostazioni locali del server Ubuntu:
    LANG                = en_US.UTF-8
    language            =
    LC_CTYPE            = "en_US.UTF-8"
    LC_NUMERIC          = "en_US.UTF-8"
    LC_TIME             = "en_US.UTF-8"
    LC_COLLATE          = "en_US.UTF-8"
    LC_MONETARY         = "en_US.UTF-8"
    LC_MESSAGES         = "en_US.UTF-8"
    LC_PAPER            = "en_US.UTF-8"
    LC_NAME             = "en_US.UTF-8"
    LC_ADDRESS          = "en_US.UTF-8"
    LC_TELEPHONE        = "en_US.UTF-8"
    LC_MEASUREMENT      = "en_US.UTF-8"
    LC_IDENTIFICATION   = "en_US.UTF-8"
    LC_ALL              =
    
  • FileZilla:
    quando si utilizza ISO-8859-15, vengono trasferiti file contenenti caratteri come èe énel nome del file, ma il trasferimento di file con Force UTF-8errori abilitati con:
    Response:  New directory is: "/tickets/"
    Command:   get "FILENAME containing Liège.png" "C:\test\FILENAME containing Liège.png"
    
      Error:   /tickets/FILENAME containing Liège.png: open for read: no such file or directory
      Error:   File transfer failed
    


Dove posso vedere quale codifica utilizza il mio server SFTP per gli elenchi di file e come posso cambiarla in UTF-8?

Risposte

2 Binarus Oct 29 2020 at 16:24

Osservazioni preliminari:

  • sftp deve usare UTF-8 come codifica del nome file (ad esempio, vedere qui come riferimento). Tuttavia, ci sono client e server che non seguono tale requisito e violano le specifiche, che potrebbero essere la causa del problema.

  • Hai scritto: "Nota che ho commentato: AcceptEnv LANG LC_ *. Secondo qui, questo significa che il server non consentirà al client di passare le variabili di ambiente locale."

    Potrebbe esserci un malinteso su come funziona e a cosa serve. Ogni volta che due macchine comunicano, devono utilizzare gli stessi formati di dati. Ad esempio, supponiamo che VisualCron inserisca nomi di file codificati come ISO 8859-1 nel flusso di byte che invia al server Ubuntu, ma costringi il server Ubuntu a interpretare il flusso di byte (nome file) in entrata come se fosse codificato in UTF- 8. Ciò non risolverà i problemi, ma li causerà .

Avendo detto questo:

All'inizio tenterei di scoprire dove si pone esattamente il problema. Presumo fortemente che tu abbia accesso SSH o anche accesso fisico (tastiera) al server Ubuntu. Poi

  • Controlla se la locale en_US.UTF-8è installata sul server Ubuntu. Si noti che la semplice impostazione delle variabili di ambiente LC_e non installa una locale.LANG

    Invece, installeresti una locale durante l'installazione di O / S o qualcosa di simile dpkg-reconfigure locales(su Debian - non conosco Ubuntu).

  • Se si utilizza SSH, assicurarsi che il software del terminale SSH (ad esempio Putty) utilizzi la stessa codifica del server.

  • Quindi, il passaggio più cruciale: utilizzando il tuo terminale SSH, crea manualmente un file con un nome problematico nella rispettiva directory in modo che il client sftp sul tuo laptop Windows possa vederlo.

    Ad esempio, tornando alla tua domanda, potresti creare un file con il nome Liège.txtnella tua /ticketsdirectory ( touch /tickets/Liège.txt). Sempre usando il tuo terminale SSH, controlla attentamente che il nome del file appaia correttamente quando lasci che Ubuntu elenchi i file in quella directory ( ls -al /tickets).

  • Ora usa il client sftp sul tuo laptop Windows e controlla se scarica correttamente il file appena creato.

    Se funziona, significa che il tuo problema si verifica quando VisualCron trasferisce i file al server Ubuntu. Se non funziona, il problema è tra il tuo laptop Windows e il server Ubuntu.

In entrambi i casi, ci sono strumenti che possono aiutarti ad analizzare la situazione.

Ad esempio, puoi ottenere alcune informazioni giocando con convmv , che può convertire i nomi dei file da una codifica all'altra. In particolare, puoi convertire la codifica dei nomi dei file da UTF-8 a UTF-8 . Quando lo fai e sei sicuro che il nome del file è già codificato in UTF-8, non deve cambiare durante la conversione.

Potresti anche voler dare un'occhiata a chardet , che è una libreria Python che cerca di indovinare la codifica, ad esempio, dei nomi di file. Non sono un tipo Python, quindi non posso aiutarti con il codice sorgente. Secondo la risposta accettata a questa domanda , avresti una riga come chardet.detect(os.popen("ls yourfilename.txt").read())nel tuo script Python, che produrrà la codifica più probabile insieme a una valutazione di affidabilità.

Riassumere:

  • Assicurati che i nomi dei file sul tuo server Ubuntu siano realmente codificati in UTF-8, seguendo i passaggi mostrati sopra e utilizzando gli strumenti sopra menzionati.

  • Una volta che sei assolutamente sicuro che i nomi dei file sul tuo server Ubuntu siano codificati in UTF-8, controlla se il tuo client sftp sul tuo laptop può scaricarli. In caso contrario, prova altri client finché non funziona.

  • Se hai scoperto che non tutti i nomi di file sul server Ubuntu sono codificati in UTF-8, regola le impostazioni in VisualCron di conseguenza. Non conosco VisualCron e quindi non posso aiutarti.

1 pbies Oct 29 2020 at 06:20

SFTP è infatti SSH. Quindi non ci sono opzioni di configurazione lato server per i dati SSH inviati / ricevuti.

La soluzione a questo problema rimane sul lato client, quindi sarà la configurazione di WinSCP e la sua compatibilità per elaborare caratteri non standard.

Sembra che UTF-8 sia già codifica standard per WinSCP e lato server.

1 harrymc Oct 29 2020 at 03:15

La mia esperienza con i file contenenti caratteri accentati è che viaggiano molto male attraverso la rete. Le soluzioni di lavoro che ho visto sono state:

  • Zip o 7Zip i file all'origine e decomprimilo nella destinazione. Usa tar se è richiesta la conservazione dei permessi dei file. La compressione e il fatto che venga trasferito un solo file, l'archivio, migliorerà di molto il tempo di trasferimento.

  • Eseguire il trasferimento utilizzando la stessa utilità di trasferimento file su entrambi i lati che supporta i caratteri accentati, ad esempio utilizzando una condivisione di file tra due computer Linux o due Windows. Tuttavia possono verificarsi problemi durante il trasferimento tra Windows e Linux.

  • Rinomina tutti i file in modo che i loro nomi non contengano caratteri accentati. Questa è la soluzione migliore quando si spostano file a livello internazionale.

Per l'ultima soluzione, potresti facilmente trovare script bash per fare questo lavoro, ad esempio slugify.sh .