Який варіант .ssh / config відповідає для ssh -N


13

Я хочу встановити псевдонім у своєму конфігураційному файлі, який має такий же результат, як і ця команда:

ssh -N devdb -L 1234:127.0.0.1:1234

Мій запис .ssh / config для devdb:

Host devdb
User someuser
HostName the_hostname
LocalForward 1234 127.0.0.1:1234

Що я вкладаю у вищевказаний конфігурацію, щоб не запускати оболонку?


+1 за гарне запитання, яке змусило мене думати про те, як зробити тунелювання до випадкових речей швидше (я цього не роблю досить часто, щоб запам'ятати комутатори, але я зазвичай використовую ті самі порти, що змінюється лише хост).
WEBjuju

Відповіді:


22

Отже, ssh.cдля OpenSSH 7.6p1 ми знаходимо

            case 'N':
                    no_shell_flag = 1;
                    options.request_tty = REQUEST_TTY_NO;

так -Nі дві речі:

  • no_shell_flagтільки з'являється ssh.cі доступний тільки для -Wчи -Nопцій, в іншому випадку він з'являється в деяких логічних блоків , пов'язаних з ControlPersistі перевірки осудності з участю фонових вилок. Я не бачу способу, який варіант міг би встановити його безпосередньо.
  • в відповідно readconf.cз request_ttyвідповідає RequestTTYопції , описаної в ssh_config(5).

Це залишає (окрім того, як мавпа виправляє OpenSSH та перекомпілює, або запитує ssh_configможливість переключення no_shell_flagз ...) щось на кшталт:

Host devdb
 User someuser
 HostName the_hostname
 LocalForward 1234 127.0.0.1:1234
 RequestTTY no
 RemoteCommand cat

Те, що в технічному відношенні запускає оболонку, але ця оболонка повинна негайно замінити себе catпрограмою, яка потім блокує, щоб тим часом використовувати порт вперед. catє переносним, але споживає вхід (якщо такий є) або може вийти з ладу (якщо стандартний вхід закрито). Іншим варіантом було б запустити щось, що просто блокує .


1
+1 за те, що це .ssh/configробиться протягом ... молодець!
WEBjuju

Дивовижне дослідження на цю відповідь! Дякую!
жовтий-жовтий

Я віддаю перевагу RemoteCommand exec sleep infinity.
томас

3

@thrig має правильну відповідь, виходячи з вашого бажання робити це виключно в межах .ssh/config

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


sshn() {
  # set your desired host and port forwarding as default
  # and allow them to be passed in if you should need it

  host="${1:-devdb}"
  port="${2:-1234:127.0.0.1:1234}"

  # now all you have to do is `sshn` and it will connect

  echo "executing ssh -N $host -L $port"
  ssh -N "$host" -L "$port"
}

Ось три приклади його використання: без аргументів використовуються параметри за замовчуванням, зазначені у функції:

$ sshn
executing -N devdb -L 1234:127.0.0.1:1234

з тунелем за замовчуванням, запустіть на іншому хості:

$ sshn host2
executing ssh -N host2 -L 1234:127.0.0.1:1234

з обома типовими настройками запустіть повний разовий новий хост / тунель:

$ sshn host3 12345:127.0.0.1:12345
executing ssh -N host3 -L 12345:127.0.0.1:12345

0

Більш корисна віддалена команда на основі відповіді @ thrig:

Host someHost
Hostname 1.2.3.4
LocalForward 15673 localhost:15672
RequestTTY no
RemoteCommand bash -c 'echo "Listening on port 15673"; read -r -d '' _'

read -r -d '' _Блокуватиме підключення до користувача преса control+c.

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