繁体   English   中英

运行ruby脚本时出现错误的“ PATH中不安全的世界可写dir foo”

[英]Erroneous “Insecure world writable dir foo in PATH” when running ruby script

当我运行一个ruby脚本时,它给了我这个:

[nathanb@nathanb-box ~] myscript .
/u/nathanb/bin/myscript:173: warning: Insecure world writable dir /usr/software/test/bin in PATH, mode 043777
/u/nathanb/bin/myscript:74: warning: Insecure world writable dir /usr/software/test/bin in PATH, mode 043777
/u/nathanb/bin/myscript:79: warning: Insecure world writable dir /usr/software/test/bin in PATH, mode 043777

此消息是错误的,因为/ usr / software是只读安装的:

software:/vol/software/  on  /usr/software             type  nfs         (ro,noatime,intr,rsize=32768,wsize=32768,timeo=600,nolock,addr=10.60.132.45,nfsvers=3,proto=tcp,mountproto=udp)

我可以验证一下:

nathanb@nathanb-box /usr/software/test/bin] touch foo
touch: cannot touch `foo': Read-only file system

我相信我的挂载点具有正确的权限:

[nathanb@nathanb-box /usr] ls -ld /usr/software
drwxr-xr-x 27 root root 4096 2010-09-10 17:12 /usr/software

有两个问题:

  • 可以合法地将其视为Ruby中的错误吗?
  • 我该如何关闭? 有没有办法仅禁用此特定警告?

我们正在处理这种情况,尽管只修复权限会很好,但是在我们的环境中这是不可能的。 相反,我为ruby创建了以下包装脚本,以抑制错误。

#!/bin/bash
(ruby.orig "$@" 3>&1 1>&2 2>&3 | grep -v 'Insecure world writable dir'; exit ${PIPESTATUS[0]}) 3>&1 1>&2 2>&3

只需将ruby可执行文件重命名为ruby.orig并将此脚本放入其所在的ruby bin目录中即可。

有关此工作原理的详细说明请参见


解决此问题的另一种方法(避免使用包装器脚本)是在运行./configure时使用设置为CPPFLAGS="-D ENABLE_PATH_CHECK=0" Ruby进行CPPFLAGS="-D ENABLE_PATH_CHECK=0"

您可以通过关闭所有警告

> ruby -W0 ...

但这可能隐藏其他问题。 而且您确实说过只希望隐藏该特定警告,并且我认为除了解决该问题外,没有其他方法可以解决此问题,我认为这是由于NFS安装未正确中继实际掩码而引起的。 当我使用NFS在Linux上挂载非Linux服务器时,会看到此消息。

像snao服务器或不支持unix样式属性的东西。

同样由于错误报告它不喜欢路径中的世界可写目录,您可以将其从路径中删除,并使用前缀访问该目录中的任何内容吗?

编辑...另一个想法是用类似...的方法过滤您的ruby脚本的输出。

> ruby ... | egrep -v "warning: Insecure world writable dir"

那将输出除特定警告以外的任何其他输出(-v)。

但是,该警告是安全警告,在您的路径中具有可写世界目录是一个坏主意,因为任何人都可以在其中放置恶意脚本或可执行文件。 同样,安装一个已挂载的bin目录同样很糟糕,尤其是您无法控制PATH的目录。 在这种情况下,问题与目录是否可写无关,这是因为PATH中存在一个外部目录。

好的做法将指示您从PATH中删除该挂载目录,并且警告将消失。 如果您需要执行该目录中的内容,请显式提供脚本或可执行文件的完整路径。

这实际上不是Ruby问题,而是安全问题。

您可以编写一种方法来消除警告

def suppress_warnings
  original_verbosity = $VERBOSE
  $VERBOSE = nil
  result = yield
  $VERBOSE = original_verbosity
  return result
end

irb

irb(main):001:0> def suppress_warnings
irb(main):002:1>   original_verbosity = $VERBOSE
irb(main):003:1>   $VERBOSE = nil
irb(main):004:1>   result = yield
irb(main):005:1>   $VERBOSE = original_verbosity
irb(main):006:1>   return result
irb(main):007:1> end
=> nil
irb(main):008:0> Y = :foo
=> :foo
irb(main):009:0> Y = :bar
(irb):9: warning: already initialized constant Y
=> :bar
irb(main):010:0> suppress_warnings { Y = :foo }
=> :foo
irb(main):011:0> 

当然,您必须知道警告的来源并将其包装在方法中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM