Eu tive o mesmo problema e não estava satisfeito com as respostas aqui, então eu cavei mais fundo. Outros já mencionaram que seu comando está emitindo dados mais rápido do que o seu ssh pode suportar, portanto os buffers de dados e os buffers não podem ser interrompidos.
Para corrigir isso, evite armazenar em buffer limitando a saída do comando para a taxa máxima que sua sessão ssh pode executar, já existem comandos para fazer isso.
Configuração, primeiro descubra a taxa máxima de suas sessões:
# Get transfer <TIME> of a large file (>10MB preferable)
/usr/bin/time -f "%e" cat <FILENAME>
# Get file <SIZE> in bytes
stat --printf="%s\n" <FILENAME>
# Calculate <RATE>
echo "<SIZE> / <TIME>" | bc
Finalmente, acelere seus comandos reais de acordo.
<YOUR_COMMAND> | pv -qL <RATE>
Exemplo:
/usr/bin/time -f "%e" cat large_reference_file.txt
31.26
stat --printf="%s\n" cat large_reference_file.txt
17302734
echo "17302734 / 31.26" | bc
553510
# Throttle my command to 553510B/s
cat some_other_file.txt | pv -qL 553510
Você pode querer reduzir a TAXA um pouco, caso a velocidade de conexão diminua um pouco de vez em quando. Se ele diminuir, o comportamento retornará ao problema, um ctrl-c não responsivo.
Alias de gato otimizado opcional:
# bash
alias tcat='tcat(){ cat $@ | pv -qL 400k ; }; tcat'
# tcsh
alias tcat 'cat \!* | pv -qL 400k'
# usage: tcat <FILENAME>
Agora ctrl-c funciona como esperado, matando imediatamente a saída, já que muito pouco, se é que algum, está em buffer.