我阅读了文档:

https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox_development.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_suid_sandbox.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandboxing.md

https://chromium.googlesource.com/chromium/src/+/master/docs/linux_sandbox_ipc.md

但是无法找到正确配置沙箱的方法,也无法在我的系统上找到脚本 update-linux-sandbox.sh

我找到了 here

但我得到:

$ ./update-linux-sandbox.sh
/tmp/../out/Debug does not exist. Use "BUILDTYPE=Release ./update-linux-sandbox.sh" If you are building in Release mode
$ BUILDTYPE=Release ./update-linux-sandbox.sh
/tmp/../out/Release does not exist. Use "BUILDTYPE=Release ./update-linux-sandbox.sh" If you are building in Release mode

我唯一不安全的解决方法是使用:
const browser = await puppeteer.launch(
    {headless: true, args: ['--no-sandbox', '--disable-setuid-sandbox']}
);

有什么想法可以正确地做这些事情吗?

最佳答案

如果您在这里寻找一种在没有 --no-sandbox arg 的情况下在 Centos7 中运行 Puppeteer 的方法,那么 @MevatlaveKraspek 答案将不起作用

通过设置 Linux 内核参数以启用命名空间(在 CentOS Linux 7.4.1708 版上),我设法让 Puppeteer 在没有 --no-sandbox 标志 arg 的情况下截取屏幕截图。

作为 root 用户运行:echo "user.max_user_namespaces=15000" >> /etc/sysctl.conf检查它是否与:sudo sysctl -a | grep user.max_user_namespaces
现在重新启动系统并运行脚本而不使用 --no-sandbox 例如 const browser = await puppeteer.launch();
如果仍然无法使用,则可能是您使用的是较旧的Linux内核,并且需要在内核中设置几个额外的参数。

作为 root 用户运行:grubby --args="user_namespace.enable=1 namespace.unpriv_enable=1" --update-kernel="$(grubby --default-kernel)"
现在重新启动您的系统并检查内核命令行中您刚刚添加的 2 个参数cat /proc/cmdline
如果他们在命令行中运行脚本而不再次使用 --no-sandbox 例如 const browser = await puppeteer.launch();
它现在应该可以工作了。如果不是,您可能正在使用不支持命名空间的旧内核。

您可以使用以下命令检查内核版本:uname -a这是我的内核版本,我在没有 --no-sandbox arg 的情况下运行了 Puppeteer。Linux centos7 3.10.0-693.21.1.el7.x86_64
希望这可以帮助 :)

关于node.js - 如何在 Linux 上正确使用沙箱与 puppeteer 并停止变得不安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49554676/

10-14 22:47