5 votos

Big Sur: PDF Service shell script no puede llamar a Python

Recientemente he actualizado de Mohave a Big Sur, y el shell script que utilizo como Servicio PDF ha dejado de funcionar. El scriptllama a un scriptde Python para procesar el PDF, y éste da el error "operación no permitida". Pensando que esto tiene que ver con las nuevas restricciones de seguridad, intenté arrastrar todo lo que parecía relevante al Acceso a Disco Completo en el panel de Privacidad de la configuración de Seguridad y Privacidad, pero eso no ayudó. Aquí está el script con algunas líneas de depuración insertadas:

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

Cuando lo invoco desde el diálogo de impresión, esto es lo que se escribe en el archivo de registro:

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 se incluye con MacTeX: es un script de Python que invoca python3 con /usr/bin/env . python3 está en /usr/local/bin (instalado con Homebrew), y como muestra la línea de prueba, ni siquiera puedo invocarlo directamente. ¿Qué tengo que hacer para permitir que Big Sur ejecute este script?

Actualización:

  • Por si no estaba claro, el script funciona cuando se invoca desde la Terminal. Sólo falla cuando se invoca desde el diálogo de impresión.
  • Dado que el Big Sur todavía tiene /usr/bin/python3 , se puede modificar el script anterior para utilizarlo. Cuando se invoca el Servicio PDF desde el diálogo de impresión, /usr/bin/python3 -c 'print("Python works")' imprimirá "Python funciona". /usr/bin/python3 /Library/TeX/texbin/pdfbook2 --inner-margin=80 "$f" comenzará a ejecutarse, pero pdfbook2 lanzará entonces un PermissionError de "Operación no permitida" cuando intenta ejecutar pdfcrop que también está en /Library/TeX/texbin .
  • La primera línea de pdfbook2 es #!/usr/bin/env python3 . La primera línea de pdfcrop es #!/usr/bin/env perl que debería encontrar /usr/bin/perl ya que no hay Perl en mi /usr/local/bin .
  • Así que aparentemente SIP está impidiendo que los Servicios PDF exec de cualquier cosa que no esté en un directorio protegido, y de utilizar /usr/bin/env como intérprete (lo que podría eludir esa restricción). ¿Hay alguna manera de dar a un script permiso para hacer esto? Dar al script acceso total al disco no funciona.

3voto

benwiggy Puntos 8

He descubierto que Big Sur permitirá amablemente que un script se ejecute en un Servicio PDF, si el script se pone dentro de un flujo de trabajo de Automator guardado como APLICACIÓN. Guardar como un plug-in de impresión, flujo de trabajo u otro tipo no funcionará.

Utilice la acción de Automator 'Ejecutar Shell script', y coloque el script allí.

Si el script puede llamar a otro script con los permisos necesarios, no lo he probado.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X