Что такое опция .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.