Чи можу я сказати SSH надсилати дані лише після натискання клавіші enter або вкладки, а не після кожного окремого натискання клавіші?
Чи можу я сказати SSH надсилати дані лише після натискання клавіші enter або вкладки, а не після кожного окремого натискання клавіші?
Відповіді:
Ні, тому що SSH не може знати, чи вимагатиме введення чи вкладка для дії те, що ви вводите, якщо ви, наприклад, намагаєтесь пройти історію команд, ^R
стрілки або стрілки не будуть надіслані себе, і це було б ... неприємно.
Не потрібно чекати між кожним символом, щоб він з’явився на екрані; якщо ви знаєте, що вам потрібно набрати, відбийте його так швидко, як вам подобається, і термінал наздожене приблизно за один час в обидва кінці з того моменту, коли ви перестали друкувати, що приблизно так само добре, як ви вийдете з налаштування лінійних буферів у будь-якому випадку (втрата пакетів відрізняється, але це вводить власні цікаві примхи).
PuTTY пропонує дві функції, які можуть бути корисними: "локальне відлуння" та "редагування локальних рядків". Локальне редагування рядків буферизує все та надсилає його на сервер лише після повернення рядка. Це може значно полегшити справу з командним рядком, але це може також зробити пекельний текстовий редактор.
У PuTTY також є деякі інші опції для вмикання / відключення певних речей (алгоритм Nagle), які можуть впливати на сприйману затримку з'єднання. Як я бачу, клієнт OpenSSH не пропонує всіх функцій, які PuTTY робить у цьому плані, і я не знаю альтернативи Linux, яка порівнює.
В іншому випадку жінки мають це правильно.
Mosh був розроблений для вирішення цієї проблеми. Він призначений для використання в умовах високої затримки та ненадійних з'єднань, а також забезпечує локальне редагування ехо та ліній.
Відкрийте сеанс ssh за допомогою ssh host.example.org bash
(або будь-якої оболонки, яку ви хочете використовувати).
Ви перейдете в режим віддаленої оболонки, що захищається від ліній, а це означає, що ви не отримаєте швидкого та швидкого редагування рядків, але ви отримаєте локальний відлуння та режим "одна лінія за часом". Іноді це корисно при роботі з дуже поганим зв’язком. Не всі програми працюватимуть належним чином, оскільки у вас не буде псевдо-tty, але більшість утилітів UNIX працює чудово.
Оновлення:
Використовуючи вищевказаний трюк, ви можете отримати звичайне редагування рядків ( readline ) на локальному кінці, використовуючи зручну програму для обгортки під назвою rlfe . Просто біжи rlfe ssh host.example.org bash
.
Мав таку ж проблему ( висока затримка та втрата пакетів через жахливу якість мобільних даних в деяких місцях), і msh не скорочує її для мене (для цього потрібні спеціальні програми на всіх віддалених хостах, виправляючи UTF8 локально та віддалено на всіх серверах, не порушуючи їх , змінивши всі брандмауери - і це все одно не забезпечує редагування локальних рядків) Я вирішив написати невелику обгортку, щоб забезпечити режим редагування локальної лінії для ssh .
За замовчуванням він просто передає все в ssh у режимі char-by-char за замовчуванням, але ви можете будь-коли натиснути гарячу клавішу, щоб увійти в режим редагування локальних рядків на базі читання. Таким чином, ви можете ввести (редагування, виклик команд тощо) весь рядок локально, і тоді, коли ви натиснете клавішу Enter, він буде надісланий як один пакет TCP у віддалену сторону.
Перевагою є редагування командного рядка без затримок (на зразок старого приготовленого телнету / канонічного «режиму буферування по рядках», але з покращеними командами редагування, передбаченими лінією зчитування GNU ). Також нічого не потрібно міняти на серверах або брандмауерах. А редактори та інші програми на основі прокльонів продовжують працювати нормально (хоча і із затримкою) у режимі char-by-char за замовчуванням, як у звичайному ssh-з'єднанні.
Недоліком є те, що вам або потрібно натискати гарячу клавішу, щоб увійти в режим редагування локальних рядків кожного разу, або вам потрібно змінити підказку на віддаленому хості, щоб дозволити автоматичне виявлення. Крім того, завершення назви файлів на віддаленій вкладці в даний час працює лише за допомогою переходу до режиму char-by-char (або використання локальної файлової системи замість віддаленої, залежно від ваших уподобань). Однак ця робота триває, тому запрошуйте запити чи корисні ідеї для вдосконалення!
Перевага полягає не лише в тому, що ваша оболонка (та редагування її рядків) є локальною та без затримок, але й у тому, що ви можете переміщатися по віддаленій файловій системі та використовувати завершення назви файлу оболонки ( клавіша вкладки ) для віддалених файлів. Крім того, (найкраща функція IMHO) ви можете використовувати місцевий редактор, який вибираєте, для безвідмовного редагування віддалених файлів.
Недоліками є (особливо, якщо ви посилаєтеся також на низьку пропускну здатність, і не тільки з високою затримкою), що для кожного файлу, який потрібно редагувати, його потрібно повністю перенести в localhost, а потім після редагування повністю перенести на віддалений знову. SSHFS передбачає деяке кешування (див. Sshfs (1) параметри кешу , cache_timeout , cache_x_timeout ), щоб дещо полегшити ці проблеми. Крім того, якщо ви хочете щось виконати на віддаленому просторі, вам потрібно скористатися іншим екраном або префіксом усіх команд з " ssh remotehost " (наприклад ssh remotehost sudo service apache restart
). Дивіться опцію ControlMaster в ssh_config (5), щоб зробити це швидше виконати (і без запиту пароля).
Ви можете наслідувати цю поведінку, якщо ви просто виконуєте команди, виконуючи,
ssh user @ targetmachine 'Мої команди в рядку'
але,
ssh-agent
або ввести парольВи можете використовувати 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\'
Це робить те, що ти хочеш. Вам потрібно встановити і клієнт, і сервер, і OpenSSH висхідний потік жодного разу не прийняв зміни. https://github.com/hyc/OpenSSH-LINEMODE