Я пытаюсь предотвратить выполнение команды в BASH.. Не всегда работает

Это следствие установки -e. Любая команда с кодом выхода 1 (не ноль )вызовет выход.

Этот скрипт работает нормально:

#!/bin/bash
(( success++))
echo "Still going 1 $success"

Это не

#!/bin/bash
set -e
(( success++))
echo "Still going 1 $success"

Решения

Самое простое — убрать строку set -e.

Если это невозможно, используйте:

(( ++success ))

Другие варианты:

#!/bin/bash

set -e
success=0
success=$(( success+1 ))
echo "still going 1 $success"

success=0
(( success=success+1 ))
echo "still going 2 $success"

success=0
(( success+=1 ))
echo "still going 3 $success"

success=0
(( ++success ))
echo "still going 4 $success"

success=0
(( success++ ))
echo "still going 5 $success"

Только опция номер 5 будет иметь код выхода 1.

Другие (более сложные решения для любого значения переменнойa).
Первый использует встроенный(POSIX )двоеточие(:), чтобы сделать его совместимым с POSIX.

: $(( a+=1 ))        ; echo "6 $a $?"   ## Valid Posix
   (( a++ )) || true ; echo "7 $a $?"
   (( a++ )) || :    ; echo "8 $a $?"
   (( a++, 1 ))     ; echo "9 $a $?"
   (( a++ | 1 ))     ; echo "10 $a $?"

-1
08.02.2018, 09:48
1 ответ

Me temo que no es posible restringir la ejecución de comandos con la trampa DEBUG dentro de un shell no -interactivo.

Alternativamente, puede probar diferentes enfoques:

Restricción con rbash,BASH _ENV y comando _no _encontrado _identificador

  • Configurar un usuario de prueba
  • Enlace simbólico a los comandos permitidos dentro de la prueba -usuarios dirección de inicio

ejemplo:

allow=(bash cat sed)
user="ruser"
homedir="/home/$user"
mkdir "$homedir/bin"
for c in ${allow[@]}; do
  ln -s /bin/$c $homedir/bin
done
  • Configure la variable PATHen /home/$user/.bashenvrcy asegúrese de que solo enumere los enlaces que desea permitir, por ejemplo/home/$user/bin;...;...
  • Establecer BASH_ENV=/home/$user/.bashenvrcdesde/home/$user/.bashrc
  • Use un shell restringido a través de bash -rpara que el usuario no pueda ejecutar nombres de comandos que contengan barras, por ejemplo /bin/sh.

Pero tenga en cuenta las debilidades de seguridad de rbash .

¿Quiere más posibilidades de restricción detalladas? Puede extender este método con la función command_not_found_handle (), de modo que cada comando que no se encuentre en PATHpueda manejarse en detalle.

function command_not_found_handle () {
  while read -r pattern; do
    [[ "$1" =~ $pattern ]] \
    && command="/bin/restrict/$1" \
    && [ -h $command -a -x $command ] \
    && shift \
    && { $command "$@"; return $?; }
  done </bin/restrict/whitelist
  echo "Command '$1' not found."
}

Restricción con rbash, blacklist y wrappers

  • Configurar una lista negra como root

ejemplo:

cat <<EOF >/home/cmd_blacklist
  ~/bin/ls -al
  ~/bin/rm -rf
EOF
chmod g-wx+r,o-wx+r /home/cmd_blacklist
  • Agregar BASH_ENV=~/.bashenvrca~/.bashrc
  • Editar~/.bashenvrc

ejemplo:

PATH="$HOME/bin"
errmsg='arguments not allowed: $cmd $pattern'
while read -r cmd pattern; do
  [ ! -e "$cmd" ] && continue # skip nonexistent
  [ "$cmd" == "$(basename $cmd)" ] && continue  # prevent recursion
  eval "function $(basename $cmd) () { [[ \"$(printf $'%s ' \$@)\" =~ $pattern ]] && echo \"$errmsg\" || $cmd \"\$@\"; }"
done </home/cmd_blacklist

Ahora se deben leer todas las líneas de la lista negra del formulario [cmd] [patrón], a partir de las cuales se generan las funciones de contenedor. También puede exportar las funciones de contenedor a la subcapa

Lecturas adicionales y método sencillo con sudo

Para muchos casos editar la configuración de sudoers para restringir la ejecución de comandos es la mejor opción.

1
28.01.2020, 05:10

Теги

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