有没有办法从 tex 文件启用 write18,而无需在配置文件中添加任何参数?这个想法是构建 这个文件除此文件之外无需修改任何其他内容。
答案1
我真心希望这是不可能的。如果确实如此,那是一个严重的错误,应该尽快报告和修复。
限制写入的目的是为了安全原因限制二进制文件,例如防止它们写入或读取不应该写入或读取的文件;限制恶意代码的潜在影响;并限制可能对系统造成的损害程度。
很容易夸大这里的危险:无论如何,出错的可能性都是有限的。但不受限制尽管如此,shell 逃逸的风险还是相当大的。通过不受限制的 shell 逃逸,我可以执行任意代码,并且可以破坏我系统上任何我有写入权限的东西。这是一个不容小觑的风险。
因此,这些限制的设计正是为了防止有人利用文件来规避这些限制。这是一个特点,而不是一个限制。
編輯
本次编辑由两部分组成。第一部分旨在说明评论中提出的一些建议。
如果您使用 Arara 编译.tex
文件,则可以从文件本身控制编译命令。如上所述,一旦编译开始,就无法修改启用写入、限制写入或禁止写入的选项。但是,Arara 允许您通过提供编译命令的包装器来解决这个问题,因此可以在文件中指定该包装器.tex
。
例如,如果我希望 TikZ 图形与存储在子目录中的 PDF 分开编译,ffigurau
那么我可以使用以下代码通过 Arara 和 TikZ 的external
库来实现这一点:
% arara: pdflatex: { shell: true }
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{external}
\tikzsetexternalprefix{ffigurau/}
\tikzexternalize
\begin{document}
\tikz{\node {ABC};}
\tikz{\node {XYZ};}
\end{document}
arara <filename>
或arara <filename>.tex
然后会使用 编译文件pdflatex --shell-escape
,如第一行所示。Arara 根据配置文件和一组.yaml
规则文件解析这些行以获取应运行的命令。有关详细信息和示例,请参阅文档。
编辑二
这部分旨在解释为什么你不应该想要你所要求的东西。
让我们从根据bashful
手册第 2 页的示例修改而来的一个小演示开始:
此代码的原始版本可能会永久删除您系统中的文件,尤其是当您讲威尔士语时。因此,此处发布的版本包含一个故意的错误。
\documentclass{article}
\usepackage[a6paper ]{geometry}
\usepackage{bashful}
\pagestyle{empty}
\begin{document}
The directories in my \texttt{/usr} directory are:
\bash[stdout]
printf %b "Initial listing of files in directory:\n"
ls -F ./ffigurau
rm ,/ffigurau/*
printf %b "Current listing of files in directory:\n"
ls -F ./ffigurau
\END
That's it!
\end{document}
输出如下:
请注意,pdflatex
已删除指定目录中的所有文件。这些文件将从系统中永久删除。它们不在垃圾箱中或不可见。它们已经消失了。
好的。让我们尝试一些更大胆的事情。考虑以下文件列表../My\ Documents
:
drwxr-xr-x 2 username username 4.0K Med 1 02:17 ./
drwx------ 96 username username 12K Med 1 02:15 ../
-r--r--r-- 1 username username 13 Med 1 02:17 company-accounts-final.ods
-r--r--r-- 1 username username 0 Med 1 02:15 critical-report.tex
-r--r--r-- 1 username username 5 Med 1 02:16 my-dissertation.tex
请注意,此目录中的所有文件均受写保护:任何用户(包括我)均无权修改它们。例如,如果我尝试删除我的论文:
rm ../My\ Documents/my-dissertation.tex
rm: remove write-protected regular file ‘../My Documents/my-dissertation.tex’? n
通常情况下,rm
它会在不发出警告的情况下删除文件。但是,如果文件被写保护,它会更加谨慎。当然,这些文件是我的,所以保护并不能阻止我随意删除这些文件。
现在假设我使用 Arara 编译您发送给我的以下代码:
My Documents
请注意,如果目录比工作目录高一级,实际代码将永久删除该目录及其所有内容。由于这可能极具破坏性,因此此处发布的版本包含一个故意的错误。
% arara: pdflatex: { shell: true }
\documentclass{article}
\usepackage[a6paper ]{geometry}
\usepackage{bashful}
\pagestyle{empty}
\begin{document}
The directories in my \texttt{/usr} directory are:
\bash[stdout,stderr]
printf %b "Initial listing of files in directory:\n"
ls -F ../My\ Documents
rm -rf ,,/My\ Documents
printf %b "Current listing of files in directory:\n"
ls -F ../My\ Documents
\END
That's it!
\end{document}
输出如下:
请注意,尽管目录中的所有文件都受到保护,但rm -rf
仍然可以销毁它们以及未受保护的父文件。同样,这些文件将被永久删除。除非尝试灾难恢复工具或使用备份,否则我的(非常简短但精彩的)论文、公司的(简短但令人印象深刻的)账目和我批判性的(尽管完全是空的)报告都消失了。
启用 shell escape 后,pdflatex
所有内容都会被破坏。即使有问题的目录位于我当前的工作目录之上,它也会这样做 - 这一事实通常会禁止编译器进行任何写入。