5 votes

Big Sur : Le shell du service PDF script ne peut pas appeler Python

J'ai récemment mis à niveau de Mohave à Big Sur, et le shell script que j'utilise comme service PDF a cessé de fonctionner. Le script appelle un script Python pour traiter le PDF, et cela donne l'erreur "opération non autorisée". Pensant que cela a à voir avec les nouvelles restrictions de sécurité, j'ai essayé de faire glisser tout ce qui semblait pertinent pour l'accès complet au disque dans le volet Confidentialité des paramètres de sécurité et de confidentialité, mais cela n'a pas aidé. Voici le script avec quelques lignes de débogage insérées :

#!/bin/sh

export PATH=/Library/TeX/texbin:/usr/local/bin:$PATH

########################################
# Log stdout and stderr (from https://stackoverflow.com/a/20564208).
LOG_FILE=/tmp/pdfbooklog.txt
# Close STDOUT file descriptor
exec 1<&-
# Close STDERR FD
exec 2<&-
# Open STDOUT as $LOG_FILE file for read and write.
exec 1<>$LOG_FILE
# Redirect STDERR to STDOUT
exec 2>&1

########################################
# Get name of file printed and print options (unused).

# name or title of file printed, e.g., document.odt
TITLE="${1:-}"
# space separated options from the print dialog: k1=v1 k2='v2' …
PRINT_OPTIONS="$2"
# Make first (usually only) filename $1.
shift
shift

# Some programs called write files to the current directory, so make sure
# we're somewhere where that will work.
cd /tmp

########################################
# Apparently it's possible to be called with multiple filenames.
# Use a loop to make sure we handle all files listed on the command line.

for f in "$@"
do
    echo "Processing '$f'"
    echo "PATH: $PATH"
    /usr/local/bin/python3 -c 'print("Python works")'
    pdfbook2 --inner-margin=80 "$f"
    open "${f%.pdf}-book.pdf"
done

Lorsque je l'invoque à partir de la boîte de dialogue d'impression, voici ce qui est écrit dans le fichier journal :

Processing '/var/folders/2j/w5jh3df55p7f4n05nh_m45jr0000gn/T/printing.11142.10/test.odt.pdf'
PATH: /Library/TeX/texbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
/Users/me/Library/PDF Services/Make PDF booklet.sh: line 40: /usr/local/bin/python3: Operation not permitted
/Users/me/Library/PDF Services/Make PDF booklet.sh: /Library/TeX/texbin/pdfbook2: /usr/bin/env: bad interpreter: Operation not permitted
The file /var/folders/2j/w5jh3df55p7f4n05nh_m45jr0000gn/T/printing.11142.10/test.odt-book.pdf does not exist.
test.odt-book.pdf does not exist.
Done

pdfbook2 est inclus avec MacTeX : il s'agit d'un script Python qui invoque python3 avec /usr/bin/env . python3 est en /usr/local/bin (installé avec Homebrew), et comme le montre la ligne de test, je ne peux même pas l'invoquer directement. Que dois-je faire pour permettre à Big Sur d'exécuter ce script ?

Mise à jour :

  • Au cas où ce ne serait pas clair, le script fonctionne lorsqu'il est invoqué à partir du Terminal. Il échoue uniquement lorsqu'il est invoqué à partir de la boîte de dialogue d'impression.
  • Puisque Big Sur a toujours /usr/bin/python3 le script ci-dessus peut être modifié pour l'utiliser. Lorsque le service PDF est invoqué à partir de la boîte de dialogue d'impression, /usr/bin/python3 -c 'print("Python works")' imprimera "Python fonctionne". /usr/bin/python3 /Library/TeX/texbin/pdfbook2 --inner-margin=80 "$f" commencera à s'exécuter, mais pdfbook2 lancera alors un PermissionError de "Opération non autorisée" lorsqu'il essaie d'exécuter pdfcrop qui se trouve également dans /Library/TeX/texbin .
  • La première ligne de pdfbook2 est #!/usr/bin/env python3 . La première ligne de pdfcrop est #!/usr/bin/env perl qui devrait trouver /usr/bin/perl puisqu'il n'y a pas de Perl dans mon /usr/local/bin .
  • Donc apparemment, SIP empêche les services PDF de exec à tout ce qui ne se trouve pas dans un répertoire protégé, et d'utiliser /usr/bin/env comme interprète (ce qui pourrait contourner cette restriction). Existe-t-il un moyen de donner à un script la permission de faire cela ? Donner au script un accès complet au disque ne fonctionne pas.

3voto

benwiggy Points 21125

J'ai découvert que Big Sur permettra gracieusement à un script de s'exécuter dans un Service PDF, si le script est placé à l'intérieur d'un workflow Automator.

Utilisez l'action Automator "Exécuter le Shell script" et placez le script à cet endroit.

Les scripts du Service PDF prennent normalement un ensemble différent d'arguments entrants (titre, options d'impression, chemin d'accès au fichier) ; alors que le flux de travail Automator ne transmet que le chemin d'accès au PDF, vous devez donc modifier votre scripts en conséquence.

Ces problèmes semblent être uniques à Big Sur, et sont corrigés à Monterey, ce qui permettra aux services PDF scripts d'avoir un peu plus de latitude.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X