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

43

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

StackedCrooked
источник
Мне очень интересно, где у вас такая задержка печати, что вы не можете с ней работать. Я использовал ssh в эпоху модемов и никогда не сталкивался с этими проблемами.
mailq
4
Я получаю доступ к SliceHost VPS (США) из Бельгии. Задержка достаточно заметна, чтобы сбить меня с толку. Тем не менее, я заметил, что другие люди, кажется, менее обеспокоены этим, чем я ..
StackedCrooked
5
mosh.mit.edu
alfC
@ mailq ты не используешь 3G в 2019 году? sshing из деревенского загородного дома или метро - это больше похоже на
дозвон

Ответы:

32

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

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

romble
источник
Я был бы очень заинтересован в том, чтобы найти способ сравнить скорость ssh-typing на нескольких машинах. Я заметил, что скорость может сильно варьироваться между машинами, расположенными в одном и том же месте, и которые не имеют большой нагрузки на них. Моя теория состоит в том, что это происходит особенно с небольшими экземплярами из AWS (например, микро или мини).
сорин
1
Посмотрите на бумагу Моша. Автор сделал несколько сравнительных тестов mosh.org/#techinfo
user7610
Мне пришлось использовать «ssh -t .... bash -i» -t означает «принудительное распределение pty» (иначе SSH не считает, что это необходимо, и bash жалуется), а -i запускает bash в интерактивном режиме ( иначе он пропускает некоторую инициализацию). Передача ssh -C тоже (сжатие трафика) может помочь в дальнейшем. Отличный совет, спасибо.
Закмк
25

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

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

В противном случае, Womble имеет право.

Джефф Ферланд
источник
Это должен быть принятый ответ
Фредди Фабрегас
Я не смог установить PuTTY на macOS, есть ли замена?
Aero Windwalker
Замазка на Linux - это немного больно. Он не может переподключиться автоматически, показывает какое-то окно сообщения при отключении, и мне нужно снова открыть окно. Я хотел бы использовать что-то вроде kitty или plink.exe в Linux или лучше просто настроить autossh. Некоторые устройства не поддерживают mosh tho (если я пытаюсь получить доступ к своему домашнему маршрутизатору openwrt)
POMATu
22

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

Стивен Хоуэлл
источник
Вы можете установить его в локальный каталог из источника без sudo. Кроме того, посмотрите на mosh.org. В нем говорится: «Нет привилегированного кода. Нет демона. Вам не нужно быть суперпользователем для установки или запуска Mosh. Клиент и сервер - это исполняемые файлы, запускаемые обычным пользователем и действующие только в течение всего срока жизни соединения».
Стивен Хоуэлл
1
Просто отметить. Мош это не СШ. Он использует собственный проприетарный протокол. (У меня нет проблем с этим, хотя.)
user7610
Это работало с нуля для меня на Android и домашней плохой сети Wi-Fi. Он знает о readline
tinmarino
9

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

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

Обновить:

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

щелчок
источник
1
Я пытался и не нашел это очень работоспособным. Но это здорово знать, спасибо.
StackedCrooked
это прекрасно работает для меня.
Озеро
6

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

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

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

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


С другой стороны, вы можете использовать SSHFS для локального монтирования удаленной файловой системы.

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

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

Матия Налис
источник
3

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

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

но,

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

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

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

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

Чтобы сократить это, я добавил это к моему .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\'
Кьелл
источник
0

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

HyC
источник