sandbox_sandboxie - CSDN
精华内容
参与话题
  • Sandbox概念

    千次阅读 2018-12-05 07:29:58
    一个被隔离的程序,在里面做任务事件都不会影响到宿主程序。只能调用宿主开放的一些API。

    一个被隔离的程序,在里面做任务事件都不会影响到宿主程序。只能调用宿主开放的一些API。

    展开全文
  • Alibaba之jvm-sandbox初体验

    千次阅读 2019-08-13 17:33:56
    前言 在开始之前,我们先来模拟一下以下的场景: 小李:“小明,你的接口没有返回数据,麻烦帮忙看一下?” 小明:“我这边的数据也是从别人的服务器中拿到的,但是我不确定是因为逻辑处理有问题导致没有结果,还是...

    前言

    在开始之前,我们先来模拟一下以下的场景:
    小李:“小明,你的接口没有返回数据,麻烦帮忙看一下?”
    小明:“我这边的数据也是从别人的服务器中拿到的,但是我不确定是因为逻辑处理有问题导致没有结果,还是因为我依赖的服务有问题而没有返回结果,我需要确认一下。”
    小明:“哎呀,线上没有日志,我需要加个日志上个线。”
    30 分钟之后……
    小明:“不好意思,日志加错地方了……稍等……”

    接来下隆重登场的就是本文的主角 JVM SandBox 了。基于 JVM SandBox,我们可以很容易地做到在不重新部署应用的情况下,给指定的某些类的某些方法加上日志功能。当然,动态加日志仅仅是 JVM SandBox 可以应用的一个小小的场景,JVM SandBox 的威力远不在于此。套用官方的话说就是"JVM-SANDBOX还能帮助你做很多很多,取决于你的脑洞有多大了。"

    JVM SandBox 简介

    AOP

    在介绍 JVM SandBox 之前,我们先来回顾一下 AOP 技术。

    AOP(面向切面编程,Aspect Oriented Programming)技术已被业界广泛应用,其思想是面向业务处理过程的某个步骤或阶段进行编程,这个步骤或阶段被称为切面,其目的是降低业务逻辑的各部分之间的耦合,常见的 AOP 实现基本原理有两种:代理和行为注入。

    1)代理模式

    在代理模式下,我们会创建一个代理对象来代理原对象的行为,代理对象拥有原对象行为执行的控制权,在这种模式下,我们基于代理对象在原对象行为执行的前后插入代码来实现 AOP。
    代理模式.png

    2)行为注入模式

    在行为注入模式下,我们不会创建一个新的对象,而是修改原对象,在原对象行为的执行前后注入代码来实现 AOP。
    行为注入模式.png

    JVM SandBox

    JVM SandBox 是阿里开源的一款 JVM 平台非侵入式运行期 AOP 解决方案,本质上是一种 AOP 落地形式。那么可能有同学会问:已有成熟的 Spring AOP 解决方案,阿里巴巴为什么还要“重复造轮子”?这个问题要回到 JVM SandBox 诞生的背景中来回答。在 2016 年中,天猫双十一催动了阿里巴巴内部大量业务系统的改动,恰逢徐冬晨(阿里巴巴测试开发专家)所在的团队调整,测试资源保障严重不足,迫使他们必须考虑更精准、更便捷的老业务测试回归验证方案。开发团队面临的是新接手的老系统,老的业务代码架构难以满足可测性的要求,很多现有测试框架也无法应用到老的业务系统架构中,于是需要新的测试思路和测试框架。

    为什么不采用 Spring AOP 方案呢?Spring AOP 方案的痛点在于不是所有业务代码都托管在 Spring 容器中,而且更底层的中间件代码、三方包代码无法纳入到回归测试范围,更糟糕的是测试框架会引入自身所依赖的类库,经常与业务代码的类库产生冲突,因此,JVM SandBox 应运而生。

    JVM SandBox 本身是基于插件化的设计思想,允许用于以“模块”的方式基于 JVM SandBox 提供的 AOP 能力开发新的功能。基于 JVM SandBox,我们不需要关心如何在 JVM 层实现 AOP 的技术细节,只需要通过 JVM SandBox 提供的编程结构告诉“沙箱”,我们希望对哪些类哪些方法进行 AOP,在切面点做什么即可,JVM SandBox 模块功能编写起来非常简单。

    JVM-SANDBOX(沙箱)实现了一种在不重启、不侵入目标JVM应用的AOP解决方案

    沙箱的特性
    • 无侵入:目标应用无需重启也无需感知沙箱的存在
    • 类隔离:沙箱以及沙箱的模块不会和目标应用的类相互干扰
    • 可插拔:沙箱以及沙箱的模块可以随时加载和卸载,不会在目标应用留下痕迹
    • 多租户:目标应用可以同时挂载不同租户下的沙箱并独立控制
    • 高兼容:支持JDK[6,11]
    实时无侵入AOP框架

    在常见的AOP框架实现方案中,有静态编织和动态编织两种。

    静态编织:静态编织发生在字节码生成时根据一定框架的规则提前将AOP字节码插入到目标类和方法中,实现AOP;
    动态编织:动态编织则允许在JVM运行过程中完成指定方法的AOP字节码增强.常见的动态编织方案大多采用重命名原有方法,再新建一个同签名的方法来做代理的工作模式来完成AOP的功能(常见的实现方案如CgLib),但这种方式存在一些应用边界:

    • 侵入性:对被代理的目标类需要进行侵入式改造。比如:在Spring中必须是托管于Spring容器中的Bean
    • 固化性:目标代理方法在启动之后即固化,无法重新对一个已有方法进行AOP增强

    要解决无侵入的特性需要AOP框架具备 在运行时完成目标方法的增强和替换。在JDK的规范中运行期重定义一个类必须准循以下原则

    • 不允许新增、修改和删除成员变量
    • 不允许新增和删除方法
    • 不允许修改方法签名

    JVM-SANDBOX属于基于Instrumentation的动态编织类的AOP框架,通过精心构造了字节码增强逻辑,使得沙箱的模块能在不违反JDK约束情况下实现对目标应用方法的无侵入运行时AOP拦截。

    核心原理

    事件驱动

    在沙箱的世界观中,任何一个Java方法的调用都可以分解为BEFORE、RETURN和THROWS三个环节,由此在三个环节上引申出对应环节的事件探测和流程控制机制。

    // BEFORE
    try {
    
       /*
        * do something...
        */
    
        // RETURN
        return;
    
    } catch (Throwable cause) {
        // THROWS
    }
    

    基于BEFORE、RETURN和THROWS三个环节事件分离,沙箱的模块可以完成很多类AOP的操作。

    • 可以感知和改变方法调用的入参
    • 可以感知和改变方法调用返回值和抛出的异常
    • 可以改变方法执行的流程
      • 在方法体执行之前直接返回自定义结果对象,原有方法代码将不会被执行
      • 在方法体返回之前重新构造新的结果对象,甚至可以改变为抛出异常
      • 在方法体抛出异常之后重新抛出新的异常,甚至可以改变为正常返回

    类隔离策略

    沙箱通过自定义的SandboxClassLoader破坏了双亲委派的约定,实现了和目标应用的类隔离。所以不用担心加载沙箱会引起应用的类污染、冲突。各模块之间类通过ModuleJarClassLoader实现了各自的独立,达到模块之间、模块和沙箱之间、模块和应用之间互不干扰
    jvm-sandbox-classloader.png

    类增强策略

    沙箱通过在BootstrapClassLoader中埋藏的Spy类完成目标类和沙箱内核的通讯

    jvm-sandbox-enhance-class.jpg

    快速安装

    下载并安装,开箱即用

    # 下载最新版本的JVM-SANDBOX
    wget http://ompc.oss-cn-hangzhou.aliyuncs.com/jvm-sandbox/release/sandbox-stable-bin.zip
    
    # 解压
    unzip sandbox-stable-bin.zip
    

    挂载目标应用

    # 进入沙箱执行脚本
    cd sandbox/bin
    
    # 目标JVM进程21815 
    ./sandbox.sh -p 21815 
    

    挂载成功后会提示

    # ./sandbox.sh -p 21815 
                        NAMESPACE : default
                          VERSION : 1.2.1
                             MODE : ATTACH
                      SERVER_ADDR : 0.0.0.0
                      SERVER_PORT : 42641
                   UNSAFE_SUPPORT : ENABLE
                     SANDBOX_HOME : /root/jvm_sandbox_demo/sandbox/bin/..
                SYSTEM_MODULE_LIB : /root/jvm_sandbox_demo/sandbox/bin/../module
                  USER_MODULE_LIB : /root/jvm_sandbox_demo/sandbox/sandbox-module;~/.sandbox-module;
              SYSTEM_PROVIDER_LIB : /root/jvm_sandbox_demo/sandbox/bin/../provider
               EVENT_POOL_SUPPORT : DISABLE
    

    卸载沙箱

    ./sandbox.sh -p 21815 -S
    jvm-sandbox[default] shutdown finished.
    

    还有一些指令,建议查阅官方提供的文档或者查阅 /sandbox/bin/sandbox.sh内的指令内容

    实例

    线上发生文件上传故障,异常错误提示文件存储路径异常,目的是通过jvm-sandbox在不破坏不重启的前提下获知参数中的文件存储路径是否与配置文件一致
    先上代码

    package com.cn;
    
    import com.alibaba.jvm.sandbox.api.Information;
    import com.alibaba.jvm.sandbox.api.Module;
    import com.alibaba.jvm.sandbox.api.annotation.Command;
    import com.alibaba.jvm.sandbox.api.listener.ext.Advice;
    import com.alibaba.jvm.sandbox.api.listener.ext.AdviceListener;
    import com.alibaba.jvm.sandbox.api.listener.ext.EventWatchBuilder;
    import com.alibaba.jvm.sandbox.api.resource.ModuleEventWatcher;
    import org.kohsuke.MetaInfServices;
    
    import javax.annotation.Resource;
    import java.lang.reflect.Field;
    import java.util.logging.Logger;
    
    
    @MetaInfServices(Module.class)
    @Information(id = "my-sandbox-module")// 模块名,在指定挂载进程后通过-d指定模块,配合@Command注解来唯一确定方法
    public class MySandBoxModule implements Module {
        //日志输出,默认采用logback,这里的日志输出到切入的服务日志中
        private Logger LOG = Logger.getLogger(MySandBoxModule.class.getName());
    
        @Resource
        private ModuleEventWatcher moduleEventWatcher;
    
        @Command("addLog")// 模块命令名
        public void addLog() {
            new EventWatchBuilder(moduleEventWatcher)
                    .onClass("cn.com.service.impl.PackageServiceImpl")// 想要对 PackageServiceImpl 这个类进行切面
                    .onBehavior("bathSave")// 想要对上面类的 bathSave 方法进行切面
                    .onWatch(new AdviceListener() {
                        //对方法执行之前执行
                        @Override
                        protected void before(Advice advice) throws Throwable {
                            //获取方法的所有参数
                            Object[] parameterArray = advice.getParameterArray();
                            if (parameterArray != null) {
                                for (Object po : parameterArray) {
                                    //方法参数可能为空,规避报错
                                    if (po != null) {
                                        /**
                                         *  目标方法
                                         *  public List<UploadResult> bathSave(List<Package> pkgs, MultipartFile[] files, String hdfsDir) {}
                                         *
                                         *  这里只关心MultipartFile参数,其余参数过滤
                                         *
                                         *  po.getClass() 输出内容为 class [Lorg.springframework.web.multipart.MultipartFile;
                                         *  po.getClass().getName() 输出内容为[Lorg.springframework.web.multipart.MultipartFile
                                         *
                                         *  最开始的设想是直接cast转型,但是由于类加载器不同,是不行的,所以最好反射来操作
                                         */
                                        if (po.getClass().getName().contains("MultipartFile")) {
                                            //目标方法参数是一个MultipartFile[]
                                            Object[] o2 = (Object[]) po;
                                            for (Object o3 : o2) {
                                                Field ff = o3.getClass().getDeclaredField("part");
                                                ff.setAccessible(true);
                                                Object part = ff.get(o3);
                                                Field ff1 = part.getClass().getDeclaredField("location");
                                                ff1.setAccessible(true);
                                                Object file = ff1.get(part);
                                                Field ff11 = file.getClass().getDeclaredField("path");
                                                ff11.setAccessible(true);
                                                
                                                //最后的结果输出:打印的路径-------/app/upload,符合预期
                                                LOG.info("打印的路径-------" + ff11.get(file));
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    });
        }
    }
    

    部署

    打包

    mvn clean package
    

    上传或者复制到目录

    /sandbox/sandbox-module
    # 效果如下
    /sandbox/sandbox-module/my-sandbox-module-1.0-SNAPSHOT-jar-with-dependencies.jar
    

    挂载到对应进程

    # my-sandbox-module就是类上的模块名,addLog方法上的模块命令名
    ./sandbox.sh -p 21815 -d 'my-sandbox-module/addLog'
    

    挂载之后可以通过指令查看是否挂载成功

    # ./sandbox.sh -p 4432 -l
    my-sandbox-module   	ACTIVE  	LOADED  	1    	1    	UNKNOW_VERSION 	UNKNOW_AUTHOR
    sandbox-info        	ACTIVE  	LOADED  	0    	0    	0.0.4          	luanjia@taobao.com
    broken-clock-tinker 	ACTIVE  	LOADED  	0    	0    	UNKNOW_VERSION 	UNKNOW_AUTHOR
    sandbox-module-mgr  	ACTIVE  	LOADED  	0    	0    	0.0.2          	luanjia@taobao.com
    sandbox-control     	ACTIVE  	LOADED  	0    	0    	0.0.3          	luanjia@taobao.com
    total=5
    

    这时执行对应的api在挂载的服务日志中就能查看通过沙箱添加的日志了。

    sandbox的日志路径可以在**/sandbox/cfg/sandbox-logback.xml**文件中进行配置(sandbox日志主要输出挂载信息,以及沙箱程序的异常错误信息)

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration scan="true" scanPeriod="10000">
    
        <appender name="SANDBOX-FILE-APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${user.home}/logs/sandbox/sandbox.log</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <FileNamePattern>${user.home}/logs/sandbox/sandbox.log.%d{yyyy-MM-dd}</FileNamePattern>
                <MaxHistory>30</MaxHistory>
            </rollingPolicy>
            <encoder>
                <pattern>%d{yyyy-MM-dd HH:mm:ss} %SANDBOX_NAMESPACE %-5level %msg%n</pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <root level="info">
            <appender-ref ref="SANDBOX-FILE-APPENDER"/>
        </root>
    </configuration>
    

    以上就是对Alibaba的jvm-sandbox的初体验,其他更丰富的场景还有待进一步体验

    参考文档

    1.https://www.infoq.cn/article/TSY4lGjvSfwEuXEBW*Gp
    2.https://github.com/alibaba/jvm-sandbox

    展开全文
  • kubernetes Sandbox删除详解

    万次阅读 2017-12-14 10:12:50
    上一篇blog讲解了一下gc的整个流程。后面介绍了删除sandbox。但sandbox怎么删除还是没有讲清楚,在此详细展开说一下。

    上一篇blog讲解了一下gc的整个流程。后面介绍了删除sandbox。但sandbox怎么删除还是没有讲清楚,在此详细展开说一下,通过sandbox id去删除sandbox代码在pkg/kubelet/kuberuntime/kuberuntime_gc.go。

    func (cgc *containerGC) removeSandbox(sandboxID string) {
        glog.V(4).Infof("Removing sandbox %q", sandboxID)
        // In normal cases, kubelet should've already called StopPodSandbox before
        // GC kicks in. To guard against the rare cases where this is not true, try
        // stopping the sandbox before removing it.
        if err := cgc.client.StopPodSandbox(sandboxID); err != nil {
            glog.Errorf("Failed to stop sandbox %q before removing: %v", sandboxID, err)
            return
        }
        if err := cgc.client.RemovePodSandbox(sandboxID); err != nil {
            glog.Errorf("Failed to remove sandbox %q: %v", sandboxID, err)
        }
    }
    

    上面的代码分为两步,第一步是停止sandbox,第二步是删除sandbox。
    先看停止pkg/kubelet/dockershim/docker_sandbox.go。

    func (ds *dockerService) StopPodSandbox(podSandboxID string) error {
    ...
        errList := []error{}
        if needNetworkTearDown {
            cID := kubecontainer.BuildContainerID(runtimeName, podSandboxID)
            err := ds.network.TearDownPod(namespace, name, cID)
            if err == nil {
                ds.setNetworkReady(podSandboxID, false)
            } else {
                errList = append(errList, err)
            }
        }
        if err := ds.client.StopContainer(podSandboxID, defaultSandboxGracePeriod); err != nil {
            glog.Errorf("Failed to stop sandbox %q: %v", podSandboxID, err)
            // Do not return error if the container does not exist
            if !libdocker.IsContainerNotFoundError(err) {
                errList = append(errList, err)
            }
        }
    ...

    先调用cni去删除网络,然后采集是停止容器。
    先看删除网络调用cni的过程

    err := ds.network.TearDownPod(namespace, name, cID)

    具体实现在pkg/kubelet/network/cni/cni.go

    func (plugin *cniNetworkPlugin) TearDownPod(namespace string, name string, id kubecontainer.ContainerID) error {
        if err := plugin.checkInitialized(); err != nil {
            return err
        }
    
        // Lack of namespace should not be fatal on teardown
        netnsPath, err := plugin.host.GetNetNS(id.ID)
        if err != nil {
            glog.Warningf("CNI failed to retrieve network namespace path: %v", err)
        }
    
        return plugin.deleteFromNetwork(plugin.getDefaultNetwork(), name, namespace, id, netnsPath)
    }

    再深入看看上面删除网络方法deleteFromNetwork

    func (plugin *cniNetworkPlugin) deleteFromNetwork(network *cniNetwork, podName string, podNamespace string, podInfraContainerID kubecontainer.ContainerID, podNetnsPath string) error {
        rt, err := plugin.buildCNIRuntimeConf(podName, podNamespace, podInfraContainerID, podNetnsPath)
        if err != nil {
            glog.Errorf("Error deleting network when building cni runtime conf: %v", err)
            return err
        }
    
        netConf, cniNet := network.NetworkConfig, network.CNIConfig
        glog.V(4).Infof("About to del CNI network %v (type=%v)", netConf.Name, netConf.Plugins[0].Network.Type)
        err = cniNet.DelNetworkList(netConf, rt)
        if err != nil {
            glog.Errorf("Error deleting network: %v", err)
            return err
        }
        return nil
    }

    先是装配参数netConf和rt,然后是通过DelNetworkList是删除,
    继续看代码DelNetworkList

    func (c *CNIConfig) DelNetworkList(list *NetworkConfigList, rt *RuntimeConf) error {
        for i := len(list.Plugins) - 1; i >= 0; i-- {
            net := list.Plugins[i]
    
            pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path)
            if err != nil {
                return err
            }
    
            newConf, err := buildOneConfig(list, net, nil, rt)
            if err != nil {
                return err
            }
    
            if err := invoke.ExecPluginWithoutResult(pluginPath, newConf.Bytes, c.args("DEL", rt)); err != nil {
                return err
            }
        }
    
        return nil
    }

    好了这里开始调用正在的/opt/cni/bin下面cni的二进制文件的地方,上面的pluginPath默认就是/opt/cni/bin,上面执行的DEL方法,这个如果大家感兴趣可以看看我之前CNI解析的blog。
    如果大家对怎么执行二进制cni感兴趣,我再多说一句怎么执行cni的
    vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go

    func (e *RawExec) ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error) {
        stdout := &bytes.Buffer{}
    
        c := exec.Cmd{
            Env:    environ,
            Path:   pluginPath,
            Args:   []string{pluginPath},
            Stdin:  bytes.NewBuffer(stdinData),
            Stdout: stdout,
            Stderr: e.Stderr,
        }
        if err := c.Run(); err != nil {
            return nil, pluginErr(err, stdout.Bytes())
        }
    
        return stdout.Bytes(), nil
    }

    通过golang 的os/exec去执行。

    展开全文
  • 好东西,不私藏,象征性的收一分,绝对不会让你失望,绝对好东西
  • 沙盒环境又称测试环境和开发环境,是提供给开发者开发和测试用...测试环境,测试用(sandbox)。 Detux: The Multiplatform Linux Sandbox- https://github.com/detuxsandbox/detux Index of /~aurel32/qemu- https:...

     沙盒环境又称测试环境和开发环境,是提供给开发者开发和测试用的环境。在该环境中应用功能没有任何限制,但是在该环境测试情况下将会产生正常资费。
     测试环境,测试用(sandbox)。
    Detux: The Multiplatform Linux Sandbox- https://github.com/detuxsandbox/detux
    Index of /~aurel32/qemu- https://people.debian.org/~aurel32/qemu/

    -- 开发环境、测试环境、生产环境的联系
    1、开发环境:开发者开发及自己调试的环境;打开错误报告方便调试
    2、测试环境:测试者测试及改bug的环境;这个环境要和生产环境类似!!!
    3、生产环境:真实用户线上使用的环境;关闭错误报告,打开错误日志!
     生产环境组成:操作系统 ,web服务器 ,语言环境。  php 。 数据库 。 等等
     生产环境的上线:项目数据前端后台已经跑通,部署在阿里云上
     ps:UAT环境:UAT,(User Acceptance Test),用户接受度测试 即验收测试,主要是用来作为客户体验的环境。
        沙盒环境,也就是常说的预生产环境、仿真环境,沙盒环境验证过后才能正式上线,bug的最后一道关卡:
        不定期从生产环境同步,保持和生产环境的设置、数据一致性,大数据量的性能测试首推仿真环境,和生产环境只差性能方面!

    -- iOS In-App Purchase 内购之 验证订单是沙盒环境还是真实环境- https://blog.csdn.net/zzzzzdddddxxxxx/article/details/53220098
     创建app内购买项目(Create New),选择类型:
      1.消耗型项目
     对于消耗型 App 内购买项目,用户每次下载时都必须进行购买。一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵。
      2.非消耗型项目
     对于非消耗型 App 内购买项目,用户仅需要购买一次。不会过期或随使用而减少的服务通常为非消耗型项目,例如游戏App 的新跑道。
      3.自动续订订阅
     通过自动续订订阅,用户可以购买指定时间期限内的更新和动态内容。除非用户取消选择,否则订阅(例如杂志订阅等)会自动续订。
      4.免费订阅
     通过免费订阅,开发者可以将免费订阅内容放入“报刊杂志”。用户注册免费订阅后,该订阅内容将会出现在与该用户Apple ID 关联的所有设备上。请注意,免费订阅不会过期,并且仅在支持报刊杂志功能的 App 中提供。
      5.非续订订阅
     非续订订阅允许有时限性的营销服务。对于 App 内购买项目中的限时访问内容,就需使用非续订订阅。例如,导航App 中语音导航功能的一周订阅,或者年度订阅已存档的视频或音频的在线目录。
     一定要根据自己应用的情况选择正确,不然会被App Store审核团队拒绝。应用内的虚拟币要采用消耗型的,有固定时限的会员选择自动续订订阅。也可以只选择虚拟币充值自己后台购买的情况解决会员问题。

    -- 浅析微信支付:如何使用沙箱环境测试
     在实际开发中,通常我们都是在开发环境中开发,本地环境也有很多限制,比如:微信支付无法调起、H5链接需要鉴权、支付结果通知需要外网等。
     沙箱环境,也就是微信支付的官方测试环境。微信支付沙箱环境,是提供给微信支付商户的开发者,用于模拟支付及回调通知。以验证商户是否理解回调通知、账单格式,以及是否对异常做了正确的处理。

    -- 人机对话,智能问答
     目前较为方面的实现人机对话,智能问答。一般就两个选择百度的Unit,和科大讯飞的AIUI。但是科大讯飞的收费,对于尝试人工智能的大部分公司或者个人开发者来说,就可以直接pass掉了。
     在百度unit中,你需要配置各种对话模板,词槽词等,当然讯飞也一样的是这样的操作步骤。举例说明一下,比如你想做一个智能查天气的应用场景,一般我们会这样说:“我想查北京明天的天气”。其中的关键词比如地名:北京; 时间:明天。意图:查天气。配置一个规则包含有地名,时间,且是查天气。然后在训练生效到一个测试环境中,这个就是沙盒环境。

    -- PayPal官方提供的测试环境(sandbox)已经测试成功,把测试环境转移到正式环境上。

    展开全文
  • 谷歌浏览器快捷方式 -no-sandbox ./chrome -no-sandbox
  • 直接解决办法
  • #coding = utf-8 from selenium import webdriver service_path = "/root/note/Python/myTools/Scrapy/driver/chromedriver...service_args = ['--verbose', '--no-sandbox'] options = webdriver.ChromeOptions() opt
  • google浏览器chrome 关闭沙箱 -no-sandbox

    千次阅读 2015-11-16 13:13:44
    "C:\GoogleChromePortable\App\Google Chrome\chrome.exe" -no-sandbox
  • k8s创建pod出现Failed create pod sandbox.Pod sandbox changed, it will be killed and re-created.错误,如下图所示: 到相应子节点上查看kubelet日志: journalctl -u kubelet -n 1000 发现问题的原因...
  • Running as root without --no-sandbox is not supported 背景:Anki安装 在root下启动Anki,安装时,报错 [25670:25670:0526/160121.792008:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-...
  • Chromium的沙盒Sandbox

    千次阅读 2014-08-23 14:40:44
    代码位置:http://src.chromium.org/viewvc/chrome/trunk/src/sandbox/Android使用和Linux一样的代码。...sandbox本身就意味着程序要使用多进程架构。做到安全的方法就是让可能不安全
  • 更新Cocoapod之后出现问题: diff: /../Podfile.lock: No such file or directory diff: Manifest.lock: No such file or ...error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or updat
  • 创建一个pods的时候,发现一直处于ContainerCreating装态: 一开始怀疑是镜像拉取过慢,于是到相应节点上手动docker pull镜像。 kubectl delete pods 后,还是不行。然后 kubectl describe pods 查看详情后,...
  • 由于服务器被攻击了只能系统重装,各种软件都得重新装一遍,装完chrome后发现总是报图中这个错误 花了两个多小时查各种google资料,也试过重装chrome,最后发现是因为驱动没更新......我把原来系统里的驱动备份之后...
  • 新装Kubernetes,创建一个新Pod,启动Pod遇到CreatePodSandbox或RunPodSandbox异常。查看日志 # journalctl --since 15:00:00 -u kubelet RunPodSandbox from runtime service failed: rpc error: code = Unknown ...
  • 浏览器兼容性工具 Spoon Browser Sandbox

    千次阅读 2017-10-27 21:37:27
    1、Spoon Browser Sandbox 勺浏览器沙箱 https://turbo.net/browsers 主流浏览器多(IE、Chrome、FireFox、Safari、Opera),浏览器又有很多版本;保证网页在主流浏览器中很好的显示,不可能安装多有的浏览器进行...
  • 使用 iframe sandbox 时的注意点

    千次阅读 2016-11-12 17:59:37
    三、当被嵌入的文档与主页面同源时,强烈建议不要同时使用 allow-scripts 和allow-same-origin ,否则的话将允许嵌入的文档通过代码删除 sandbox 属性。虽然你可以这么做,但是这样的话其安全性还不如不用sandbox。...
  • 刚装了win7,发现音乐有杂音,上网搜了很多资料,无非是一些让你重装声卡驱动之类的,我就试了试,发现怎么新装都不管事,晕了。。。后来有篇帖子建议装上SRS,说是可以加强音效,我就抱着侥幸的心里装了,结果发现...
  • ubuntu下chrome不能启动

    千次阅读 2013-11-04 14:11:56
    图形界面下,突然发现chrome不能启动了,开始以为是电脑卡,结果等了很久不见结果。...FATAL:zygote_host_impl_linux.cc(138)] The SUID sandbox helper binary was found, but is not configured correctly. Rather th
1 2 3 4 5 ... 20
收藏数 35,168
精华内容 14,067
关键字:

sandbox