Iniciar o terminal específico na inicialização

1

Eu codifiquei uma aplicação usando libpcap e ncurses. Obviamente, este aplicativo deve rodar no terminal.

Portanto, criei um script que inicia meu aplicativo no gnome-terminal com um tamanho fixo:

#!/bin/sh
gnome-terminal --geometry=75x36+0+0 --command="myapplication"'

Eu quero executar isso na inicialização (depois que a área de trabalho do usuário logado atual aparecer). É importante executar isso como root. Caso contrário, a libpcap não será capaz de farejar pacotes. Estou ciente de todos os riscos envolvidos.

Eu criei o seguinte arquivo .service :

[Unit]
Description=My Application

[Service]
User=root
Type=simple
ExecStart=/usr/local/bin/myshellfile

[Install]
WantedBy=multi-user.target

E eu coloco em /etc/systemd/system/myservice.service e preino com

sudo systemctl preset myservice.service

No entanto, isso não funciona. O que eu estou fazendo errado aqui? Rodando o Ubuntu 16.04 em um estado atualizado.

    
por TacoVox 17.10.2017 / 11:06

1 resposta

1

Existem alguns métodos possíveis para iniciar a aplicação GUI (como gmome-terminal ) na inicialização do sistema e talvez o mais apropriado seja usar Aplicações de Inicialização (veja também ). Desta forma, o aplicativo será iniciado quando o login do usuário. (Em todos os outros métodos, deveríamos exportar alguns envambars de desktop para poder fazer isso.)

Para poder testar minha resposta, criei o arquivo executável chamado myapp , localizado em /usr/local/bin . Ele adiciona apenas a data e hora atuais em um arquivo no diretório /root , portanto precisaremos de permissões root (sudo) para executar o script:

#!/bin/bash
date >> /root/date.txt

Podemos conceder permissões a um usuário específico para executar um comando sem senha via sudo . Não importa se o usuário pertence ao grupo sudoers ou não. Podemos usar sudo visudo para editar com segurança /etc/sudoers e adicionar uma ou mais linhas como estas:

user1 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp
user2 ALL=(ALL) NOPASSWD: /usr/local/bin/myapp

A melhor ideia é criar um arquivo separado, por exemplo /etc/sudoers.d/myapp , onde colocar essas regras. Para isso, usaremos o comando: sudo visudo -f /etc/sudoers.d/myapp .

Agora, user1 e user2 devem ser capazes de executar sudo myapp sem senha.

  

Observação: Sempre use o comando visudo para editar o arquivo sudoers para garantir que você não se bloqueie fora do sistema - apenas em   caso você acidentalmente escreva algo incorreto no arquivo sudoers .    visudo salvará seu arquivo modificado em um local temporário e    somente sobrescreve o arquivo real sudoers se o arquivo modificado puder ser analisado sem erros ... fonte .

O próximo passo é modificar o script de inicialização. Vamos chamá-lo de myapp_startup e colocá-lo no mesmo diretório /usr/local/bin . O conteúdo do script deve ser:

#!/bin/sh
gnome-terminal --geometry=75x36+0+0 -x bash -c "sudo myapp; exec bash"
  • A explicação detalhada sobre o comando acima é fornecida aqui .
  • Se você quiser minimizar a janela, use automaticamente: esta abordagem.

Agora podemos criar uma entrada em Startup Applications como este:

  • Além disso, podemos modificar o script de inicialização desta forma: sleep 3 && gnome-terminal ... para iniciar a nova janela de terminal após a inicialização de toda a área de trabalho.
  • Quando o script não está localizado em um diretório adicionado à variável $PATH do usuário ( echo $PATH ), devemos usar o caminho completo, por exemplo: /usr/local/bin/myapp_startup .

Leitura adicional:

  • Em vez de gnome-terminal provavelmente você pode usar tmux ( ou algum outro gerenciador de sessão ) como é descrito nesta resposta .

  • Além disso, você pode iniciar o script de inicialização via Cron (ou algum outro ambiente limitado) pelo script cron-gui-launcher.bash deste projeto: link . Este script irá aguardar o login do usuário e, em seguida, exportará todas as variáveis DE, etc ... Mas no caso atual, o resultado final será o mesmo que usamos o aplicativo Startup.

por pa4080 24.10.2017 / 14:40