如果我尝试包含已知路径之外的文件,则会出现众所周知的错误:
Error: /invalidfileaccess in --file--
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用,-DNOSAFER但我想避免这种情况,因为这会允许执行恶意代码。
是否有选项告诉gs“您可以读取任何文件,但不得删除或删除任何文件”?
(答案从gGt复制了一个输出文件,其中包含每个文件的 PDF 页数和 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"
Run Code Online (Sandbox Code Playgroud)
即使用命令行参数之一确保您在 PostScript 命令/脚本中加载的 PDF 的路径在批准列表(即权限列表)中--permit-file-xyz。
-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指定正确的绝对路径。
-f命令行此问题仅发生在-cPostScript 命令内的文件加载时,而不是在命令行上使用-f <file>.
-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等的部分。
-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,请参阅
NOSAFERWindows 用户的重要说明:请参阅下面不兼容的更改
该SAFER变化是从2019年9月30日(版本9.50)
| 归档时间: |
|
| 查看次数: |
3542 次 |
| 最近记录: |