Como posso limitar ou restringir o acesso a um aplicativo?

14

Meu filho recebeu um novo laptop no Natal passado, principalmente para uso em sua nova escola ... E agora que ele tem seu próprio laptop, ele está feliz por ter o Steam instalado.

Mas a esposa quer que eu remova o Steam, porque o laptop é principalmente para uso escolar ... Eu prefiro não fazer isso, se eu não precisar.

Existe alguma maneira de restringir ou limitar o acesso ao Steam? Talvez uma senha no próprio Steam, ou definir horários durante os quais ele pode ser executado?

Idealmente , tem que ser algo muito simples para usar porque o meu trabalho muitas vezes me mantém longe de casa (e computadores, e telecomunicações e ...) por muito tempo períodos de tempo e enquanto minha esposa não é tão confortável em torno de computadores como eu sou, mais fácil de usar é longe, longe melhor.

Certamente há alguma coisa por aí que possa realizar essa tarefa?

    
por Gregory Opera 28.01.2016 / 07:39

4 respostas

2

Defina um limite de tempo em um processo ou aplicativo

Com um pequeno script de segundo plano, você pode definir um limite de tempo em um processo ou aplicativo.
Contanto que seu usuário não saiba a senha do administrador , ele não será ultrapassado com muita facilidade .

A solução abaixo

É um script de segundo plano pequeno. Ele limita o uso por dia a um número definido de minutos, para definir a cabeça do script. Uma vez configurado (o que não é muito difícil), é muito fácil, e nenhuma ação adicional é necessária depois.

O script

#!/usr/bin/python3
import subprocess
import os
import sys
import time

#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"

uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"

def read(f):
    try:
        return int(open(f).read().strip())
    except FileNotFoundError:
        pass

currday1 = read(datefile)

while True:
    time.sleep(10)
    currday2 = int(time.strftime("%d"))

    # check if the day has changed, to reset the used quantum
    if currday1 != currday2:
        open(datefile, "wt").write(str(currday2))
        try:
            os.remove(uselog)  
        except FileNotFoundError:
            pass

    try:
        # if the pid of the targeted process exists, add a "tick" to the used quantum
        pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
        n = read(uselog)
        n = n + 1 if n != None else 0
        # when time exceeds the permitted amount, kill the process
        if n > minutes*6: 
            subprocess.Popen(["kill", pid])
        open(uselog, "wt").write(str(n))
    except subprocess.CalledProcessError:
        pass

    currday1 = currday2

Como usar

  1. Na sua área de trabalho (ou em qualquer outro lugar), crie uma pasta chamada: limit
  2. Copie o script em um arquivo vazio, salve-o como limit_use (sem extensão) dentro da pasta e torne-o executável
  3. Edite na cabeça do script o nome do processo a ser limitado e o número máximo de minutos permitidos. No exemplo:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the process name to limit below
    app = "gedit"
    
  4. Copie a pasta para o diretório /opt :

    cp -r /path/to/limit /opt
    
  5. Agora edite /etc/rc.local para fazer o script executá-lo como root na inicialização:

    sudo -i gedit /etc/rc.local
    

    Pouco antes da linha

    exit 0
    

    outra linha:

    /opt/limit/limit_use &
    

É isso

Quando alguém tenta matar o script de fundo:

(ação não permitida)

Explicação; como funciona

  • Uma vez por 10 segundos, o script será exibido se o processo segmentado estiver em execução. Em caso afirmativo, "adiciona" um "ponto" a um uso total, a ser registrado em um arquivo ( /opt/limit/uselog ). Se o limite diário for atingido, o script não permitirá mais a execução do processo, eliminando-o se existir.
  • Na alteração do dia (a data é gravada em um arquivo, portanto, a reinicialização não ajudará), o arquivo de log é excluído, permitindo que uma nova quantidade de tempo de uso seja acumulada.
  • Como o script é executado em inicialização , de rc.local apenas usuário (s) com privilégios sudo pode parar o script, mesmo assim, somente se o usuário souber o nome do processo.

Pare o script

Caso você queira interromper o script, use o comando:

sudo kill "$(pgrep limit_use)"

Mas, novamente, você precisaria da senha do sudo para fazer isso.



EDITAR

Embora o script acima forneça uma maneira razoavelmente segura de limitar o uso de um aplicativo, como mencionado por @Bytecommander, ele pode ser ultrapassado, embora não seja muito fácil. A combinação com a medida abaixo tornará muito improvável que isso aconteça, a menos que seu filho conheça a configuração e seja bastante experiente com o Linux / Ubuntu.

Medida adicional

Um pouco mais longe de uma "solução simples", mas ainda não muito difícil de configurar, está a medida adicional abaixo. Se nosso delinquente suspeito descobrir que o script é chamado de /etc/rc.local , conseguiria se tornar root e remover a linha em /etc/rc.local , ou seria capaz de Para parar o script dessa forma, podemos confrontá-lo com o próximo problema: a tela escurece após o login. Além disso, a solução verifica se o script de segundo plano está em execução após 5 minutos após a reinicialização, tornando-se apagado.

A medida extra é uma inicialização - verifique se a linha /opt/limit/limit_use & está presente em /etc/rc.local , e uma verificação após 5 minutos se o script ainda estiver em execução. Como o script é executado a partir de um iniciador (oculto de aplicativos de inicialização) em /etc/xdg/autostart , será muito difícil descobrir o que está acontecendo, a menos que você saiba como isso é feito. A combinação dessas duas medidas faz com que seja improvável que seu filho descubra, e se isso acontecer, provavelmente nada o impedirá.

Como configurar

Dois passos simples estão envolvidos:

  1. Copie o código abaixo em um arquivo vazio, salve-o como blackout.desktop em sua área de trabalho:

    [Desktop Entry]
    Name=not allowed
    Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
    Type=Application
    Terminal=false
    NoDisplay=true
    

    Copie o arquivo para /etc/xdg/autostart :

    sudo cp /path/to/blackout.desktop /etc/xdg/autostart
    
  2. Copie o script abaixo em um arquivo vazio, salve-o como blackout.py em sua área de trabalho, torne-o executável e copie-o para /usr/local/bin :

    cp /path/to/blackout.py /usr/local/bin
    

    O script

    #!/usr/bin/env python3
    import subprocess
    import time
    
    def dim_screen():
        screen = [
            l.split()[0] for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\
            if " connected" in l
            ]
        for scr in screen:
            subprocess.Popen(["xrandr", "--output", scr, "--brightness", "0"])
    
    if not "/opt/limit/limit_use &" in open("/etc/rc.local").read():
        dim_screen()
    
    time.sleep(300)
    
    try:
        pid = subprocess.check_output(["pgrep", "limit_use"]).decode("utf-8").strip()
    except subprocess.CalledProcessError:
        dim_screen()
    

Explicação

Os lançadores em /etc/xdg/autostart iniciarão um aplicativo (nesse caso, o check-up extra de segurança) para todos os usuários. Isso poderia ser sobregravado localmente, mas você precisa conhecer as execuções de check-up. Colocando a linha NoDisplay=true em nosso lançador, ele não aparecerá localmente em Startup Applications , portanto, sem saber que existe, é improvável que seja descoberto.

Além disso, seu filho tem apenas 15 segundos para descobrir (então a tela fica preta), então ele teria um problema sério, a menos que ele seja genial, tenha muita experiência com o Ubuntu e uma mente criativa.

    
por Jacob Vlijm 28.01.2016 / 17:37
4

De minha própria experiência, restringir o acesso a jogos de computador é uma das tarefas mais desafiadoras na educação de nossos filhos. É claro que nós, pais, queremos que eles usem seus computadores principalmente para a escola, mas isso entra em conflito com as intenções do garoto. Eles nos odeiam por dar-lhes hardware utilizável apenas para a escola.

E é claro que também queremos que eles aprendam a usar o computador de uma maneira sensata, incluindo como usá-lo não apenas para o trabalho, mas também para o lazer. Isso inclui jogos e assistir a vídeos.

Infelizmente, bem mantido e trabalhando controle dos pais para restringir a computação da criança é quase não disponível para o Ubuntu. Outra questão importante é que, assim que eles são garotos inteligentes , todas as medidas que tomamos se tornam em vão. Eles sempre encontrarão maneiras de superar nossas restrições, no caso de serem realmente espertos sem que possamos sequer notar.

Qualquer software de bloqueio ou restrições PAM executadas no computador da criança serão apenas temporários e poderão, mais cedo ou mais tarde, ser superados facilmente. Por isso, decidimos deixar o roteador protegido por senha fazer o trabalho, onde o acesso físico pode ser controlado muito mais facilmente.

Então, o que fazemos aqui para limitar um pouco os jogos no momento é uma combinação de todos os itens a seguir:

  • Fale com eles para educá-los sobre como e quando usar computadores para lazer e quando usá-los para a escola. Este é um processo constantemente em andamento, tedioso, que leva a discussões e discussões intermináveis. Mas é o que sentimos ser a única coisa única que durará a longo prazo.
  • Não há permissões de administrador em sua conta. Isso é uma coisa temporária. Sabemos que eles poderão se colocar no grupo sudo mais cedo ou mais tarde. O plano é que eles nos perguntem por isso, em vez de esconder isso.
  • Faça um contrato para tempos de computação claramente definidos. Eles precisam saber para que e quanto tempo eles estão autorizados a usar suas máquinas. Eles precisam aprender a dividir esse tempo para a escola e para o lazer.
  • Bloquear toda a internet durante as horas de sono .

Para facilitar o cumprimento do contrato de uso do computador tanto para as crianças como para nós, instalamos as seguintes restrições:

  • Use um roteador protegido por senha que permita a restrição do acesso à Internet em uma combinação de hardware (MAC) e uma base de tempo. Contanto que eles não saibam sobre falsificação de MAC, isso funcionará muito bem. Ele também irá restringir o acesso através de seus smartphones e tablets. Isso obviamente não funcionará se houver uma rede sem fio aberta no seu bairro.
  • Instale um servidor SSH nos computadores da criança para puxar o plugue, caso eles se tenham perdido em suas próprias intenções. Isso é para casos de emergência, estamos felizes por não termos precisado muito.
  • Instalou uma lista negra de DNS (através do roteador, não do computador!), o que deve bloquear o acesso ao pior.

O bloqueio do acesso à internet desativará os jogos de forma eficaz se o jogo precisar de acesso à Internet, como Steam , Minecraft , ou outros servidores gamig. No entanto, não terá efeito para os jogos a decorrerem offline.

    
por Takkat 28.01.2016 / 10:14
0

Isso pode ser feito usando scripts de shell.

O primeiro script é para matar Steam assim que for executado:

#!/bin/bash

while true
do
    pkill steam
    sleep 1
done

exit 0

Salve-o como /path/to/anyname.sh e adicione-o à lista de aplicativos de inicialização.

O que esse script fará é que ele verificará qualquer processo aberto chamado steam a cada segundo e, se encontrar algum, ele o eliminará.

Mas, você precisa de uma solução em que steam possa ser executado em um horário específico para que seu filho possa jogar durante esse intervalo. Para fazer isso você tem que escrever outro script:

#!/bin/bash

    echo "pkill anyname.sh" | at 10:00

exit 0

Salve como /path/to/anyname2.sh e também adicione isso à sua lista de aplicativos de inicialização.

Este script irá matar o primeiro script às 10:00 hrs. Então, quando seu filho executar Steam às 10:00 hrs. Ele poderá jogar agora.

O terceiro script é reiniciar o primeiro script em outro ponto do tempo para que ele mate Steam após um intervalo de tempo e seu filho não possa mais jogar por Steam .

#!/bin/bash

    echo "bash /path/to/anyname.sh" | at 12:00

exit 0

Salve-o como /path/to/anyname3.sh e adicione-o à sua lista de aplicativos de inicialização.

Certifique-se de manter esses caminhos ocultos, para que seu filho não descubra.

    
por Raphael 28.01.2016 / 08:31
0

Por que não usar a nova Conta de usuário (via Configurações do sistema ). Este é o único método no Linux para "permissões".

  1. O novo usuário "SteamUser" não deve estar em sudoers (apenas uma conta limitada).
  2. Em seguida, crie uma segunda conta chamada "SuperAdmin" e torne a conta sudoers (acesso root). Mas mantenha sua senha somente com você.
  3. Em seguida, remova a conta do seu filho dos sudoers. ( sudo group). Então, essa conta não terá acesso root, não poderá instalar ou remover o software, alterar as configurações de todo o sistema.
  4. Faça login na sua conta "SuperAdmin" e altere a propriedade de steam binários e da pasta de jogos Steam para evitar que eles sejam executados por qualquer pessoa, exceto "SteamUser". Isso inclui a remoção de acesso de leitura + gravação + execução de qualquer pessoa, exceto "SteamUser"

Algumas notas ..

  • Não é possível deixar um acesso root com a conta do seu filho, caso contrário, o controle de permissões é ignorado facilmente com chown / chmod.
  • Outras sugestões baseadas em scripts de segundo plano são apenas uma bagunça instável. Isso significa que eles não são promissores. No entanto, eles são fáceis de configurar, talvez.
  • Os caminhos das pastas para transferir para "SteamAccount" são: /home/son/.steam e, claro, o arquivo binário /usr/games/steam
  • Para jogar a vapor, a senha do "SteamUser" é necessária (você precisará fazer o login com o "SteamUser" e executá-la. Você pode tentar procurar métodos para expirar a sessão após algum tempo para bloqueá-la, para evitar jogar muito tempo Não tenho certeza se existem ferramentas como essa, mas é tecnicamente possível definir limites de tempo, mas para sessões, não para programas.
por Croll 28.01.2016 / 20:39