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, maispdfbook2
lancera alors unPermissionError
de "Opération non autorisée" lorsqu'il essaie d'exécuterpdfcrop
qui se trouve également dans/Library/TeX/texbin
. - La première ligne de
pdfbook2
est#!/usr/bin/env python3
. La première ligne depdfcrop
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.