Existe um comando no Linux que aguarda até que seja terminado?

11

Estou tentando criar um arquivo de lote do Windows, que inicia o putty / plink com o encaminhamento de porta e nada mais. A parte do Windows está pronta até agora:

start plink.exe -ssh -i key.ppk -L 1234:localhost:80 [email protected]

Como não quero permitir a execução de outros comandos após a autenticação, estou usando ForceCommand com uma declaração Match User :

Match User sampleUser
    ForceCommand echo 'Success! Close this window to log out.'

O problema é que executar o arquivo em lote inicia a compactação corretamente, mas é fechado imediatamente após a execução, ecoando o texto especificado.

Minha ideia é usar algo assim:

ForceCommand echo 'Success! Close this window to log out.' && waitTillControlC

Dessa forma, o putty / SSH deve manter a conexão ativa e não encerra o encaminhamento de porta.

Pensei em comandos como yes , ping ou read , mas eles

  • estão enviando spam para minha janela de terminal
  • estão realmente fazendo coisas / gerando carga de CPU desnecessária
  • pode fechar inesperadamente, se alguém pressionar

Existe um comando que não fará nada, para sempre, até que alguém o termine com Ctrl + C ou feche a conexão SSH fechando a janela da massa?

O que devo usar para waitTillControlC ?

    
por stuXnet 29.11.2013 / 02:54

5 respostas

12

Eu não entendo porque todas as outras respostas querem usar um loop aqui, o sleep é capaz de esperar por tempo suficiente para qualquer propósito prático e não usará ciclos de clock para fazê-lo.

Por exemplo, ele tentará dormir por um período duvidoso de cem anos e provavelmente fará o suficiente para atender à solicitação:

echo "Something"; sleep 36500d

Alternativamente, isso deve bloquear também até você digitar a tecla Enter :

echo "Something"; read foo
    
por 29.11.2013 / 09:32
8

Isso deve durar para sempre sem consumir qualquer quantidade (notável) de poder de CPU.

echo "Something" && while true; do sleep 9999; done

Eu também não tenho certeza se você pode dar um comando como na cláusula ForceCommand . Você pode precisar colocar o comando em um script de shell.

#!/usr/bin/env bash
echo "Success! Close this window to log out." && while true; do sleep 9999; done

Este script deve estar em um lugar e ter permissões que nenhum usuário comum possa escrever nele.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Editar

Encontrei um comando que parece mais elegante:

echo "Something" && tail -f /dev/null

tail -f espera por um arquivo ou fluxo para retornar bytes. (Caso contrário, é útil para visualizar logs em tempo real). /dev/null nunca retornará bytes. E assim o comando vai dormir para sempre.

    
por 29.11.2013 / 03:13
8

Experimente a opção -N . Na plink documentação :

-N        don't start a shell/command (SSH-2 only)

Este é o mesmo comportamento que a ssh option -N , conforme descrito no página do manual :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
    
por 02.12.2013 / 17:32
0

Você pode simplesmente tentar o seguinte:

echo "your commands" && while :; do sleep 1; done
    
por 29.11.2013 / 03:15
0

Você está tentando resolver isso do lado errado. Você não quer que o shell não saia, você quer que a massa deixe a janela aberta.

link - descreve exatamente o que você precisa alterar. Se você quiser usar a opção "only on clean exit", basta adicionar exit 1 no final do ForceCommand.

Edit: eu não entendi; você só quer manter as portas encaminhadas, você não quer manter a saída do ForceCommand. Nesse caso, o link não faz o que você quer?

    
por 29.11.2013 / 11:54