Концепция - это концепция разрешений. Чтобы объяснить это, нам сначала нужно взглянуть на две вещи: uid и файловая система.
В Unix-подобных системах у каждого пользователя есть идентификатор пользователя (UID) в дополнение к имени пользователя и другим свойствам. uid - это число. { {1}} Этот uid не может быть изменен самим пользователем. Вы можете проверить свой uid с помощью команды
$ id
uid=1001(username) gid=1001(username) groups=1001(username)
. Uid в этом примере вывода - 1001. uid - это уникален только в одной операционной системе. Если у вас два компьютера, два пользователя могут иметь один и тот же uid.
Unix-подобная файловая система хранит для каждого файла uid владельца файла и разрешения, которые владелец имеет для этого файла, и многое другое.
Вы можете увидеть права доступа к файлу, выполнив
$ ls -l file
-rw-r--r-- 1 username usergroup 1145 27 Feb 07:15 file
. Разрешения для владельца: « -
rw-
r - r -
», поэтому владелец может читать файл и записывать в файл.
Для окончательного понимания схемы разрешений нам понадобится ядро системы Unix.
Каждый раз, когда мы обращаемся к файлу или делаем что-то с файлом, мы не касаемся файла напрямую. Вместо этого мы используем системный вызов, который просит ядро сделать эту работу за нас. Внутри системного вызова есть процедуры для получения uid пользователя и получения прав доступа к файлу. Затем ядро проверяет, совпадает ли владелец файла с uid пользователя; и если это так, он затем проверяет, есть ли у пользователя необходимое разрешение.
Уловка в том, что обычный пользователь не может влиять на ядро. Ядро запускается в процессе загрузки компьютера, и затем на него может влиять только пользователь root (с uid = 0).
Пользователь не может изменить свой uid, и он не может изменить права доступа к файлу, которым он не владеет (ему придется изменить свой uid), потому что ядро управляет этими вещами, и только root может их изменить.
Подробнее о разрешениях здесь и о системных вызовах и их работе здесь . А если вы хотите знать, что еще хранится в файловой системе, прочтите это об индексных дескрипторах.
Этот ответ даст вам лишь небольшое представление о схеме разрешений, но я надеюсь, что он поможет вам лучше понять вещи, которые я упустил, например
sudo
и su
Оказалось, что решение оказалось проще, чем я ожидал, просто добавив в stderr -v
журналы параметров, которые пересылаются между клиентом и сервером. В моем примере это будет следующее:
socat -v TCP:localhost:8888 pty,rawer &> com.log