Eu tenho um serviço systemd que precisa criar um diretório /run
, mas executado como um usuário não raiz. De um exemplo de blog, deduzi a seguinte solução:
[Unit]
Description=Startup Thing
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 -u /opt/thing/doStartup
WorkingDirectory=/opt/thing
StandardOutput=journal
User=thingUser
# Make sure the /run/thing directory exists
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p /run/thing
ExecStartPre=/bin/chmod -R 777 /run/thing
[Install]
WantedBy=multi-user.target
A mágica está nas 3 linhas que seguem o comentário. Aparentemente, os ExecStartPre
arquivos serão executados como root dessa maneira, mas ExecStart
serão executados como o usuário especificado.
Isso levou a três perguntas:
- O que
-
faz na frente do/bin/mkdir
? Não sei por que está lá ou o que faz. - Quando existem múltiplos
ExecStartPre
em um arquivo de unidade, eles são executados apenas em série na ordem em que são encontrados no arquivo de unidade? Ou algum outro método? - Essa é realmente a melhor técnica para atingir meu objetivo de criar o diretório de execução para que o usuário não root possa usá-lo?
ExecStartPre
execução é raiz é aPermissionsStartOnly=true
diretiva. Ele restringe aUser
diretiva apenas aoExecStart
comando. Veja freedesktop.org/software/systemd/man/systemd.service.htmlRespostas:
Para qualquer dúvida sobre as diretivas de um systemd, você pode usar
man systemd.directives
para pesquisar a página de manual que documenta a diretiva. No caso deExecStartPre=
, você o encontrará documentadoman systemd.service
.Lá nos documentos para
ExecStartPre=
, você descobrirá que o "-" inicial é usado para observar que a falha é tolerada para esses comandos. Nesse caso, é tolerado se/run/thing
já existir.Os documentos também explicam que "várias linhas de comando são permitidas e os comandos são executados um após o outro, em série".
Um aprimoramento do seu método de pré-criação do diretório não o torna gravável no mundo quando você precisa que ele seja gravável apenas por um usuário específico. Permissões mais limitadas seriam realizadas com:
Isso torna o diretório de propriedade e totalmente acessível a partir de um usuário específico.
fonte
RuntimeDirectory
eRuntimeDirectoryMode
também.Resposta para # 3:
Confira as diretivas
RuntimeDirectory=
&RuntimeDirectoryMode=
. Documentos completos aqui . Mas em resumo (pequena modificação no texto, mas a essência deve permanecer):Então, para alavancar isso, isso deve fazer o truque:
fonte