![](/img/trans.png)
[英]Insecure world writable dir /Users/username in PATH, mode 040777 when running Ruby commands
[英]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創建了以下包裝腳本,以抑制錯誤。
#!/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.