Чи є спосіб уникнути затримки введення SSH?


43

Чи можу я сказати SSH надсилати дані лише після натискання клавіші enter або вкладки, а не після кожного окремого натискання клавіші?


Мені дуже цікаво, де у вас така затримка набору тексту, що ви не можете з цим працювати. Я використовував ssh в епоху модему і ніколи не стикався з цими проблемами.
mailq

4
Я звертаюся до SliceHost VPS (США) з Бельгії. Затримка недостатньо помітна, щоб мене розгубити. Однак я помітив, що інші люди, здається, менше турбують це, ніж я ..
StackedCrooked


@mailq не використовуєш 3G у 2019 році? Шлях від сільського заміського будинку або під землею - це більше, як робити це з
комутацією

Відповіді:


32

Ні, тому що SSH не може знати, чи вимагатиме введення чи вкладка для дії те, що ви вводите, якщо ви, наприклад, намагаєтесь пройти історію команд, ^Rстрілки або стрілки не будуть надіслані себе, і це було б ... неприємно.

Не потрібно чекати між кожним символом, щоб він з’явився на екрані; якщо ви знаєте, що вам потрібно набрати, відбийте його так швидко, як вам подобається, і термінал наздожене приблизно за один час в обидва кінці з того моменту, коли ви перестали друкувати, що приблизно так само добре, як ви вийдете з налаштування лінійних буферів у будь-якому випадку (втрата пакетів відрізняється, але це вводить власні цікаві примхи).


Мені б дуже цікаво знайти спосіб порівняння швидкості набору тексту на декількох машинах. Я помітив, що швидкість може змінюватись ЛОТ між машинами, розташованими в одному місці, і які не мають на них великого навантаження. Моя теорія полягає в тому, що це відбувається особливо з невеликими примірниками AWS (як мікро- чи міні).
sorin

1
Подивіться на папір Моша. Автор зробив тестування mosh.org/#techinfo
user7610

25

PuTTY пропонує дві функції, які можуть бути корисними: "локальне відлуння" та "редагування локальних рядків". Локальне редагування рядків буферизує все та надсилає його на сервер лише після повернення рядка. Це може значно полегшити справу з командним рядком, але це може також зробити пекельний текстовий редактор.

У PuTTY також є деякі інші опції для вмикання / відключення певних речей (алгоритм Nagle), які можуть впливати на сприйману затримку з'єднання. Як я бачу, клієнт OpenSSH не пропонує всіх функцій, які PuTTY робить у цьому плані, і я не знаю альтернативи Linux, яка порівнює.

В іншому випадку жінки мають це правильно.


Це має бути прийнята відповідь
Фредді Фабрегас

Не вдалося встановити PuTTY на macOS, чи є заміна?
Aero Windwalker

Шпаклівка на Linux - це трохи біль. Він не може підключитися автоматично, показує якесь поле повідомлень про відключення, і мені потрібно знову відкрити вікно. Я б хотів, щоб я міг використовувати щось на зразок kitty або plink.exe на Linux або краще просто якось налаштувати autossh. Деякі пристрої не підтримують mosh tho (якщо я намагаюся отримати доступ до домашнього маршрутизатора openwrt)
POMATu

22

Mosh був розроблений для вирішення цієї проблеми. Він призначений для використання в умовах високої затримки та ненадійних з'єднань, а також забезпечує локальне редагування ехо та ліній.


Ви можете встановити його в локальному каталозі з джерела без sudo. Також перейдіть на сторінку mosh.org. У ній написано: "Немає пільгового коду. Ні демона. Вам не потрібно бути суперпользователем, щоб встановити або запустити Mosh. Клієнт і сервер - це виконувані файли, якими керує звичайний користувач і триває лише протягом життя з'єднання".
Стівен К. Хоуелл

1
Просто зазначити. Мош не SSH. Він використовує свій власний протокол. (Однак у мене немає проблем з цим.)
user7610

Це працювало з нуля для мене на андроїд та домашній поганій мережі Wi-Fi. Знає про
читальну лінію

9

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

Ви перейдете в режим віддаленої оболонки, що захищається від ліній, а це означає, що ви не отримаєте швидкого та швидкого редагування рядків, але ви отримаєте локальний відлуння та режим "одна лінія за часом". Іноді це корисно при роботі з дуже поганим зв’язком. Не всі програми працюватимуть належним чином, оскільки у вас не буде псевдо-tty, але більшість утилітів UNIX працює чудово.

Оновлення:

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


1
Я спробував і не вважав це дуже працездатним. Але це здорово знати, дякую.
StackedCrooked

це чудово працює для мене.
озера

6

Мав таку ж проблему ( висока затримка та втрата пакетів через жахливу якість мобільних даних в деяких місцях), і msh не скорочує її для мене (для цього потрібні спеціальні програми на всіх віддалених хостах, виправляючи UTF8 локально та віддалено на всіх серверах, не порушуючи їх , змінивши всі брандмауери - і це все одно не забезпечує редагування локальних рядків) Я вирішив написати невелику обгортку, щоб забезпечити режим редагування локальної лінії для ssh .

За замовчуванням він просто передає все в ssh у режимі char-by-char за замовчуванням, але ви можете будь-коли натиснути гарячу клавішу, щоб увійти в режим редагування локальних рядків на базі читання. Таким чином, ви можете ввести (редагування, виклик команд тощо) весь рядок локально, і тоді, коли ви натиснете клавішу Enter, він буде надісланий як один пакет TCP у віддалену сторону.

Перевагою є редагування командного рядка без затримок (на зразок старого приготовленого телнету / канонічного «режиму буферування по рядках», але з покращеними командами редагування, передбаченими лінією зчитування GNU ). Також нічого не потрібно міняти на серверах або брандмауерах. А редактори та інші програми на основі прокльонів продовжують працювати нормально (хоча і із затримкою) у режимі char-by-char за замовчуванням, як у звичайному ssh-з'єднанні.

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


З нетрадиційної сторони, ви можете альтернативно використовувати SSHFS для локального монтажу віддаленої файлової системи.

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

Недоліками є (особливо, якщо ви посилаєтеся також на низьку пропускну здатність, і не тільки з високою затримкою), що для кожного файлу, який потрібно редагувати, його потрібно повністю перенести в localhost, а потім після редагування повністю перенести на віддалений знову. 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 / спільного ssh-з'єднання )
  2. якщо у вас немає приватного ключа без пароля, вам доведеться використовувати ssh-agentабо ввести пароль
  3. явно це не працює, якщо ви взаємодієте з меню чи редагуєте файли тощо.

1

Ви можете використовувати 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\'

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.