Isso provavelmente teria sido respondido por Continue executando um script via ssh , se eu não tivesse que executar um comando como superusuário. Deixe-me tentar com um exemplo: digamos, no meu servidor, eu tenho esse script como ~/testsleep.sh
, que também é chmod +x
:
#!/usr/bin/env bash
logger Pre sleep: "$USER" / "$USERNAME" / "$1"
sleep 5
logger Post sleep: "$USER" / "$USERNAME" / "$1"
Eu quero ter logger
log para /var/log/syslog
, pois via ssh
eu provavelmente perderei stdout / stderr.
Digamos que eu corra isso no meu PC local, logado via ssh
para o servidor remoto:
server$ readlink -f ~/testsleep.sh
/home/user/testsleep.sh
server$ $ ls -la testsleep.sh
-rwxr-xr-x 1 user user 126 2015-02-05 13:35 testsleep.sh
server$ sudo /home/user/testsleep.sh some_argument
sudo: unable to execute /home/user/testsleep.sh: No such file or directory
O primeiro problema é que não posso executar o script diretamente com sudo
, mesmo que seja executável; Eu acho que isso tem a ver com " seu shell atual está sendo executado sob seu ID de usuário regular ... e não há como conceder acesso root " Execute um shell script no shell atual com permissão sudo - Stack Overflow
Ok, tudo bem, vou rodar sudo bash
- parece mais com isso:
server$ sudo bash /home/user/testsleep.sh some_argument
server$ tail -2 /var/log/syslog
Feb 5 13:40:48 user user: Pre sleep: root / root / some_argument
Feb 5 13:40:53 user user: Post sleep: root / root / some_argument
Portanto, aparentemente, o script faz login syslog
e vê root
as $USER
; como pretendido. Por enquanto, tudo bem.
Agora, gostaria de executar este script como um processo no servidor, logo antes de sair da minha sessão de terminal ssh
. Eu acho que eu faria isso:
server$ sudo bash /home/user/testsleep.sh from_end & exit
[1] 6293
logout
Connection to 127.1.100.99 closed.
local$
Se eu fizer login novamente no servidor e verificar syslog
novamente, poderei ver que não há log dessa última chamada "exiting":
# this 'grep' will print the filename, if file doesn't contain the match:
server$ grep --files-without-match 'from_end' /var/log/syslog
/var/log/syslog
server$ tail -2 /var/log/syslog
Feb 5 13:40:48 mypc user: Pre sleep: root / root / some_argument
Feb 5 13:40:53 mypc user: Post sleep: root / root / some_argument
Então, minha pergunta é - como posso executar esse script como um processo, sob sudo no servidor - mas invocado de um ssh
shell e logo antes de sair dele; para que seja executado (neste caso, confirmado escrevendo para o syslog
)?