Сценарий Bash с использованием pdfencrypt не работает для определенных символов

Я пишу сценарий 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" 

на таких символах, как § ä ö ü он выходит из строя со следующим сообщением:

  • stdin, stderr, перенаправление и журналы
  • Shell с вкладки Firefox
  • Почему встроенные времена не работают в трубопроводе?
  • Извлечь абзац, разделенный на *** с помощью AWK
  • Трубопровод с grep и найти отпечатки числа перед результатом
  • Что задает переменную окружения $ SHELL?
  • несовместимые кодировки символов: UTF-8 и ASCII-8BIT

    Я сталкиваюсь с ошибкой pdfencrypt или неправильно кодируется пример?
    Если я использую echo "$password" все идет хорошо.

  • Найти отличия в файле и сортировке файла по ключу
  • Почему «$ i | sed "не работает?
  • Как получить общий размер всего в каталоге в одной строке?
  • awk и новые строки во входных данных
  • Почему xxd не показывает знак порядка байтов?
  • Как создать текстовый файл (1 гигабайт), содержащий случайные символы с кодировкой символов UTF-8?
  • One Solution collect form web for “Сценарий Bash с использованием pdfencrypt не работает для определенных символов”

    Похоже, что pdfencrypt требует 8- pdfencrypt (ISO-8859) закодированного пароля и не знает, как обрабатывать (то есть конвертировать) пароли UTF-8.

    Вы должны использовать совместимую кодировку символов при выполнении pdfencrypt для шифрования и дешифрования. Обычная ASCII («C») или ISO-8859-n (например, «de_DE.latin1», как предложено Hauke ​​Laging) должна работать. На мой взгляд, это просто инструктирует pdfencrypt принимать символы вашего пароля как есть (т. 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" 

    Сделайте то же самое для декодирования.

    Если вы конвертируете свой пароль с помощью iconv вместо установки LC_ALL, я думаю, у вас будет такая же проблема, поскольку pdfencrypt прежнему полагает, что вы даете ему символы UTF-8, когда он встречает 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" 
    Linux и Unix - лучшая ОС в мире.