Используя уже установленный канал SSH

Согласно nano's строка заголовка, Вы редактируете файл истории удара после нажатия v:

/tmp/bash-fc-1212173730

Я подозреваю, что Ctrl-Left и Ctrl-Right активируют интерактивный режим истории.

Делает Ваш .bashrc содержите привязку для history-search-backward и history-search-forward?

Можно отключить это поведение путем комментирования или удаление, любой из тех связывает строки в Вашем .bashrc или в .bash_aliases.

51
06.03.2012, 15:59
3 ответа

Это очень просто с достаточно недавними версиями OpenSSH, если Вы планируете заранее.

Откройте основное соединение в первый раз. Для последующих соединений направьте ведомые соединения посредством существующего основного соединения. В Вашем ~/.ssh/config, настройте совместное использование соединения для случая автоматически:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

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

57
27.01.2020, 19:33
  • 1
    Выглядит, что второй не будет зарегистрирован в/var/log/secure или /var/log/auth.log. Однако второй будет зарегистрирован в/var/log/wtmp? –  SOUser 06.09.2013, 18:21
  • 2
    @XichenLi /var/log/secure и /var/log/auth.log зарегистрируйте соединения SSH; ведомое соединение не появляется там, потому что оно осуществляет контрейлерные перевозки на существующем соединении. Если Ваша ssh сессия выделяет терминал (т.е. ssh somehost без команды, предоставленной, или ssh -t), это (обычно) зарегистрировано wtmp, независимо от того, как появился тот терминал (sshd независимо от того, что метод использовался для установления соединения, приложения эмулятора терминала, …). –  Gilles 'SO- stop being evil' 06.09.2013, 18:51
  • 3
    Можно также использовать ControlPersist 600 который является задержкой в секундах сокета, находящегося в неактивном, прежде чем он будет автоматически удален. Иначе это закроется автоматически, когда основное соединение закончится. Это бесполезно для выполнения ряда команд удаленно (например, ряда команд rsync к различным папкам) –   19.06.2016, 04:05
  • 4
    Если Вы не хотите редактировать глобальную конфигурацию, можно также использовать опции -S (укажите сокет), и -M (создайте основное соединение) клиента SSH. –  yankee 07.10.2016, 23:07

Это довольно легко достигнуть использования nc инструмента и туннелей ssh.

1. Откройте туннель ssh

На Вашей ssh сессии введите ~C на новой строке. Вы получите ssh подсказку "сервисной консоли", которая похожа на это:

ssh> 

Тип в локальном направляет команду для открытия туннеля ssh:

ssh> -L22000:targethost:22001
Forwarding port.

Где targethost имя хоста или IP-адрес машины, с которой Вы подключены.

Теперь, принятие ssh сервера на целевой машине не было настроено для запрещения туннелей, у Вас есть желаемая передача соединения: ssh клиент на Вашей машине слушает порт 22000, и это передаст любой трафик, отправленный в него к 22 001 порту на targethost.

2. Запустите сетевой сервер на удаленной машине

Это уже столь же просто как ввод Ваш открытый ssh сессия следующая команда:

remote$ nc -l localhost 22001 | sh

Это запустит сервер TCP, слушающий на порте 22001 – который является целевым портом нашего туннеля ssh – и направьте полученные данные (по-видимому, окружите команды) к a targethost экземпляр оболочки.

3. Отправьте свой сценарий по туннелю

local$ cat yourscript.sh | nc localhost 22000

Это отправит тело сценария в Ваш туннель ssh и закончит тем, что было выполнено в оболочке на targethost. Вы будете видеть вывод сценария в своем терминале с ssh сессией.


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

23
27.01.2020, 19:33
  • 1
    Большой ответ. Технически, для получения до сервисной консоли, ~ символ должен прибыть после новой строки, таким образом, LF ~ C вероятно, лучшая последовательность. –  Alexios 06.03.2012, 16:54
  • 2
    @Alexios, корректный. –  ulidtko 06.03.2012, 18:22
  • 3
    Удивительный прием! Для записи, ssh страница справочника показывает еще некоторую информацию об этом (прокрутите вниз для разделения названный "СИМВОЛАМИ ESC"), –  Carles Sala 18.02.2015, 18:07
  • 4
    @CarlesSala, также хороший для знания этого less, общий пейджер по умолчанию, поиск поддержек, который может сохранить Вас некоторая прокрутка, если Вы знаете свои ключевые слова: просто введите man ssh /ESCAPE и Вы там. –  ulidtko 18.02.2015, 22:12
  • 5
    @ulidtko, но насколько я знаю, нельзя связать команду CLI в ТАК комментарий, таким образом, я нашел страницу справочника HTML более оптимальным вариантом ;-) –  Carles Sala 19.02.2015, 14:30

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

Короче говоря, вам нужно:

  1. создать файл конфигурации ssh, содержащий информацию о ssh сеанс

    remote=your_ip_address
    echo "HostName $remote" > ssh_config
    echo "User root" >> ssh_config
    echo "ControlMaster auto" >> ssh_config
    echo "ControlPath ~/.ssh/%C" >> ssh_config
    master_ssh='ssh -F ssh_config'
    
  2. запустить основной сеанс

    $master_ssh -MNf $remote
    
  3. выполнить rsync

    rsync -e "$master_ssh" $opts $remote:/etc/some_file1  local_directory/
    rsync -e "$master_ssh" $opts $remote:/etc/some_file2  local_directory/
    rsync -e "$master_ssh" $opts $remote:/etc/some_file3  local_directory/
    
  4. закрыть основной сеанс

    $master_ssh -O exit $remote
    
2
07.07.2020, 03:40

Теги

Похожие вопросы