Execute su -s com argumentos

0

Eu corro para executar um comando usando o comando su -s para iniciar um processo. Desde que eu não quero que o usuário root possua o processo.

Eu tento fazer isso emitindo o comando

su -s "$CATALINA_HOME/bin/catalina.sh run" tomcat

que retorna su: /opt/apache-tomcat/bin/catalina.sh run: No such file or directory

Como posso executar o comando su -s junto com argumentos para não gerar esse erro?

    
por jgr208 10.06.2016 / 20:31

3 respostas

3

Se você estiver executando su como root , você pode use -s para especificar um shell diferente (executando como root é necessário aqui, pois seu usuário tomcat não possui um shell válido) e -c para especificar o comando a ser executado:

su -s /bin/sh -c "$CATALINA_HOME/bin/catalina.sh run" tomcat

Você pode encontrar start-stop-daemon útil; ele tem uma enorme quantidade de opções para especificar o usuário e o grupo a usar, como iniciar o daemon, etc. tomcat8 initscript usado no Debian pode fornecer inspiração útil. Ou você pode olhar para escrever uma unidade de sistema ou o que for apropriado para o init do seu sistema.

    
por 10.06.2016 / 20:39
3

A opção -s do comando su é alterar o shell do usuário especificado. O comando que você deseja executar deve ser precedido por -c switch.

Então o comando que você está procurando é algo assim:

su -s /bin/bash -c "$CATALINA_HOME/bin/catalina.sh run" tomcat
    
por 10.06.2016 / 20:41
0

Suas outras perguntas no link e Existe alguma maneira de saber se um script de shell foi morto com o sinal 9 indica que o que está faltando na sua pergunta é que você está tentando executar o Tomcat sob o upstart.

Nesse caso:

  • start-stop-daemon não é apropriado.
  • Nem é su .
  • Nem são os giros do Daemon Poor Man's Supervisor para fazer o gerenciamento de arquivos PID no shell script.

Todos eles estão tentando duplicar coisas que o upstart faz diretamente . O uso de su é particularmente ruim, porque não é uma ferramenta para eliminar privilégios. É uma ferramenta para adicionar privilégios , em uma sessão de login. Hoje em dia tem envolvimento sob os capítulos com vários subsistemas de gerenciamento de sessões de login que o torna particularmente inapropriado para a tarefa (muito mais simples) de eliminar privilégios de superusuário em um daemon. start-stop-daemon é apenas supererrogatório. E o upstart conhece os IDs do processo de seus filhos.

No arquivo de tarefa inicial, use as estrofes setuid e (se apropriado) setgid para descartar privilégios para um usuário não privilegiado:

setuid tomcat

E se você invocar catalina.sh via sh -c , o que não é realmente necessário, não passe pelo território de House of Horror. (É apenas um pouco menos horrendo quando esses tipos de coisas são feitos com o upstart.) Faça as coisas do jeito do daemontools e tenha a cadeia do shell no script, invocando-a pelo comando exec do shell para que o iniciante enxergue o daemon como seu filho direto processo. (E certifique-se de que o upstart também saiba disso com a sub-rotina expect correta).

No entanto, um shell explícito não é necessário, porque o upstart pode invocar catalina.sh diretamente, assim como o systemd e outras ferramentas de gerenciamento de serviços. Além disso, você não tem a preocupação de garantir que /bin/bash seja o intérprete correto para esse script.

exec $CATALINA_HOME/bin/catalina.sh run

Leitura adicional

por 10.06.2016 / 21:48