Existe uma maneira de evitar atrasos na digitação de SSH?

38

Posso dizer ao SSH para enviar os dados somente após pressionar Enter ou Tab, e não após cada pressionamento de tecla individual?

    
por StackedCrooked 18.08.2011 / 13:41

8 respostas

28

Não, porque o SSH não tem como saber se o que você está digitando exigiria uma ação de inserir ou de tabulação - se você estiver tentando passar pelo histórico de comandos, por exemplo, as setas ^R ou para cima não seriam enviados por eles mesmos, e isso seria ... desagradável.

Você não precisa esperar entre cada personagem para que ele apareça na tela; Se você sabe o que você tem que digitar, tente o mais rapidamente possível, e o terminal vai ficar em cerca de um tempo de ida e volta de quando você parou de digitar, o que é tão bom quanto você vai sair uma configuração de buffer de linha de qualquer maneira (a perda de pacotes é diferente, mas introduz suas próprias peculiaridades interessantes).

    
por 18.08.2011 / 13:48
20

O PuTTY oferece dois recursos que podem ser úteis: "eco local" e "edição de linha local". A edição de linha local armazena tudo e apenas envia para o servidor após um retorno de linha. Isso pode tornar a linha de comando muito mais fácil de lidar, mas também pode tornar o uso de um editor de texto infernal.

O PuTTY também tem algumas outras opções para ativar / desativar certas coisas (o algoritmo de Nagle) que podem afetar a latência de conexão percebida. A meu ver, o cliente OpenSSH não oferece todos os recursos que o PuTTY faz a esse respeito, e eu não sei de uma alternativa do Linux que seja comparada.

Caso contrário, womble está certo.

    
por 18.08.2011 / 15:36
17

Mosh foi projetado para resolver esse problema exato. Ele é projetado para uso em conexões de alta latência e não confiáveis e fornece edição local de eco e linha.

    
por 04.07.2015 / 03:01
8

Abra a sessão ssh com ssh host.example.org bash (ou qualquer shell que você queira usar).

Você obterá o modo de buffer de linha para o shell remoto, o que significa que você não obterá um prompt e edição de linha, mas obterá o eco local e o modo "uma linha de cada vez". Às vezes é útil quando se trabalha com uma conexão muito ruim. Nem todos os programas serão executados corretamente porque você não terá uma pseudo-tty, mas a maioria dos utilitários UNIX funciona muito bem.

Atualização:

Ao usar o truque acima, você pode editar a linha normal ( readline ) na extremidade local usando um programa wrapper conveniente chamado rlfe . Apenas execute rlfe ssh host.example.org bash .

    
por 18.08.2011 / 19:18
5

Tendo o mesmo problema ( alta latência e perda de pacotes devido à péssima qualidade de dados móveis em alguns locais), e mosh não o corta para mim (ele precisa de programas especiais em todos os hosts remotos, consertando o UTF8 local e remotamente em todos os servidores sem quebrá-los, modificando todos os firewalls - e isso realmente não fornece edição de linha local de qualquer maneira) Eu decidi escrever um pequeno wrapper para fornecer modo de edição de linha local para ssh .

Por padrão, ele passa tudo para ssh no modo padrão char-by-char, mas você pode pressionar uma tecla de atalho para entrar no modo de edição de linha local alimentado por readline a qualquer momento. Assim, você poderia inserir (com edição, comando de recall, etc) toda a linha localmente e, em seguida, quando você pressionar digite , ele será enviado como um pacote TCP para o lado remoto.

A vantagem é a edição de linha de comando livre de atraso (como o antigo modo de buffer line-by-line telnet cozido / canônico ", mas com comandos de edição superiores fornecidos por linha de leitura GNU ). Além disso, nada precisa ser alterado em servidores ou firewalls. E os editores e outros programas baseados em curses continuam a funcionar normalmente (embora com atraso) no modo padrão char-by-char como na conexão ssh normal.

A desvantagem é que você precisa pressionar a tecla de atalho para entrar no modo de edição de linha local toda vez que quiser, ou precisa modificar o prompt no host remoto para permitir a autodetecção. Além disso, a conclusão do nome do arquivo remoto atualmente funciona apenas com a remoção do modo char-by-char (ou usa o sistema de arquivos local em vez do remoto, dependendo de suas preferências). No entanto, é um trabalho em andamento, portanto, solicitações de pedidos ou ideias viáveis para melhoria são bem-vindas!

Do lado não convencional, você poderia alternativamente usar o SSHFS para montar o sistema de arquivos remoto localmente.

A vantagem não é apenas que seu shell (e sua edição de linha) é local e livre de atrasos, mas também que você pode navegar pelo sistema de arquivos remoto e usar a conclusão do nome do shell ( tecla ) para remoto arquivos. Além disso, (o melhor recurso IMHO) você pode usar o editor local de escolha para a edição de arquivos remotos sem lag.

As desvantagens são (especialmente se você vincular também baixa largura de banda, e não apenas alta latência) que para cada arquivo a ser editado, ele precisa ser totalmente transferido para localhost e depois de editar, totalmente transferido para remoto novamente . O SSHFS fornece algum armazenamento em cache (consulte as opções sshfs (1) cache , cache_timeout , cache_x_timeout ) para aliviar um pouco os problemas. Além disso, se você quiser executar algo no remoto, precisará usar outra tela ou prefixar todos os comandos com " ssh remotehost " (por exemplo, ssh remotehost sudo service apache restart ). Veja a opção ControlMaster em ssh_config (5) para agilizar a execução (e sem solicitação de senha).

    
por 16.09.2015 / 21:34
2

Você pode emular esse comportamento se estiver apenas executando comandos,

ssh user @ targetmachine 'meus comandos em uma string'

mas

  1. isso adiciona um atraso adicional na criação da conexão (pode ser mitigado usando conexões master / shared ssh )
  2. se você não tiver uma chave privada sem senha, precisará usar ssh-agent ou digitar a senha em
  3. claramente não funciona se você estiver interagindo com menus ou editando arquivos, etc.
por 18.08.2011 / 14:48
1

Você pode usar o tmux para obter um eco fluente de sua digitação. Execute o tmux localmente. Se você tiver o shell ssh em um painel e um shell local em um painel abaixo dele, o painel local poderá enviar chaves para o painel remoto.

tmux send-keys -t top 'ls' C-m

Comandos interativos e pequenos comandos eu digito diretamente no shell ssh de atraso. Assim que o atraso começar a dificultar a minha digitação, alterno para o painel local e uso as teclas de envio. Isso funciona até no meio de digitar um comando.

Para o atalho, adicionei isso ao meu .bashrc

function ts {
    args=$@
    tmux send-keys -t right "$args" C-m
}

Obrigado a Christian Pelczarski por explicar as chaves de envio: link

Você terá que escapar quando usar aspas, por exemplo

ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'
    
por 19.07.2018 / 09:35
0

Isso faz o que você quer. Você precisa instalar o cliente e o servidor, e o upstream do OpenSSH nunca adotou as mudanças. link

    
por 09.08.2016 / 21:03

Tags