如果我尝试包含一个超出已知路径的文件,我会得到众所周知的错误:
Error: /invalidfileaccess in --file--
我知道我可以使用-DNOSAFER
,但我想避免这种情况,因为这会允许执行恶意代码。
是否可以选择告诉gs
“您可以阅读任何文件,但不得删除或删除任何文件”?
答案 0 :(得分:5)
(答案是从gGt an output file with a count of PDF pages for each file with Ghostscript复制的;当我自己寻找解决方案且没有骰子时,这两个SO问题都会弹出。:'-()
请注意,自GhostScript 9.50起,默认情况下已将SAFER模式打开,从而导致/invalidfileaccess
这样的错误,只要确保您路径中的所有目录分隔符都为/
就不会消失斜线,摆弄当前路径等。
今天这花了我很多时间和几个小时,但是到2020年之后,您需要执行以下操作:
--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)中。
-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指定正确的绝对路径。
-f
命令行仅在-c
PostScript命令内部加载文件时出现此问题,而在使用-f <file>
的命令行中直接指定PDF / PS源文件时,不是。
-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
等。
-dNOSAFER
运行时问题是否消失了?如果是,那么宾果游戏!在此命令行下:
gs -q -dNOSAFER -dNODISPLAY -c "(d:/test.pdf) (r) file runpdfbegin pdfpagecount = quit"
可以,那么可以肯定的是,您需要上述两种解决方案来摆脱/invalidfileaccess
错误。
我在SO和其他地方都讨论了很多讨论,包括各种bug跟踪器,但似乎所有地方都没有提到这一点,因为所有这些页面/条目都来自GhostScript 9.50和2019AD之前的版本。
文件访问控制功能(通过
-dSAFER
启用)已被完全重写,并重新设计。有关更多详细信息,请参阅:SAFER。请注意,
-dSAFER
现在仅启用文件访问控制,并且不再对标准Postscript功能施加限制(特别是对setpagedevice
的限制)。如果您的应用程序依赖于这些Postscript限制,请参阅OLDSAFER
,并请与我们联系,因为我们确实打算删除这些Postscript限制,除非我们有理由不这样做。重要:默认情况下,文件访问控制已启用。为了在没有这些控件的情况下运行Ghostscript,请参见
NOSAFER
Windows用户重要提示:请参见下文Incompatible Changes
SAFER
的更改从2019-09-30(版本9.50)开始
答案 1 :(得分:0)
没有。您可以使用-dSAFER来阻止文件访问,也可以不使用(如果您的环境已经设置-dSAFER,则使用-dNOSAFER)。
不可能'有点安全'。