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

时间:2016-10-20 13:42:01

标签: ghostscript

如果我尝试包含一个超出已知路径的文件,我会得到众所周知的错误:

Error: /invalidfileaccess in --file--

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

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

2 个答案:

答案 0 :(得分:5)

(答案是从gGt an output file with a count of PDF pages for each file with 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"

即确保在PostScript命令/脚本中正在加载的PDF的路径在批准列表(也称为权限列表,using one of the --permit-file-xyz commandline arguments)中。

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

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

即确保在PostScript命令/脚本中正在加载的PDF的路径在批准列表(也称为权限列表)中。

在给定from the official documentation的情况下,以上示例中的-Id:/只是一种快速的技巧,可以确保您的路径的源路径在该列表中:

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

注意/除了使用-I这样的期望外:

另一个令我惊讶的是

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

即在-I包含集中指定PDF的源路径,然后在PostScript命令中省略它, still 给了我/invalidfileaccess,因此请确保为要加载的PDF指定正确的绝对路径

注释

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

仅在-c PostScript命令内部加载文件时出现此问题,而在使用-f <file>的命令行中直接指定PDF / PS源文件时,不是

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

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

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

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

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

   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

您很有可能拥有a -dSAFER problem,这是通过在接受的路径列表中添加上述 PDF源目录来解决的(另请参见the GhostScript documentation at 'NOSAFER'及以后的部分)关于--permit-file-read=pathlist等。

测试2:使用-dNOSAFER运行时问题是否消失了?如果是,那么宾果游戏!

在此命令行下:

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

可以,那么可以肯定的是,您需要上述两种解决方案来摆脱/invalidfileaccess错误。

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

我在SO和其他地方都讨论了很多讨论,包括各种bug跟踪器,但似乎所有地方都没有提到这一点,因为所有这些页面/条目都来自GhostScript 9.50和2019AD之前的版本。

引用from the 9.50 change notes

文件访问控制功能(通过-dSAFER启用)已被完全重写,并重新设计。有关更多详细信息,请参阅:SAFER。

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

重要:默认情况下,文件访问控制已启用。为了在没有这些控件的情况下运行Ghostscript,请参见NOSAFER

Windows用户重要提示:请参见下文Incompatible Changes

SAFER的更改从2019-09-30(版本9.50)开始

答案 1 :(得分:0)

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

不可能'有点安全'。