Notificação de que o processo remoto foi concluído (mas não é um email)

0

Estou conectando-me usando o OpenSSH a um servidor Linux no qual tenho uma sessão tmux em que faço um trabalho de compilação que leva muito tempo. Agora eu gostaria de receber imediatamente uma notificação no meu cliente Linux (o computador do qual estou me conectando) quando um determinado comando que leva um longo tempo finalmente for concluído.

Localmente, eu sei de várias maneiras de como ser notificado usando um pop-up, jogando algo,… (1), (2) executando um determinado comando. Agora eu precisaria fazer o mesmo remotamente. Uma solução perfeita seria algum tipo de canal de feedback em ssh , mas não estou ciente de tal funcionalidade.

E por favor, nenhuma solução baseada em email como sugerido em (3) . Já estou recebendo muitos e-mails de trabalho e estou tentando discar a quantidade de e-mails para algo apenas para reconhecer, mas não para ler, armazenar, encaminhar ou responder (para isso, criei uma conta de e-mail separada para a qual eu não receba notificações em tempo real).

  1. link
  2. link
  3. Alerta ao finalizar o processo
por phk 20.11.2016 / 17:52

3 respostas

1

A solução mais simples é usar a saída do tmux, emitindo um tmux detach, para fechar a conexão ssh, enviar uma notificação e, em seguida, reconectar e anexar novamente ao tmux. Por exemplo, com o script

ssh -t remote tmux
notify-send done
ssh -t remote tmux attach

Você roda o tmux, inicia o comando de longa duração e, em seguida, digita o comando

tmux detach

que será executado quando o comando longo for concluído. Isso fechará o tmux, fechará o ssh e o comando notify-send mostrará a mensagem da sua área de trabalho. Um novo ssh vai recolocar exatamente onde você parou.

    
por 21.11.2016 / 13:46
4

Para o caso de ainda haver uma conexão ssh, você pode usar port forwarding . Vou chamar as duas máquinas laptop e server , com a última onde o trabalho de longa execução está sendo executado. A vantagem principal que vejo com isso é para configurações ad-hoc, por exemplo, conectando-se a partir de um laptop em uma cafeteria. Para esse caso de uso você estará correndo atrás de um NAT, provavelmente não pode abrir portas usando o PNP. Geralmente não requer nada para ser instalado no servidor. Se isso não se aplica, então vá com a sugestão de configurar um serviço ssh no laptop.

Invoque o ssh no laptop e peça para ele encaminhar a porta tcp remota 4000 para a porta local 5000. Na prática, você usaria o mesmo número de porta nas duas extremidades, estou usando diferentes para deixar mais claro o que está acontecendo. Aqui estou usando a linha de comando openssh

ssh -R 4000:127.0.0.1:5000 username@server

Conecte-se ao tmux, inicie seu trabalho, organize quando o trabalho de longa execução terminar de gravar na porta 4000.

(long_running job with params ; echo "$?" > /dev/tcp/127.0.0.1/4000) &

Se você não tem / dev / tcp e ele não é emulado pelo shell, então você pode usar algo como echo "$?" | netcat 127.0.0.1 4000

Enquanto isso, no laptop, ouça a conexão na porta 5000, presumivelmente em uma janela diferente.

netcat -l -p 5000; do_something_to_alert_the_local_user.

O netcat bloqueará a espera para o servidor se conectar à porta 4000, que será encaminhada através do túnel ssh criptografado para a porta 5000. Após a conexão ser fechada no final do eco, o local netcat será encerrado e o do_something_to_alert_the_local_user será executado.

    
por 20.11.2016 / 19:26
0

Se você tiver um servidor OpenSSH em execução no cliente, poderá configurá-lo para forçar um determinado comando a ser executado para uma chave específica. Se feito corretamente, esta chave só pode ser usada para acionar esta notificação e não para qualquer coisa significativamente nefasta.

Para tornar as coisas menos confusas (porque neste caso temos a ação de ambos os lados, cliente ou servidor) eu chamarei a máquina local, ou seja, o cliente conectado ao servidor remoto para iniciar a tarefa de longa duração, Alice . Bob será então o servidor onde iniciar a tarefa de compilação, na qual deverá então notificar Alice sobre a conclusão da tarefa.

Para isso, basicamente basta gerar uma chave usando ssh-keygen -f notif_key e, em seguida, adicionar a chave pública ( notif_key.pub ) a uma linha separada na .ssh/authorized_keys de Alice, mas prefixada com:

command="/path/to/notifier.sh \"$SSH_ORIGINAL_COMMAND\"",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa …

( ssh-rsa … significa a chave pública.)

notifier.sh é um script no lado de Alice, que então chama o comando de notificação (é claro que você pode começar imediatamente, se possível, apenas observe que toda a linha é executada em um shell).

Do lado de Bob, você pode acionar a notificação no lado de Alice usando ssh , então, tudo isso é executado no Bob dentro da sessão tmux :

time-consuming-command; ssh -i notif_key user@alice_pc foobar

E é isso!

BTW, $SSH_ORIGINAL_COMMAND é um espaço reservado para toda a linha de comando extra para o comando ssh que, em seguida, é encaminhado para o comando forçado. Dessa forma, você pode personalizar a notificação específica do Bob, por exemplo para quando você executar várias tarefas dessa maneira ao mesmo tempo.

Exemplo notifier.sh com isso em mente:

#!/bin/sh
some-notification-command --message "Task '$*' is done!"
echo 'Note to Bob: Alice has been notified.'

Em suma, esta solução está longe de ser ideal. Ele requer um servidor OpenSSH no cliente e é um pouco incômodo de configurar. Espero que existam melhores soluções.

    
por 20.11.2016 / 17:52