Как можно написать агрегат по столбцу с groupby по другим столбцам и условия по столбцу времени?

Почему бы вам не написать свою собственную оболочку для входа? Было бы довольно просто использовать Bash для этого, но вы можете использовать любой язык.

Пример в Bash

Используйте свой любимый редактор для создания файла /root/rbash.sh (это может быть любое имя или путь, но должно быть chown root:root и chmod 700):

#!/bin/bash

commands=("man" "pwd" "ls" "whoami")
timestamp(){ date +'%Y-%m-%s %H:%M:%S'; }
log(){ echo -e "$(timestamp)\t$1\t$(whoami)\t$2" > /var/log/rbash.log; }
trycmd()
{
    # Provide an option to exit the shell
    if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]]
    then
        exit

    # You can do exact string matching for some alias:
    elif [[ "$ln" == "help" ]]
    then
        echo "Type exit or q to quit."
        echo "Commands you can use:"
        echo "  help"
        echo "  echo"
        echo "${commands[@]}" | tr ' ' '\n' | awk '{print "  " $0}'

    # You can use custom regular expression matching:
    elif [[ "$ln" =~ ^echo\ .*$ ]]
    then
        ln="${ln:5}"
        echo "$ln" # Beware, these double quotes are important to prevent malicious injection

        # For example, optionally you can log this command
        log COMMAND "echo $ln"

    # Or you could even check an array of commands:
    else
        ok=false
        for cmd in "${commands[@]}"
        do
            if [[ "$cmd" == "$ln" ]]
            then
                ok=true
            fi
        done
        if $ok
        then
            $ln
        else
            log DENIED "$cmd"
        fi
    fi
}

# Optionally show a friendly welcome-message with instructions since it is a custom shell
echo "$(timestamp) Welcome, $(whoami). Type 'help' for information."

# Optionally log the login
log LOGIN "$@"

# Optionally log the logout
trap "trap=\"\";log LOGOUT;exit" EXIT

# Optionally check for '-c custom_command' arguments passed directly to shell
# Then you can also use ssh user@host custom_command, which will execute /root/rbash.sh
if [[ "$1" == "-c" ]]
then
    shift
    trycmd "$@"
else
    while echo -n "> " && read ln
    do
        trycmd "$ln"
    done
fi

Все, что вам нужно сделать, - установить этот исполняемый файл в качестве вашей оболочки входа. Например, отредактируйте файл /etc/passwd и замените текущую оболочку входа этого пользователя /bin/bash на /root/rbash.sh.

Это простой пример, но вы можете сделать его как продвинутый, как вы хочу, идея есть. Будьте осторожны, чтобы не блокировать себя, изменяя оболочку входа собственного и единственного пользователя. И всегда проверяйте странные символы и команды, чтобы убедиться, что они действительно защищены.

Вы можете протестировать его с помощью: su -s /root/rbash.sh.

Остерегайтесь, убедитесь, что они соответствуют всей команде, и будьте осторожны с подстановочными знаками! Лучше исключить Bash-символы, такие как ;, &, &&, ||, $ и обратные выходы.

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

0
задан Zac Ebr 2 March 2019 в 12:51
поделиться