Ошибочный «Небезопасный мир записи dir foo в PATH» при запуске сценария ruby - PullRequest
1 голос
/ 19 апреля 2011

Когда я запускаю скрипт 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?
  • Как мне это заткнуть? Есть ли способ отключить только это конкретное предупреждение?

Ответы [ 3 ]

5 голосов
/ 19 февраля 2014

У нас была такая ситуация на работе, и хотя было бы неплохо просто исправить разрешения, это было невозможно в нашей среде.Вместо этого я создал следующий скрипт-обертку для 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.

См. Это превосходное объяснение о том, как это работает.


Другое исправление для этой проблемы (которая исключает скрипт-обертку) - это компиляция Ruby с CPPFLAGS="-D ENABLE_PATH_CHECK=0", установленным при запуске./configure.

2 голосов
/ 19 апреля 2011

Вы можете отключить все предупреждения с помощью

> ruby -W0 ...

Но это может скрыть другие проблемы. и вы сказали, что хотите скрыть только это конкретное предупреждение, и я не думаю, что есть способ сделать это, кроме как решить проблему, что, я думаю, связано с тем, что монтирование NFS неправильно передает фактическую маску. Я вижу это, когда я монтирую не Linux-сервер на Linux с NFS.

Как сервер snao или что-то, что не поддерживает атрибуты стиля Unix.

Кроме того, так как ошибка сообщает, что ей не нравится всемирный доступный для записи каталог в пути, вы можете удалить его из пути и использовать префикс для доступа к чему-либо в этом каталоге?

EDIT ... Другая идея состоит в том, чтобы отфильтровать вывод вашего сценария ruby ​​с помощью чего-то вроде ...

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

Это напечатало бы любой вывод, отличный от -v, кроме специального предупреждения.

Тем не менее, предупреждение является предупреждением безопасности, поэтому не рекомендуется размещать на вашем пути каталог, доступный для записи, так как любой может поместить туда вредоносный скрипт или исполняемый файл. И так же плохо иметь подключенный каталог bin, особенно тот, который вы не можете контролировать в своей переменной PATH. В этом случае проблема не имеет отношения к тому, доступен ли каталог для записи или нет, это факт, что в вашей переменной PATH есть сторонний каталог.

Хорошая практика требует, чтобы вы вынули этот смонтированный каталог из PATH, и предупреждение исчезнет. Если вам нужно выполнить что-то из этого каталога, то явно укажите полный путь к скрипту или исполняемому файлу.

На самом деле это не проблема Ruby, а проблема безопасности.

0 голосов
/ 26 января 2016

Вы можете написать метод, который будет подавлять предупреждения

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> 

Конечно, вам нужно знать, откуда поступают предупреждения, и обернуть их в метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...