GhostScript:错误:/invalidfileaccess in --file--

gue*_*tli 7 ghostscript

如果我尝试包含已知路径之外的文件,则会出现众所周知的错误:

Error: /invalidfileaccess in --file--
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用,-DNOSAFER但我想避免这种情况,因为这会允许执行恶意代码。

是否有选项告诉gs“您可以读取任何文件,但不得删除或删除任何文件”?

Ger*_*elt 9

(答案从gGt复制了一个输出文件,其中包含每个文件的 PDF 页数和 Ghostscript;当我自己寻找解决方案而没有骰子时,这两个 SO 问题都出现了。:'-()


请注意,自 GhostScript 9.50 以来,SAFER 模式在默认情况下已打开,导致/invalidfileaccess此类错误,通过确保路径中的所有目录分隔符都是/正斜杠、摆弄当前路径等,这些错误不会消失。

这让我今天花了很多时间和几个小时,但是 2020 年你需要做这样的事情:

解决方案 1:将源路径添加到接受列表中,使用--permit-file-read=<path>使之/invalidfileaccess消失

gs -q --permit-file-read=d:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"

Run Code Online (Sandbox Code Playgroud)

使用命令行参数之一确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表(即权限列表)中--permit-file-xyz

解决方案 2:快速破解-I<path>以使其/invalidfileaccess消失

gs -q -Id:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"

Run Code Online (Sandbox Code Playgroud)

即确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表(又名权限列表)中。

-Id:/上面的例子仅仅是一个快速的黑客,以确保您的路径的源路径是目录,鉴于此位上从官方文档

最后,命令行上提供的路径(例如 -I、-sFONTPATH 参数中的路径)被添加到允许阅读列表中。类似地,在初始化期间从 Fontmap、cidfmap 和平台特定字体文件枚举(例如 Unix 系统上的 fontconfig)读取的路径会自动添加到许可读取列表中。

注意/抛开-I这样使用时的期望:

对我来说另一个惊喜是

gs -q --permit-file-read=d:/ -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"

Run Code Online (Sandbox Code Playgroud)

即在-I包含集中指定 PDF 的源路径,然后在 PostScript 命令中省略它,仍然给了我一个/invalidfileaccess所以请确保为您正在加载的 PDF指定正确的绝对路径

笔记

适用于 PostScript 脚本,而不是 -f命令行

此问题仅发生在-cPostScript 命令内的文件加载时,而不是在命令行上使用-f <file>.

如何检查这是否是您的实际问题

测试 1:在没有额外的情况下尝试相同-I<path>--permit-file-read=<path>:错误是否返回?如果是,那么宾果游戏!

当此命令行(注意缺少的-Id:/--permit-file-read=d:/唯一的更改)时:

gs -q -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
Run Code Online (Sandbox Code Playgroud)

为您提供“无效文件访问”错误,如下所示:

   Error: /invalidfileaccess in --file--
   Operand stack:
      (d:/test.pdf)   (r)
   Execution stack:
      %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
   Dictionary stack:
      --dict:737/1123(ro)(G)--   --dict:0/20(G)--   --dict:75/200(L)--
   Current allocation mode is local
   Last OS error: Permission denied
   GPL Ghostscript 9.52: Unrecoverable error, exit code 1
Run Code Online (Sandbox Code Playgroud)

比您很可能有一个-dSAFER问题,通过上述将PDF 源目录添加到接受的路径列表中来解决这个问题(另请参阅“NOSAFER”中的 GhostScript 文档,包括关于--permit-file-read=pathlist等的部分。

测试 2:当你运行时问题会消失-dNOSAFER吗?如果是,那么宾果游戏!

当这个命令行:

gs -q -dNOSAFER -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
Run Code Online (Sandbox Code Playgroud)

工作正常,那么这是一个肯定的迹象,您需要上述任何一种解决方案来消除/invalidfileaccess错误。

警告:您在网上找到的旧答案可能不再适用

正如我在 SO 和其他地方看到的很多讨论一样,包括各种错误跟踪器,似乎没有人在任何地方提到这一点,因为所有这些页面/条目都来自 GhostScript 9.50 和 2019AD 版之前。

引用9.50 更改说明

文件访问控制功能(使用 启用-dSAFER)已完全重写,对设计进行了彻底的重新思考。有关更多详细信息,请参阅:更安全。

需要注意的是,-dSAFER现在只启用文件访问控制,不再对标准 Postscript 功能施加限制(特别是对 的限制setpagedevice)。如果您的应用程序依赖于这些 Postscript 限制,请参阅OLDSAFER,并请与我们联系,因为我们确实计划删除这些 Postscript 限制,除非我们有理由不这样做。

重要提示:现在默认启用文件访问控制。要在没有这些控件的情况下运行 Ghostscript,请参阅NOSAFER

Windows 用户的重要说明:请参阅下面不兼容的更改

SAFER变化是从2019年9月30日(版本9.50)


Ken*_*enS 0

不可以。您要么使用 -dSAFER 来阻止文件访问,要么不使用(如果您的环境已设置 -dSAFER,则使用 -dNOSAFER)。

不可能有“一点点安全”。