Существует ли путь в Linux, чтобы иметь один не проверка пользователя root, если у другого не пользователь root есть полномочия к папке / файл?

Следующий сценарий Python должен сделать то, что Вы хотите:

#!/usr/bin/python
serv=[]
for l in open("servers.txt","r").xreadlines():  # for each server
    s,n = l.split(",") # extract server name and load
    n=int(n.split("#")[0].strip()) # ignore comments
    serv.append([s.strip(),n]) # store server and its load
for l in open("domain.txt","r").xreadlines(): # for each domain
    m = serv.index(min(serv,key=lambda i:i[1])) # find server with lowest load
    serv[m].append(l.strip()) # add the domain
    serv[m][1]=serv[m][1]+1 # increase the load
alloc=open("allocation.txt","w")
for l in serv:
    print>>alloc, " , ".join([l[0],str(l[1])] + l[2:]) # write output file
6
29.05.2014, 02:12
5 ответов
[1185160] В общем, единственный способ узнать, может ли пользователь B записывать в каталог D, это чтобы пользователь B попытался записать в каталог D.

Таким образом, в качестве корня, вы можете [1185657]su[1185658] к пользователю и попробовать это. Хотя это может быть не на 100% точным, так как вход пользователя в систему и ввод его пароля может что-то изменить (например, модуль pam может настроить криптографические ключи на основе пароля пользователя).

Почти так же точно, как и root, вы можете [1185659]su[1185660] обратиться к пользователю и использовать системный вызов [1185661]access(2)[1185662] или что-то в этом роде. Вероятно, это то, что делает оболочка, если вы используете тест [1185663] -w[1185664], а также то, что делает [1185665]/usr/bin/test[1185666]. Хотя, как предупреждает manpage, на NFSv2 проверка [1185667]actual[1185668] выполняется сервером, но тест на доступ [1185669]/usr/bin/test[1185666] выполняется локально, так что это может быть неправильно. Аналогичным образом, файловые системы FUSE могут сделать то же самое.

(В manpage [1185671]access(2)[1185672] также упоминается состояние гонки, которое является фундаментальным для того, что вы делаете: Права B на D могут меняться между моментом проверки и моментом, когда B действительно пытается записать в D.)

Кроме того, вы должны решить, насколько точно вы готовы принять:

Вы можете просмотреть каталог и проверить пользователей и группы (как показывают некоторые из других ответов).

Вы можете дополнительно проверить ACL в каталоге.

Но даже если вы это сделаете, следующее приведет вас в замешательство:

С NFS и различными другими сетевыми файловыми системами, сервер [1185886]принимает решение о том, разрешен ли доступ. Он может принять это решение, основываясь, ну, на том, что ему нравится. Рассмотрим, например, различные варианты экспорта в NFS squash.

net config server

Проверка разрешений на самом деле выполняется файловой системой; неUnix-файловые системы могут давать неожиданные ответы (как пользователь Unix отображается на SID для NTFS?). Все ставки выключены, например, с файловыми системами FUSE.

net share

6
27.01.2020, 20:21

"имеет ли пользователь Б права на запись в папку F"

Способность пользователя А определять это зависит от доступа А к папке F. Например, если F имеет значение [1185619]/home/B/foo/bar[1185620], а А не может читать [1185621]/home/B/foo[1185622], то А не может даже проверить, существует ли F, тем более, какие права на него установлены. Если предположить, что А имеет доступ на чтение к F, и поэтому [1185623] stat()

1[1185626] может получить права, то следующим шагом будет определение, является ли Б владельцем, или входит в группу. Что касается последнего, то список пользователей в группе можно получить с помощью [1185627]getgrent()[1185628] (native C -- у него есть man-страница; обратите внимание, что это не принимает аргументацию, а вместо этого выполняет итерацию [1185629]/etc/group[1185630] по одной записи за раз), что возвращает [1185631]struct group[1185632]: Последнее поле, [1185633]gr_mem[1185634], представляет собой массив строк, содержащих список имен пользователей (этот список завершается указателем [1185635]NULL[1185636]). Это, в сочетании с режимом файлов, является достаточной информацией для того, чтобы сказать вам, имеет ли конкретный пользователь право на запись.

Пример использования [1185637]getgrent()[1185638] для печати списка групп с идентификаторами и членами:

Доступ к [1185639]/etc/group[1185640] (и использование [1185641]getgrent()[1185642]) не требует никаких привилегий.

1 Вы не упоминаете, какой язык вы используете, но надеетесь, что "stat" будет достаточно агностичным. [1185884]getgrent()[1185885] тоже нужно портировать, но что зависит от языка.

4
27.01.2020, 20:21
[1185104]Ответ на первый вопрос (запущенный от имени root):

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters\

YES -> [1185567]su - userB -c ''

Ответ на второй вопрос:

MAYBE -> только если не пользователь принадлежит к той же группе, что и userB, и пытается коснуться файла в folderF[1185111].

2
27.01.2020, 20:21
[1185116] Если я правильно понимаю, необходимо проверить разрешение пользователя на определенную папку.

Так что, в основном, сначала запустите команду "Группы" на пользователе. В вышеприведенной команде будут перечислены все группы, к которым принадлежит [1185579]userB[1185580]. После этого

Используйте команду [1185581]stat[1185582], чтобы найти восьмеричные разрешения на файл/папку [1185583]как показано ниже. Вышеприведенная команда вернет восьмеричное разрешение на данный конкретный файл [1185585] папки [1185586]/[1185587] [1185588]. Например, если вышеприведенная команда возвращает [1185589]775[1185590], это означает, что [1185591] пользователь [1185592] и [1185593] группа [1185594] имеют полный [1185595]rwx[1185596] доступ к файлу/папке [1185597]r-x[1185602], другие [1185600] имеют доступ [1185601]r-x[1185602] к файлу/папке [1185603]/[1185604].

Определите группы [1185605] userA[1185606], а также используя команду [1185607] группы userA[1185608], и если оба [1185609] userA[1185610] и [1185611] userB[1185612] принадлежат к одной и той же группе, то это означает, что [1185613] userB[1185614] имеет [1185615] разрешения на запись [1185616] в файл. [1185129]

2
27.01.2020, 20:21
[1185112]Я не знаю ни одной команды для выполнения этой задачи, но есть несколько команд, которые позволили бы определить ответ без root.

ls -l F[1185570] покажет вам владельца и группу интересующего файла. Если пользователь не является владельцем, то можно проверить [1185571]group user[1185572], чтобы узнать, принадлежит ли пользователь к группе файла. Если пользовательB либо является владельцем, либо принадлежит к группе файла, то в разрешениях доступа для [1185573]u[1185574] и [1185575]g[1185576] (соответственно) вы увидите, какие у них есть права; в противном случае, в разрешениях доступа для [1185577]o[1185578] вы увидите, какие у этого пользователя есть права.[1185115].

2
27.01.2020, 20:21

Теги

Похожие вопросы