Если вы хотите иметь iptables
доступ к своим контейнерам, вам необходимо включить определенные возможности с помощью переключателя --cap-add=NET_ADMIN
при первоначальном запуске контейнера.
$ docker run --cap-add=NET_ADMIN -it ubuntu:16.04
Затем в контейнере настройте iptables
иsudo
:
# apt update -y
# apt-get install iptables sudo -y
Затем внутри контейнера настройте пользователя user1
и добавьте его в группу sudo
:
# adduser user1
# adduser user1 sudo
Затем установите пользователя наuser1
:
# su - user1
Проверьте user1'
разрешения sudo:
$ sudo -l
[sudo] password for user1:
Matching Defaults entries for user1 on 1356bf8bd61a:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User user1 may run the following commands on 1356bf8bd61a:
(ALL : ALL) ALL
Проверьте, могут ли они получить доступ к iptables
через sudo
:
.
$ sudo iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Попробуйте:
$ ERRORS=1153 TOTAL=43525
$ echo "scale = 3; $ERRORS * 100 / $TOTAL" | bc
2.649
вместо этого. Посмотрите, как в этом случае scale = 3
подается на bc
для установки масштабной переменной из bc
, которая представляет собой количество цифр, которое оно сохраняет после системы счисления при делении, и как мы сделали умножение на 100 до деления.
Обратите внимание, что это усечение, а не округление. 8 *100 / 9, станет, например, 88,888, а не 88,889.
Если ваша оболочка поддерживает арифметику с плавающей запятой (ksh93, zsh, yash ), вы также можете:
$ printf '%.3f\n' "$((ERRORS * 1e2 / TOTAL))"
2.649
(однако обратите внимание, что в zsh и ksh93 очень важно контролировать содержимое этих переменных, поскольку в противном случае это может привести к уязвимости внедрения команд. Мы используем1e2
(число с плавающей запятой 100, а 100
— целое число )вместо 100.
, как в ksh93, 100.
не будет работать в локалях, использующих ,
в качестве десятичной системы счисления ).
Или вы можете использоватьawk
:
$ awk -- 'BEGIN{printf "%.3f\n", ARGV[1] * 100 / ARGV[2]}' "$ERRORS" "$TOTAL"
2.649
Оба из них дадут вам 88,889% (или, возможно, 88 889 в зависимости от региона )для 8 из 9.