当我运行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
所以有两个问题:
答案 0 :(得分:5)
我们在工作中遇到过这种情况,虽然修复权限会很好,但在我们的环境中这是不可能的。相反,我为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目录中。
See this excellent explanation了解其工作原理。
此问题的另一个修复(避免了包装器脚本)是在运行CPPFLAGS="-D ENABLE_PATH_CHECK=0"
时使用./configure
设置编译Ruby。
答案 1 :(得分:2)
您可以使用
关闭所有警告> ruby -W0 ...
但这可能会隐藏其他问题。并且你确实说你只想隐藏那个特定的警告,我认为除了修复问题之外还有办法解决这个问题,我认为这是因为NFS挂载没有正确地转发实际的掩码。当我使用NFS在Linux上安装非Linux服务器时,我看到了这一点。
像snao服务器或不支持unix样式属性的东西。
此外,由于错误报告它不喜欢路径中的全局可写目录,您是否可以从路径中删除它,并使用前缀来访问该目录中的任何内容?
...编辑 另一个想法是用类似......
的东西过滤ruby脚本的输出> ruby ... | egrep -v "warning: Insecure world writable dir"
这将打印除特定警告之外的任何其他输出(-v)。
然而,警告是一个安全警告,在您的路径中有一个世界可写目录是一个坏主意,因为任何人都可以在其中放置恶意脚本或可执行文件。拥有一个已安装的bin目录同样糟糕,尤其是在PATH中无法控制的目录。在这种情况下,问题与目录是否可写无关,事实上你的PATH中有一个外来目录。
良好做法会要求您将已安装的目录从PATH中删除,警告将消失。如果您需要执行该目录中的某些内容,请显式提供脚本或可执行文件的完整路径。
这不是Ruby问题,而是安全问题。
答案 2 :(得分:0)
您可以编写一个抑制警告的方法
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>
当然,您必须知道警告的来源并将其包装在方法中。