簡體   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