Tecnicamente, quando você ssh
para "othermachine", está executando ncat localhost 10000
remotamente em "othermachine". Não há tubulação acontecendo aqui.
Quanto a outra coisa, "ouvir", não acredito que exista nada. Em vez disso, você está executando ncat localhost 10000
tentando se conectar a algo que está escutando na porta 10000 e não há nada lá.
Exemplo
$ ncat localhost 10000
Ncat: Connection refused.
Se você disser ncat
para ouvir, ele permanecerá aberto.
$ ncat localhost -l 10000
Juntando isso, seu comando funciona como está, com a adição da opção -l
.
$ ssh othermachine ncat localhost -l 10000
ncat continua a rodar?
Depois de executar um Ctrl + C ncat localhost -l 10000
também continua sendo executado no servidor remoto para mim também.
Para interromper esse comportamento, você poderia encapsular a chamada para "othermachine" dentro de um shell, como sh
.
Exemplo
$ ssh othermachine -t 'sh -c "ncat localhost -l 10000"'
...stays up...
Agora, em outro shell, se eu fizer login em "othermachine" e confirmar que ele está em execução:
$ pgrep -l ncat
8479 ncat
Se eu Ctrl + C , o original ssh
connection ncat
também pára de funcionar.
$ ssh othermachine -t 'sh -c "ncat localhost -l 10000"'
Ctrl + C
Shared connection to othermachine closed.
Confirmando que desapareceu:
$ pgrep -l ncat
$
Por que isso funciona?
A peça chave nessa configuração é a opção -t
. Isso força a conexão a configurar um terminal pseudo-tty (ptty) como parte da conexão.
trecho da página man do ssh
-t Force pseudo-tty allocation. This can be used to execute arbitrary
screen-based programs on a remote machine, which can be very useful,
e.g. when implementing menu services. Multiple -t options force tty
allocation, even if ssh has no local tty.
Este ptty nos permite enviar a Ctrl + C até ncat
, que é então finalizado, resultando no fechamento da conexão ssh
inteiramente. / p>