Executando um script “planejado” / atrasado como sudo no servidor, via ssh - e logo antes da saída ssh

0

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 )?

    
por sdaau 05.02.2015 / 13:58

1 resposta

1

Você precisa disown do trabalho para não ser eliminado quando a conexão estiver "desligada":

sudo bash /home/user/testsleep.sh from_end & sleep 1; disown -h; exit

O sleep 1 está lá para reduzir a corrida entre o início da tarefa em segundo plano e a saída da shell. Se você puder evitar ter que fazer tudo em uma única linha, obterá melhores resultados ao separar os dois conjuntos de comandos:

sudo bash /home/user/testsleep.sh from_end &
disown -h; exit
    
por 05.02.2015 / 14:32