Почему cp не устанавливает атрибуты источника и не работает с -p?

Ни один из +, -, x или / не является специальным для оболочки или команды []. Ваша проблема в том, что:

  • -eq предназначен для числового сравнения. Используйте = вместо сравнения строк
  • вы забыли заключить свои переменные в кавычки
  • == не является стандартным sh [ оператором

Итак:

if [ "$2" = + ]; then
  res=`expr "$1" + "$2"`
fi

Или используйте конструкцию case:

case $2 in
  + | - | /) res=`expr "$1" "$2" "$3"`;;
          x) res=`expr "$1" "*" "$3"`;;
          *) echo >&2 invalid; exit 1;;
esac

Обратите внимание, что вы бы использовали expr только если бы имели дело с древними системами. Современные стандартные реализации sh имеют встроенные арифметические расширения через оператор $((...)) и лучшую форму подстановки команд с $(...) вместо `...`.

2
22.06.2017, 13:16
2 ответа

Когда я перехожу от b к a от имени пользователя wilmes, почему сохраняется первоначальный владелец a (root)?

Потому что cpпо умолчанию (без флагов -aили -p) не изменяет время или владельца целевого файла. В вашем случае файл aпринадлежит root, но поскольку у вас есть права на запись через группу, вы можете модифицировать файл, в том числе обрезать его и перезаписать полностью. Чего вы не можете сделать, так это изменить временные метки, поскольку это может сделать только владелец файла.

Если целевой файл не существует, он будет создан с uid пользователя, запустившего cp, то есть wilmes. (И без привилегий суперпользователя вы также не могли изменить владельца.)

Однако, поскольку у вас также есть права на запись в каталог, вы можете сначала удалить целевой файл, а затем создать его заново, и в этом случае он будет принадлежать пользователю, запустившему cp.

2
27.01.2020, 21:58

Это не удается, потому что вы должны быть целью (владельцем файла ), cp не отменяет базовую безопасность Unix. Пользователь может сохранять свои собственные файлы, wilmes -> wilmes, но не может делать это для других пользователей, и уж точно не для root. Я предполагаю, что вы не вошли в систему ни как root, ни как wilmes.

В этом случае один файл принадлежит пользователю root, а другой — пользователю wilmes. Для сохранения попробуйте запустить:

sudo cp -p b a

Соответствующие ссылки:

Пример:

Создать файл для root, a, и файл для обычного пользователя (joe ), b.

joe@testbed:~/tmp2$ sudo touch a
joe@testbed:~/tmp2$ touch b

Проверьте правильность разрешений.

joe@testbed:~/tmp2$ ls -l
total 0
-rw-r--r-- 1 root    root    0 Jun 22 13:51 a
-rw-r--r-- 1 joe     joe     0 Jun 22 13:51 b

Попытка скопировать принадлежащий пользователю файл b поверх файла, принадлежащего пользователю root (, что нарушит права доступа):

joe@testbed:~/tmp2$ cp -p b a
cp: cannot create regular file 'a': Permission denied

Повторите копирование как root, права доступа сохранены:

joe@testbed:~/tmp2$ sudo cp -p b a
joe@testbed:~/tmp2$ ls -l
total 0
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 a
-rw-r--r-- 1 joe joe 0 Jun 22 13:51 b

Примечание :Отказано в доступе, а не Операция не разрешена . Я предполагаю, что вы видите не разрешено, потому что пользователь wilmes ДЕЙСТВИТЕЛЬНО имеет доступ к файлу через группу, однако он не является владельцем , поэтому он не может полностью перезаписать его.

По логике, вы заменяете файл, принадлежащий другому пользователю (root ), и просите систему также сделать вас владельцем этого файла, что было бы катастрофической уязвимостью в системе безопасности.

Например, что, если бы я пришел как обычный пользователь malicious.username01и захотел заменить crontab на что-то вроде ntp, принадлежащего root? Если бы то, что вы пытаетесь сделать, сработало, я мог бы просто написать свою собственную вредоносную версию, а затем просто cp -p my-malicious-script /etc/cron.daily/ntp. Это было бы ужасно. Действительно очень ужасно.

4
27.01.2020, 21:58

Теги

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