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

11

Estou tentando criar um arquivo em lotes 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 sampleUser@192.168.0.1

Como não quero permitir a execução de outros comandos após a autenticação, estou usando ForceCommanduma Match Userdeclaração:

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

O problema é que a execução do meu arquivo em lotes inicia a massa corretamente, mas fecha imediatamente após a execução do eco no 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 sai do encaminhamento de porta.

Eu pensei em comandos como yes, pingou read, mas eles

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

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

Para que devo usar waitTillControlC?

stuXnet
fonte
Encontrei perguntas como superuser.com/questions/587629/… , mas elas deixariam o usuário com um shell pronto.
StuXnet

Respostas:

13

Eu não entendo por que todas as outras respostas querem usar um loop aqui, o sono é capaz de esperar o tempo suficiente para qualquer finalidade prática e não usará ciclos de relógio.

Por exemplo, ele tentará dormir aqui por cem anos duvidosos e provavelmente fará o suficiente para atender à solicitação de qualquer maneira:

echo "Something"; sleep 36500d

Como alternativa, isso deve bloquear também até você digitar a Enterchave:

echo "Something"; read foo
jlliagre
fonte
9

Experimente a -Nopção. A partir da plinkdocumentação :

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

Este é o mesmo comportamento da sshopção -N, conforme descrito na página do manual :

-N      Do not execute a remote command.  This is useful for just for-
         warding ports (protocol version 2 only).
chepner
fonte
2
Essa deve ser a resposta aceita. Os outros dizem como fazer uma solução alternativa, mas este diz como fazê-lo corretamente .
Moshe Katz
Obrigado pela edição; não tendo uma caixa do Windows para verificar, não pensei em procurar documentos on-line.
chepner
Esta resposta não se encaixa nas minhas necessidades, porque I don't want to allow to execute other commands after authentication. -Nfaria isso no lado do cliente, para que você pudesse remover -N para executar outros comandos após a autenticação.
StuXnet
8

Isso deve durar para sempre sem consumir qualquer quantidade (perceptível) de energia da CPU.

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

Também não tenho certeza se você pode dar um comando como na ForceCommandcláusula. Pode ser necessário 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

Obviamente, esse script deve estar em um local e ter permissões para que nenhum usuário comum no servidor possa gravá-lo.

Match User sampleUser
    ForceCommand /usr/bin/waitforever

Editar

Eu encontrei um comando que parece mais elegante:

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

tail -faguarda um arquivo ou fluxo retornar bytes. (Caso contrário, útil para assistir logs em tempo real.) /dev/nullNunca retornará bytes. E assim o comando dormirá para sempre.

nitro2k01
fonte
Nesse momento, eu estava tentando um ciclo de sono para mim mesmo - sim, isso funciona definitivamente! Mesmo diretamente com o ForceCommand:ForceCommand echo 'congrats' && while true; do sleep 9999; done
stuXnet 29/11
tail -f /dev/nullé tecnicamente pior que o loop 9999. O processo será ativado a cada segundo, em vez de a cada 2 horas e 56 minutos.
Jlliagre
Encontrei-o aqui: unix.stackexchange.com/questions/42901/… A pessoa que responde a essa pergunta afirma "(supondo que isso use inotificar internamente, não deve haver pesquisas ou despertares; portanto, além de ter uma aparência estranha, deve ser suficiente) "Esta afirmação ou a suposição de que a cauda usa inotifyincorretamente?
Nitro2k01 29/11
A suposição está correta, tailé otimizada para alavancar inotifyquando disponível. Esse deve ser o caso padrão com a maioria, se não todas, das distribuições recentes o suficiente. No entanto, eu apenas testei em um laptop Linux e observei atividades espúrias com o tailmonitoramento, /dev/nullpor isso é certamente pior do que dormir em termos de ciclos de clock.
Jlliagre
Não acredito que tailsempre acorde a cada segundo. Um possível motivo para o resultado é que você o está executando em um terminal que pode estar se comunicando tailpor qualquer motivo, enquanto sleepnão o fará. Não há nenhuma razão pela qual tailespuriosamente deva acordar apenas o monitoramento /dev/null.
Nitro2k01 29/11
0

Você pode simplesmente tentar o seguinte:

echo "your commands" && while :; do sleep 1; done
user2783132
fonte
1
Para futuros visitantes, você deve fornecer um resumo de como isso funciona. Muitos podem saber, mas você não pode assumir toda a vontade.
Nerdwaller 29/11/13
Longer sleepperíodo será mais fácil para o CPU, embora ainda sleep 1deve ser bastante segura em qualquer coisa construída nos últimos duas décadas ...
Shadur
:é uma abreviação de true. Eu também preferiria um sleepperíodo mais longo apenas por princípio.
Nitro2k01 29/11
0

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

http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter4.html#config-closeonexit - descreve exatamente o que você precisa alterar. Se você deseja usar a opção "somente na saída limpa", basta adicionar exit 1no final do ForceCommand.

Edit: Eu entendi mal; você deseja apenas manter as portas encaminhadas, não deseja manter a saída do ForceCommand. Nesse caso, http://tartarus.org/~simon/putty-snapshots/htmldoc/Chapter4.html#config-ssh-noshell faz o que você deseja?

Gabe
fonte
O problema não é que a janela se feche, mas que o túnel ssh esteja fechado. Dizer ao PuTTY para deixar a janela aberta também mantém o túnel ssh?
Adrian Pronk