Ни один из +
, -
, 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
имеют встроенные арифметические расширения через оператор $((...))
и лучшую форму подстановки команд с $(...)
вместо `...`
.
Когда я перехожу от b к a от имени пользователя wilmes, почему сохраняется первоначальный владелец a (root)?
Потому что cp
по умолчанию (без флагов -a
или -p
) не изменяет время или владельца целевого файла. В вашем случае файл a
принадлежит root
, но поскольку у вас есть права на запись через группу, вы можете модифицировать файл, в том числе обрезать его и перезаписать полностью. Чего вы не можете сделать, так это изменить временные метки, поскольку это может сделать только владелец файла.
Если целевой файл не существует, он будет создан с uid пользователя, запустившего cp
, то есть wilmes
. (И без привилегий суперпользователя вы также не могли изменить владельца.)
Однако, поскольку у вас также есть права на запись в каталог, вы можете сначала удалить целевой файл, а затем создать его заново, и в этом случае он будет принадлежать пользователю, запустившему cp
.
Это не удается, потому что вы должны быть целью (владельцем файла ), 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
. Это было бы ужасно. Действительно очень ужасно.