Script Bash usando o pdfencrypt falha em certos caracteres

2

Estou escrevendo um script bash com o seguinte snippet:

#!/bin/bash

# usage '$bash this-script.sh in.pdf out.pdf'

 stty -echo
 printf "Password: "
 read password
 stty echo
 echo

 pdfencrypt "$1" -p "$password" -o "$2"

em caracteres como § ä ö ü falha com a seguinte mensagem:

incompatible character encodings: UTF-8 and ASCII-8BIT

Estou encontrando um bug de pdfencrypt ou o exemplo não está codificado corretamente?
Se eu usar echo "$password" , tudo está indo bem.

    
por nath 06.08.2017 / 00:17

1 resposta

3

Parece que pdfencrypt requer uma senha codificada de 8 bits (ISO-8859) e não sabe como lidar com (ou seja, converter) senhas UTF-8.

Você deve usar uma codificação de caracteres compatível ao executar pdfencrypt , para criptografia e descriptografia. ASCII simples ("C") ou ISO-8859-n (como "de_DE.latin1" como sugerido por Hauke Laging) devem funcionar. Na minha opinião, isso apenas instrui pdfencrypt a usar os caracteres da sua senha (ou seja, nenhuma conversão é necessária), isso é tudo.

Basta adicionar esta linha no topo do seu script:

export LC_ALL=de_DE.latin1        # Or fr_FR, or latin15, or... Any valid locale for your system

Ou alterar esta linha única pode ser suficiente:

LC_ALL=de_DE.latin1 pdfencrypt "$1" -p "$password" -o "$2"

Faça o mesmo para a decodificação.

Se você converter sua senha com iconv em vez de definir LC_ALL, eu acho que você teria o mesmo problema, pois pdfencrypt ainda acreditaria que você está dando caracteres UTF-8 quando encontrar os de 8 bits.

De qualquer forma, para facilitar as coisas, você provavelmente deve se ater ao conjunto de caracteres ASCII de 7 bits: espaço, letras não acentuadas, dígitos, pontuação básica, etc. ( man 7 ascii )

Quanto ao espaço, você deve estar ciente de que a leitura em uma variável específica com ( read -r var ) remove os espaços iniciais e finais (na verdade, os caracteres na variável IFS da shell). Isso pode ser chato para uma senha. Você deve usar read -r , que coloca a linha inteira como lida na variável REPLY .

Isso daria esse código:

export LC_ALL=de_DE.latin1
read -r -s -p "Password: "
echo
pdfencrypt "$1" -p "$REPLY" -o "$2"
    
por 06.08.2017 / 01:17