В Java, что именно делает File.canExecute ()? - PullRequest
4 голосов
/ 21 мая 2009

Я создал простой файл, у которого нет разрешения на выполнение, но когда я создаю объект Java-файл, используя путь / имя этого файла, а затем вызываю File.canExecute (), в результате я получаю значение true, тогда как я ожидаю, что этот метод позвонить, чтобы вернуть ложь. Может кто-нибудь объяснить, что мне здесь не хватает?

Solaris:

$ touch /tmp/nonexecutable
$ ls -l /tmp/nonexecutable
-rw-r--r--   1 root     root           0 May 21 07:48 /tmp/nonexecutable

Java:

String pathName = "/tmp/nonexecutable";
File myFile = new File(pathName);
if (!myFile.canExecute())
{
    String errorMessage = "The file is not executable.";
    log.error(errorMessage);
    throw new RuntimeException(errorMessage);
}

Заранее спасибо за помощь.

- Джеймс

Ответы [ 3 ]

5 голосов
/ 21 мая 2009

Ничего общего с Java - вы работаете от имени пользователя root, и пользователю root разрешено все, независимо от того, что говорят разрешения.

3 голосов
/ 21 мая 2009

Хотя я не эксперт, и это не ответит на ваш вопрос должным образом, я хотел бы добавить, что это поведение не характерно для Java. Из справочной страницы find (GNU findutils) 4.4.0 в моей установке Ubuntu 8.10 относительно флага -executable:

Соответствует файлам, которые исполняемые файлы и каталоги, которые с возможностью поиска (в разрешении имени файла смысл). Это учитывает списки контроля доступа и др. артефакты разрешений, которые -perm тест игнорирует. Этот тест делает использование системного вызова access(2), и так могут быть одурачены серверами NFS которые выполняют сопоставление UID (или корень-давка), так как многие системы внедрить access(2) в клиент ядро и поэтому не может использовать UID, отображающий информацию, хранящуюся на сервер. Потому что этот тест основанный только на результате access(2) системный вызов, нет гарантировать, что файл, для которого это тест на самом деле может быть выполнено .

0 голосов
/ 23 апреля 2013

Вот ошибка, которая была открыта в JDK по этому вопросу:

http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=8b833c54cb93d6c9cf416667dc02?bug_id=6379654

Вывод заключается в том, что File.canExecute () просто переводится в собственный вызов posix для доступа (path, X_OK) Linux возвращает false, а Solaris возвращает true для этого вызова при запуске от имени пользователя root.

Наконец, ошибка была закрыта как Wont Fix! :)

...