Что вы можете сделать, так это реализовать некоторую форму ACL (Список контроля доступа ).
В своих предыдущих комментариях я упомянул, что, по моему мнению, идея OP такая же, как у меня, и состоит в том, чтобы добавить еще один уровень безопасности, используя SSH для пользователей в качестве ограниченной учетной записи. Затем используйте пароль su
для другой учетной записи, которая имеет больше прав, но она была удалена.
Если вы хотите ограничить действия пользователя ec2-user
. Во-первых, убедитесь, что они не входят в группу sudoers
.
По умолчанию у них по-прежнему будет разрешение на чтение большинства файлов в системе, но они не смогут повысить свои права, чтобы редактировать их или читать файлы, которые недоступны для чтения всем.
Я нашел ряд решений, включая настройку ec2-user
в chroot
, которая ограничивает их определенным каталогом с помощью STFP. Это решение может быть не лучшим, поскольку вам нужно ec2-user
, чтобы иметь возможность su
и изменить каталог с /home/ec2-user
на /home/play
, я полагаю.
На мой взгляд, лучшим решением является применение ACL. Это способ ограничить команды, которые пользователи могут выполнять в оболочке.
Он работает, используя команду setfacl
и удаляя разрешения на чтение и выполнение для пользователя в файле /bin
.
setfacl -m u:ec2-user:r /bin/more
-m: to add read read access to the user.
u: user, can be changed to g(group) or o(other).
ec2-user: the user
r: give the user only read permission.
В этом примере будет удалено разрешение на запись и выполнение для файла more
bash. Это не лучший метод, так как вам придется удалить команды, которые вы не хотите, чтобы они использовали, вместо того, чтобы разрешить им использовать только su
. Однако,это самый быстрый и простой способ, который я смог найти.
Если вы действительно хотите использовать awk
, что сомнительно для такого простого скрипта, но имеет смысл для более сложного, вот два способа решить эту проблему:
просто замените простые кавычки двойными кавычками. Простые препятствуют экспансии доллара. Это вводит другие проблемы, такие как требование экранирования существующих двойных кавычек и то же требование, если вы хотите использовать поля вawk
).
var=`awk "BEGIN {printf \"%.2f\n\", $var1/ $var2}"`
передать переменные в awk
правильно:
var=$(awk -v var1="$var1" var2="$var2" 'BEGIN {printf("%`.2f\n",var1,var2)}')
используйте -v var=value
для передачи переменной в awk.
таким образом
awk -v var1="$var1" -v var2="$var2" 'BEGIN {printf "%.2f\n",var1/var2}'
дать
1.50
и
var=$(awk -v var1="$var1" -v var2="$var2" 'BEGIN {printf "%.2f\n",var1/var2}')
заданное значение.
вам нужно
-v var1="$var1"
превратить $var1 bash в var1 awk var1
вawk
(нет необходимости $
, $var1
с var1=6 будет $6
значением)echo
для ввода данных в awk
(, иначе awk зависнет в ожидании ввода)Здесь вы можете передать содержимое переменных $var1
и$var2
оболочки в качестве аргументов вашему скрипту awk
и получить к ним доступ в скрипте через специальную переменную массива ARGV
:
var=$(awk -- 'BEGIN {printf "%.2f", ARGV[1] / ARGV[2]}' "$var1" "$var")
Или вы можете экспортировать переменные оболочки var1
и var2
в среду для awk
, чтобы получить их через переменную массива ENVIRON
:
var=$(
export var1 var2
awk 'BEGIN {printf "%.2f", ENVIRON["var1"] / ENVIRON["var2"]}'
)
В общем случае часто предпочтительнее использовать аргументы ARGV
/ ENVIRON
вместо аргументов -v
или var=value
для передачи произвольных данных, поскольку последние искажают символы обратной косой черты (здесь не проблема для чисел хотя ).
Следует избегать встраивания расширения переменной оболочки в awk
аргумент кода, поскольку это представляет собой уязвимость внедрения кода. То же самое для забытого расширения параметров в кавычках в аргументах для-v
.
Обратите внимание, что если оболочка ksh93
или zsh
, вам вообще не нужно awk
здесь:
printf -v var %.2f '1.*var1 / var2' # zsh
var=${ printf %.2f '1.*var1 / var2'; } # ksh93
(где умножение на 1.
заставляет вычисление выполняться как с плавающей запятой ).
Однако учтите, что вам потребуется очистить содержимое этих переменных, иначе это будет еще одна уязвимость, связанная с выполнением произвольного кода, если содержимое этих переменных не находится под вашим контролем.