小编kee*_*een的帖子

系统调用而不在R中调用shell

在基R,也有用于调用系统命令3个主要机制:system,system2,及shell(这似乎共享一个带手册页system).它们都没有提供一种非常可靠的跨平台方式来运行系统命令而没有shell阻塞 - 如果shell介入,我们需要担心shell注入攻击,关于确保引用是正确的,等等.

有些语言可以直接访问C级execvp函数(例如Perl的system PROGRAM LIST机制),当我想确保数组中的字符串正是子进程在其参数中看到的字符串时,这非常有用,而不需要查看适用于嵌入式空格,引号等的引用例程,并担心它们在不同平台和不同版本的shell上会做什么.

R中是否有类似的无shell系统调用机制,可能在某个CRAN包中?和/或是否有任何兴趣创建这样一个机制,如果还没有?

r system

35
推荐指数
1
解决办法
791
查看次数

有没有办法将资源的属性解析延迟到"执行"阶段?

我有两个LWRP.第一个涉及创建磁盘卷,格式化它并将其安装在虚拟机上,我们将调用此资源cloud_volume.第二个资源(它不是真正重要的)需要一个UUID用于新格式化的卷,这是一个必需的属性,我们将调用此资源foobar.

资源cloud_volumefoobar用于食谱的东西如下.

volumes.each do |mount_point, volume|
  cloud_volume "#{mount_point}" do
    size volume['size']
    label volume['label']
    action [:create, :initialize]
  end
  foobar "#{mount_point}" do
    disk_uuid node[:volumes][mount_point][:uuid]   # This is set by cloud_volume
    action [:do_stuff]
  end
end
Run Code Online (Sandbox Code Playgroud)

所以,当我做一个厨师运行时,我得到一个Required argument disk_identifier is missing!例外.

在做了一些挖掘后,我发现配方分两个阶段进行处理,即编译阶段和执行阶段.看起来这个问题是在编译时,因为那node[:volumes][mount_point][:uuid]是未设置的时间点.

不幸的是我不能使用OpsCode在这里的技巧,因为在cloud_volume LWRP中使用了通知(所以它会落入文档中显示的反模式)

所以,经过这一切,我的问题是,有没有办法解决disk_uuid在编译时知道值的要求?

ruby attributes chef-infra

11
推荐指数
2
解决办法
6516
查看次数

标签 统计

attributes ×1

chef-infra ×1

r ×1

ruby ×1

system ×1