Поскольку блок
-r-------- app2 app2 // fileA
-rwsr-x--- app2 app1 // Application
не является стандартным ls -l
выводом, я должен немного догадаться, что вы имеете в виду.
Я предполагаю, что ваше приложение app
имеет setuid
бит установлен и принадлежит тому же пользователю, что и файл fileA
, который вы хотите открыть.Я также предполагаю, что вы запускаете ваше приложение как другой пользователь, у которого нет доступа к fileA
.
Ваша первая попытка ./app < ./fileA
не работает, потому что это не программа app
, которая открывает fileA
.Ваша оболочка, которая, вероятно, работает от имени другого пользователя, пытается открыть файл для перенаправления ввода.Вы должны получить сообщение об ошибке из оболочки.setuid
бит app
здесь вам не поможет.
Вторая попытка echo ./fileA | ./app
неверна, поскольку echo
записывает имя файла, а не его содержимое.Вы, наверное, имеете в виду cat ./fileA | ./app
.Это не удастся аналогичным образом, потому что cat
попытается открыть файл как текущий пользователь после того, как оболочка соединила программы, используя канал.
Вы должны изменить свою программу так, чтобы онаоткрыть сам файл и прочитать из соответствующего дескриптора файла или FILE
вместо stdin
.Затем файл будет открыт с помощью app
, который работает как UID владельца файла приложения.
Вы можете использовать что-то вроде этого:
#include "stdio.h"
int main(int ac, char **av)
{
FILE *inFile;
if(ac < 2)
{
/* print usage and/or report error */
return 1;
}
/* Here the input file is opened by the setuid-application. */
inFile = fopen(av[1]);
if(inFile == NULL)
{
/* handle error */
return 2;
}
/* read and process data from inFile instead of stdin */
fclose(inFile);
return 0;
}
Если ваш app
двоичная программа, которую вы не можете изменить, вы можете реализовать программу-обертку, которая открывает файл, указанный в командной строке для чтения, дополнительно переключается на реальный идентификатор пользователя, подключает дескриптор файла к 0 (stdin
), используя dup2
и execl
s ваш app
.Вы можете сделать эту программу-оболочку setuid
для владельца входного файла.
Или, может быть, вы можете настроить sudo
, чтобы разрешить запускать app
от имени fileA.