Разделить на ноль исключение с помощью awk

Что вы можете сделать, так это реализовать некоторую форму 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.

В этом примере будет удалено разрешение на запись и выполнение для файла morebash. Это не лучший метод, так как вам придется удалить команды, которые вы не хотите, чтобы они использовали, вместо того, чтобы разрешить им использовать только su. Однако,это самый быстрый и простой способ, который я смог найти.

0
21.12.2020, 13:55
3 ответа

Если вы действительно хотите использовать awk, что сомнительно для такого простого скрипта, но имеет смысл для более сложного, вот два способа решить эту проблему:

  1. просто замените простые кавычки двойными кавычками. Простые препятствуют экспансии доллара. Это вводит другие проблемы, такие как требование экранирования существующих двойных кавычек и то же требование, если вы хотите использовать поля вawk).

    var=`awk "BEGIN {printf \"%.2f\n\", $var1/ $var2}"`
    
  2. передать переменные в awkправильно:

    var=$(awk -v var1="$var1" var2="$var2" 'BEGIN {printf("%`.2f\n",var1,var2)}')
    
0
18.03.2021, 22:41

используйте -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 зависнет в ожидании ввода)(забудьте о BEGIN в awk)
1
18.03.2021, 22:41

Здесь вы можете передать содержимое переменных $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.заставляет вычисление выполняться как с плавающей запятой ).

Однако учтите, что вам потребуется очистить содержимое этих переменных, иначе это будет еще одна уязвимость, связанная с выполнением произвольного кода, если содержимое этих переменных не находится под вашим контролем.

1
18.03.2021, 22:41

Теги

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