Я вошел в систему, используя свое имя пользователя ravbholua
:
ravbholua@ravbholua-Aspire-5315:~$ echo $LOGNAME ravbholua
Я создаю файл с именем a1
:
ravbholua@ravbholua-Aspire-5315:~$ echo>a1
ravbholua@ravbholua-Aspire-5315:~$ ll a1
-rw-rw-r-- 1 ravbholua ravbholua 1 Oct 8 09:57 a1
Как и ожидалось, владельцем файла выше являюсь я ( ravbholua
).
Далее я создаю a2 с помощью sudo с помощью echo
команды:
ravbholua@ravbholua-Aspire-5315:~$ sudo echo>a2
ravbholua@ravbholua-Aspire-5315:~$ ll a2
-rw-rw-r-- 1 ravbholua ravbholua 1 Oct 8 09:57 a2
Владелец — только я, ravbholua
т.е.
Теперь я снова создаю a3 с помощью sudo, но с помощью vim
команды:
ravbholua@ravbholua-Aspire-5315:~$ sudo vim a3
ravbholua@ravbholua-Aspire-5315:~$ ll a3
-rw-r--r-- 1 root root 10 Oct 8 09:57 a3
Ой! как же так получилось, что владелец теперь меняется. Это не я, а root. Почему такое разнообразие с echo
и vim
! Удивительно, что ссмена командкак может измениться владелец созданного файла.
решение1
Второй пример выполняется echo
под управлением sudo
, ноперенаправлениепроисходит под оригинальной оболочкой.
sudo bash -c "echo > a4"
решение2
sudo
это всего лишь приказ.
Итак, ваш первый пример:
sudo echo>a2
sudo
это команда. И пока у вас есть перенаправление, упирающееся в эхо, это ничего не значит.
Например:
echo cat /etc/passwd > /tmp/foo
Вы не получите содержимое /etc/passwd в /tmp/foo. У вас будет только cat /etc/passwd
. sudo ничем не отличается. Часть echo — это просто аргумент для sudo. sudo использует его для выполнения чего-либо, но оболочка этого не знает.
Это одно из отличий доступа sudo от работы с правами root.
Для вашего примера, где вы используете sudo vim a3
sudo, он запускается vim a3
для вас как root. И vim запускается как root, поэтому файл принадлежит root.