Como iniciar automaticamente o serviço em QUALQUER linux?

2

Preciso instalar o serviço mais estúpido possível (um binário) e executá-lo de forma confiável como o usuário atual na inicialização (ou no logon, o que for) nas tantas plataformas quanto possível (do tipo de ponto de venda antigo). O aplicativo monitora outros arquivos gerados por outro aplicativo na sessão do usuário.

Alternativas de inicialização consideradas:

  1. init.d
  2. @reboot in crontab
  3. um arquivo .desktop em ~ / .config / autostart
  4. uma infinidade de outras soluções, incluindo .profile e .bashrc

Todos os itens acima se decompõem em algum momento. Os problemas decorrem de não querer executar como root (quero que os arquivos gerados sejam acessíveis ao usuário) e não ter uma maneira de obter com segurança o nome do usuário atual no sudo em todas as plataformas. Idealmente, nem mesmo o sudo pode ser considerado disponível.

Ei, eu só quero executar algo na inicialização e tenho poder "raiz" para fazê-lo. O Windows faz o trabalho com bastante facilidade. Isso não é ciência de foguetes, é?

Yan
fonte
Seu serviço (ou o método de inicialização fornecido) é responsável por cancelar seus direitos. Isso é facilmente realizado. Ainda assim, não há solução universal. Você simplesmente precisará acomodar todos os métodos de inicialização. A execução na inicialização provavelmente não é ideal se for um serviço por sessão.
Daniel B
O que houve com init.d (ou melhor, disse SysV init)? Use su para executar o programa em outro usuário, por exemplo su - joe /usr/local/bin/stupidprogram.
Cristian Ciupitu
11
Não, existe muita variedade nos sistemas baseados em Linux para que eles sejam uma maneira de fazer isso.
perfil completo de Zoredache
11
Você poderia esclarecer o caso de uso exato? Isso parece muito desonesto, parece que você está tentando instalar um malware persistente do Linux em máquinas PoS sobre as quais você não tem controle, mas que de alguma forma ficou rooteado, que lê as instruções de um arquivo descartado por um processo da terra do usuário. Mas talvez eu esteja apenas paranóico :)
lorenzog
@lorenzog, sim, é realmente muito semelhante. mas o que você faz quando o software que você precisa monitorar não é seu e nem pode ser incomodado?
Yan

Respostas:

2

Eu sugeriria o uso de ferramentas daemon para gerenciar seus serviços.

Ele usa um supervisor para monitorar seus serviços e é executado como um daemon. Você pode escrever um script de execução simples, para executá-lo, e as ferramentas daemon o desassociarão com o terminal atual e também fornecerão logs separados para a solução de problemas.

nohup
fonte
2

Sobre a única coisa que é garantida (de alguma forma) a mesma em todas as instalações Linux é o kernel, porque é o kernel que o torna Linux.

O kernel possui um parâmetro de linha de comando initque especifica o caminho e o nome do binário responsável por inicializar o ambiente do espaço do usuário após a inicialização do kernel. Normalmente /sbin/inité usado para esse fim, no entanto, pode ser substituído por qualquer outro binário que você queira (que junto com as bibliotecas necessárias, arquivos de configuração etc.) está disponível no sistema de arquivos raiz.

No entanto, provavelmente não é isso que você deseja.

Praticamente tudo o que você faz além disso depende, de alguma forma, do comportamento do software instalado. Não há nenhuma garantia de que o binário init fique em / sbin / init.

A maioria dos softwares que enfrentam esse problema trabalha com isso, fornecendo várias configurações possíveis de inicialização e possui um script de instalação (ou o administrador) escolhe o apropriado para o sistema em questão; se nenhuma configuração apropriada for fornecida, o administrador deverá escrever sua própria.

Infelizmente, essa é a desvantagem da versatilidade que a maioria das distribuições Linux fornece. No Windows, existe apenas uma maneira de fazê-lo (bem, existem alguns, mas eles são definidos especificamente pela Microsoft e você não pode realmente fazer nada para alterá-los, mesmo como um administrador competente para programadores).

Os problemas decorrem de não querer executar como root (quero que os arquivos gerados sejam acessíveis pelo usuário)

Se esse era seu único problema, no entanto, a solução mais fácil seria simplesmente mudar a propriedade do arquivo imediatamente após a sua criação. Ou faça o que a maioria dos daemons faz: inicie como root, abandone privilégios e mude para uma conta sem privilégios depois de fazer o que a inicialização precisa ser feita como root (por exemplo, abrir soquetes para ouvir portas privilegiadas, ler arquivos de configuração protegidos na memória, etc.)

Eu imagino que o usuário conectado possa ser determinado de forma programática, mas você precisa ser muito mais específico do que exatamente você quer dizer com 'usuário conectado'. Detectar quais contas de usuário (se houver) está / está executando um binário específico é bastante trivial, varrendo a árvore de processos e pode levá-lo perto o suficiente do que você está tentando alcançar. Depois de saber qual conta de usuário segmentar, você pode alternar seu contexto de segurança para essa conta ou iniciar um processo separado como usuário (semelhante à forma como o sudo funciona).

um CVn
fonte