Назад | Перейти на главную страницу

Есть ли способ избежать задержки ввода SSH?

Могу ли я указать SSH отправлять данные только после нажатия клавиши ввода или табуляции, а не после каждого нажатия отдельной клавиши?

Нет, потому что SSH не может узнать, потребуется ли ввод или табуляция для действия - если вы пытаетесь просмотреть историю своих команд, например, ^R или стрелки вверх не пошли бы сами по себе, и это было бы ... неприятно.

Однако вам не нужно ждать между каждым символом, чтобы он появился на экране; если вы знаете, что вам нужно набрать, продолжайте набирать обороты так быстро, как хотите, и терминал наверстает упущенное примерно за один цикл туда и обратно с момента, когда вы перестали печатать, что примерно так хорошо, как вы выберетесь из в любом случае установка с линейной буферизацией (потеря пакетов отличается, но она привносит свои собственные интересные особенности).

Mosh был разработан для решения именно этой проблемы. Он разработан для использования в ненадежных соединениях с большой задержкой и обеспечивает локальное эхо и редактирование строк.

PuTTY предлагает две функции, которые могут быть полезны: «локальное эхо» и «локальное редактирование строки». При локальном редактировании строки все буферизуется и отправляется на сервер только после возврата строки. Это может значительно упростить работу с командной строкой, но также может сделать использование текстового редактора адом.

PuTTY также имеет некоторые другие параметры для включения / отключения определенных вещей (алгоритм Нэгла), которые могут повлиять на воспринимаемую задержку соединения. На мой взгляд, клиент OpenSSH не предлагает всех функций, которые PuTTY делает в этом отношении, и я не знаю альтернативы Linux, которая могла бы сравниться.

В остальном Womble прав.

Откройте сеанс ssh с помощью ssh host.example.org bash (или любую другую оболочку, которую вы хотите использовать).

Вы получите режим строчной буферизации для удаленной оболочки, что означает, что вы не получите подсказку и строковое редактирование, но вы получите локальное эхо и режим «по одной строке за раз». Иногда это полезно при работе с очень плохим соединением. Не все программы будут работать правильно, потому что у вас не будет псевдотерминала, но большинство утилит UNIX работают нормально.

Обновить:

Используя описанный выше трюк, вы можете получить нормальное редактирование строки (строка чтения) на местный закончить с помощью удобной программы-оболочки под названием rlfe. Просто беги rlfe ssh host.example.org bash.

Имея такую ​​же проблему (высокая задержка и потеря пакетов из-за ужасного качества мобильных данных в некоторых местах), и мош не сокращая его для меня (для этого нужны специальные программы на всех удаленных хостах, исправление UTF8 локально и удаленно на всех серверах без их нарушения, изменение всех брандмауэров - и это действительно не обеспечивает редактирование локальной строки в любом случае) Я решил написать небольшая обертка для предоставления режим редактирования локальной строки для ssh.

По умолчанию он просто передает все в ssh в режиме char-by-char по умолчанию, но вы можете нажать горячую клавишу, чтобы войти в режим редактирования локальной строки на основе readline в любое время. Таким образом, вы можете ввести (с редактированием, вызовом команды и т. Д.) Всю строку локально, а затем, когда вы нажмете войти он будет отправлен как один TCP-пакет удаленной стороне.

Преимущество заключается в редактировании командной строки без задержек (например, в старом telnet-каноническом "построчном буферизированном режиме", но с превосходными командами редактирования, предоставляемыми Строка чтения GNU). Кроме того, ничего не нужно менять на серверах или межсетевых экранах. А редакторы и другие программы на основе curses продолжают нормально работать (хотя и с задержкой) в режиме char-by-char по умолчанию, как при обычном ssh-соединении.

Недостатком является то, что вам нужно либо нажимать горячую клавишу для входа в режим редактирования локальной строки каждый раз, когда вы этого хотите, либо вам нужно изменить приглашение на удаленном хосте, чтобы разрешить автоматическое определение. Также удаленный вкладка автозавершение имени файла в настоящее время работает только путем возврата в режим char-by-char (или использует локальную файловую систему вместо удаленной, в зависимости от ваших предпочтений). Тем не менее, эта работа еще не завершена, поэтому приветствуются запросы на включение или реальные идеи по улучшению!


On the unconventional side, you could alternatively use SSHFS to mount remote filesystem locally.

Преимущество заключается не только в том, что ваша оболочка (и ее редактирование строки) является локальной и без задержек, но также в том, что вы можете перемещаться по удаленной файловой системе и использовать завершение имени файла оболочки (клавиша табуляции) для удаленных файлов. Кроме того, (лучшая функция IMHO) вы можете использовать свой локальный редактор для редактирования удаленных файлов без задержек.

Недостатки (особенно, если вы связываете также с низкой пропускной способностью, а не только с высокой задержкой), что для каждого редактируемого файла его необходимо полностью перенести на localhost, а затем после редактирования снова полностью передать на удаленный компьютер. SSHFS обеспечивает некоторое кеширование (см. Параметры sshfs (1) тайник, cache_timeout, cache_x_timeout), чтобы несколько смягчить эти проблемы. Кроме того, если вы хотите выполнить что-либо на удаленном компьютере, вам нужно использовать другой экран или префикс всех команд с помощью "удаленный хост ssh" (например ssh remotehost sudo service apache restart). См. Вариант ControlMaster в ssh_config (5) чтобы ускорить выполнение (и без запроса пароля).

Вы можете эмулировать это поведение, если просто выполняете команды,

ssh user @ targetmachine 'мои команды в строке'

но,

  1. это добавляет дополнительную задержку при создании соединения (может быть уменьшено с помощью мультиплексированные ssh-соединения)
  2. если у вас нет закрытого ключа без пароля, вам придется использовать ssh-agent или введите пароль в
  3. очевидно, что это не работает, если вы взаимодействуете с меню или редактируете файлы и т. д.

Делай то, что хочешь. Однако вам необходимо установить и клиент, и сервер, а исходящий поток OpenSSH никогда не принимал изменений. https://github.com/hyc/OpenSSH-LINEMODE

Вы можете использовать tmux, чтобы добиться плавного отражения вашего набора текста. Запустите tmux локально. Если у вас есть оболочка ssh на одной панели, а локальная оболочка на панели под ней, то из локальной панели вы можете отправлять ключи на удаленную панель.

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

Интерактивные команды и небольшие команды, которые я набираю непосредственно в отстающей оболочке ssh. Как только задержка начинает мешать мне набирать текст, я переключаюсь на локальную панель и использую клавиши отправки. Это работает даже во время набора команды.

Чтобы сократить его, я добавил это в свой .bashrc

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

Спасибо Кристиану Пелчарски за объяснение ключей для отправки: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

Вам придется избегать при использовании кавычек, например

ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'

(Обновление 2020 г.)

Как ни смешно это звучит, я обнаружил, что установка TigerVNC, а затем запуск удаленного терминала и «потокового» экрана по протоколу VNC предлагает намного лучший опыт и устраняет задержки даже при не очень хороших соединениях.