
Я создал эту функцию bash, чтобы определить, действительно ли запущенный пользователь вошел в систему как пользователь root и не использует sudo, проверив uid + домашний каталог пользователя, выполняющего команду:
#!/bin/bash
set -x
function check_root(){
home=`sh -c 'cd ~/ && pwd'`
if [ "$home" != "/root" ] || [ "$(id -u)" != "0" ]; then
echo -e "This script can only be executed by the root user, not with sudo elevation"
exit 1
fi
}
check_root
Когда я запускаю его как обычный пользователь (uid 1000), он работает так, как и ожидалось:
++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/home/jake
++ '[' /home/jake '!=' /root ']'
++ echo -e 'This script can only be executed by the root user, not with sudo elevation'
This script can only be executed by the root user, not with sudo elevation
++ exit 1
Когда я запускаю его как root, он также работает так, как и ожидалось:
++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/root
++ '[' /root '!=' /root ']'
+++ id -u
++ '[' 0 '!=' 0 ']'
Но когда я запускаю его как обычный пользователь (uid 1000) с повышением прав sudo, я получаю это:
./check_root.sh: 4: ./check_root.sh: Syntax error: "(" unexpected
Системная информация:
Linux jake 3.11.0-26-generic #45~precise1-Ubuntu SMP Вт 15 июля 04:02:35 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bash --version GNU bash, версия 4.2.25(1)-release (x86_64-pc-linux-gnu)
решение1
Я решил эту проблему, но пока не опубликовал решение — оно оказалось связано с синтаксисом:
Рабочие решения:
function check_root {
stuff..
}
и
function check_root () {
stuff..
}
Например, удаление () из объявления функции или обеспечение разделения пробелами с обеих сторон исправляет эту проблему.
Вот что я нашел на странице руководства bash, что помогло мне обнаружить ошибку:
Shell Function Definitions
A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters. Shell functions are declared as follows:
name () compound-command [redirection]
function name [()] compound-command [redirection]
This defines a function named name. The reserved word function is optional. If the function reserved word is supplied, the parentheses are optional
Но... я понятия не имею, что именно заставляет bash вести себя таким образом в этом случае.