pdfcrypt를 사용하는 Bash 스크립트가 특정 문자에서 실패합니다.

pdfcrypt를 사용하는 Bash 스크립트가 특정 문자에서 실패합니다.

다음 코드 조각이 포함된 bash 스크립트를 작성 중입니다.

#!/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"

§ ä ö ü다음 메시지와 함께 유사한 문자에 대해서는 실패합니다.

호환되지 않는 문자 인코딩: UTF-8 및 ASCII-8BIT

버그가 발생했습니까 pdfencrypt? 아니면 예제가 잘못 코딩되어 있습니까? .
모든 것이 echo "$password"잘 됩니다.

답변1

pdfencrypt8비트(ISO-8859)로 인코딩된 비밀번호가 필요한 것 같은데 UTF-8 비밀번호를 처리(즉, 변환)하는 방법을 잘 모르겠습니다.

pdfencrypt실행 시 암호화를 위해 호환되는 문자 인코딩을 사용해야 합니다 .그리고해독합니다. 일반 ASCII("C") 또는 ISO-8859-n(예: Hauke ​​Laging이 제안한 "de_DE.latin1")이 작동해야 합니다. 이것은 단지 pdfencrypt비밀번호의 문자를 있는 그대로(즉, 변환할 필요 없음) 가져오도록 지시하는 것 같습니다 .

스크립트 상단에 다음 줄을 추가하세요.

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

아니면 다음 줄을 변경하는 것만으로도 충분할 수 있습니다.

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

디코딩에도 동일한 작업을 수행합니다.

LC_ALL을 설정하는 대신 비밀번호를 변환하면 iconv동일한 문제에 직면하게 될 것입니다. pdfencrypt8비트 문자를 만나면 여전히 UTF-8 문자를 제공한다고 믿기 때문입니다.

어쨌든 작업을 더 쉽게 하려면 공백, 악센트 없는 문자, 숫자, 기본 구두점 등 7비트 ASCII 문자 집합을 사용해야 합니다. ( man 7 ascii)

read -r var공백의 경우 ( )를 사용하여 특정 변수를 읽으면 선행 및 후행 공백(실제로 쉘 변수의 문자임)이 제거된다는 점에 유의해야 합니다 IFS. 이것은 비밀번호 때문에 짜증스러울 수 있습니다. read -r전체 줄을 REPLY변수 로 읽어들이는 데 사용해야 합니다 .

그러면 다음 코드가 제공됩니다.

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

관련 정보