Как создать файл в каталоге UNIX / tmp, чтобы все пользователи могли читать и писать в него? - PullRequest
4 голосов
/ 18 октября 2008

Я пытаюсь создать файл в каталоге / tmp (работает на Linux UBUNTU 7.10), который имеет права на чтение / запись / выполнение для любого пользователя. Поэтому я использую функцию «open (fileName, O_CREAT | O_RDWR, 0777)» для создания файла (из программы на C) в учетной записи user1, и я бы хотел, чтобы user2 мог писать в конкретный файл. Однако, когда я проверяю каталог / tmp (с помощью ls -l), я вижу, что у меня нет разрешения на запись для user2 (учитывая тот факт, что user1 создал его, у меня есть доступ на запись для user1, но user2, который считается быть "другими" не имеет никакого доступа). Я попытался использовать режим 0766 в функции открытия (и такие комбинации 7 и 6 для режимов), чтобы я мог получить доступ на запись для user2, но у меня все еще нет необходимого доступа.

Ответы [ 5 ]

8 голосов
/ 18 октября 2008

Вы должны установить свой umask равным 000. Биты umask удаляются из выбранного вами разрешения, и значение umask по умолчанию обычно составляет 022 или 002.

Обратите внимание, что такие вещи, как списки ACL по умолчанию и метки SELinux, также могут влиять на читаемость и возможность записи файлов. Используйте getfacl для просмотра ACL и ls -Z для просмотра меток SELinux; для SELinux вы также должны знать, какие политики активны и как они влияют. Присутствие ACL также можно увидеть на ls -l как символ + после разрешений.

3 голосов
/ 18 октября 2008

Как отметил CesarB, Unix сбрасывает биты, которые установлены в umask процесса, поэтому, чтобы получить полный доступ, вам придется сбросить umask - временно.

 mode_t oldmask = umask(0);
 fd = open(...);
 oldmask = umask(oldmask);
 assert(oldmask == 0);

(ОК; вам не нужно делать утверждение; оно не сработает.)

Как отметил Пистос, создание файлов в / tmp - сложный процесс. Если вы считаете, что файла еще не было, добавьте O_EXCL, чтобы избежать следующих символических ссылок в неожиданных местах.

И последнее замечание - зачем вам делать исполняемый файл? Я думаю, что вы должны стремиться только к 666 разрешениям, а не к 777 или 766. Вы, безусловно, не должны запускать программы, которые другие могут изменить в любое время (поэтому владелец не должен иметь разрешения на выполнение файла, в который другие могут писать), и члены группы, вероятно, тоже не оценят щедрость. Другие могут, возможно, получить то, что они заслуживают, если они выполнят файл - но это все равно нехорошо.

2 голосов
/ 18 октября 2008

Я предполагаю, что вы пытаетесь выполнить IPC. Вы решили использовать другие средства для достижения этой цели, например, использовать dbus или другие системы, разработанные для этой цели?

2 голосов
/ 18 октября 2008

FWIW, это угроза безопасности - создавать что-либо в / tmp (или / var / tmp и т. Д.) С фиксированным именем. Символическая ссылка может быть настроена в / tmp с тем же именем, указывающим на что угодно, и ваша программа уничтожит целевой файл, если у пользователя, запустившего вашу программу, есть права на это.

Вещи, созданные программно в / tmp, должны иметь произвольные имена, но лучше вообще не использовать этот каталог, если вся ваша система не защищена (без потенциально злонамеренных пользователей).

1 голос
/ 18 октября 2008

Единственное, что вы можете сделать, это изменить файл после его создания:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {
  creat("/tmp/foo", 0);
  chmod("/tmp/foo", 0666);
}

В любом случае, файлы такого типа небезопасны.

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