Это следствие установки -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 $?"
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:
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
PATH
en /home/$user/.bashenvrc
y asegúrese de que solo enumere los enlaces que desea permitir, por ejemplo/home/$user/bin;...;...
BASH_ENV=/home/$user/.bashenvrc
desde/home/$user/.bashrc
bash -r
para 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 PATH
pueda 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."
}
ejemplo:
cat <<EOF >/home/cmd_blacklist
~/bin/ls -al
~/bin/rm -rf
EOF
chmod g-wx+r,o-wx+r /home/cmd_blacklist
BASH_ENV=~/.bashenvrc
a~/.bashrc
~/.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
Para muchos casos editar la configuración de sudoers para restringir la ejecución de comandos es la mejor opción.