Псевдо-терминал не будет выделен, потому что stdin не является терминалом

14

Я пытаюсь настроить автоматическое переключение SSH через сервер, на котором нет nc.

Это работает из командной строки:

ssh -A gateway ssh steve@target

(Я добавил свой открытый ключ к агенту SSH).

Однако добавление его в ~ / .ssh / config не делает:

Host target
  User steveb
  ProxyCommand ssh -A gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Попытка навязать эту проблему -tзабавна, но бесполезна.

ProxyCommand ssh -A -t gateway ssh steve@targetip

$ ssh target
Pseudo-terminal will not be allocated because stdin is not a terminal.
Pseudo-terminal will not be allocated because stdin is not a terminal.


^CKilled by signal 2.

Больше -t? Не хорошо.

ProxyCommand ssh -A -t -t gateway ssh steve@targetip

$ ssh target
tcgetattr: Inappropriate ioctl for device


^CKilled by signal 2.

Это возможно? Большинство учебных пособий (например, http://www.arrfab.net/blog/?p=246 ) предлагают использовать nc.

Стив Беннетт
источник
Является ли заключение, что netcat требуется?
MountainX-for-Monica
Похоже на то. В этом случае я смог установить его, решив мою проблему - но у меня не всегда такая роскошь.
Стив Беннетт
Смотрите мой ответ ниже о двух способах, которыми я смог сделать это без netcat.
MountainX-for-Monica

Ответы:

13

SSH ProxyCommand без netcat

ProxyCommand очень полезен, когда узлы доступны только косвенно. С netcat это относительно прямолинейно:

ProxyCommand ssh {gw} netcat -w 1 {host} 22

Здесь {gw} и {хост} являются заполнителями для шлюза и хоста.

Но это также возможно, когда netcat не установлен на шлюзе:

ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'

/ Dev / tcp является встроенной функцией стандартного bash. Файлы не существуют. Чтобы проверить, есть ли в bash эта функция, используйте:

cat < /dev/tcp/google.com/80 

... на воротах.

Чтобы убедиться, что используется bash, используйте:

ProxyCommand ssh {gw} "/bin/bash -c 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'"

И это даже работает вместе с ControlMaster.

(Обновлено 22 октября, добавлено kill, чтобы очистить фоновую кошку) (Обновлено 3 марта 2011, чтобы сделать заполнители более понятными и объяснить / dev / tcp)

100% скидка для Ролана Шульца. Вот источник:
http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html
см. Более полезную информацию в комментариях.

Здесь также есть больше:
http://www.linuxjournal.com/content/tech-tip-tcpip-access-using-bash
http://securityreliks.securegossip.com/2010/08/enabling-devtcp-on-backtrack -4r1ubuntu /

ОБНОВЛЕНИЕ : вот что-то новое от Марко

В отношении ProxyCommand в ~ / .ssh / config, где есть строка, подобная этой:

ProxyCommand ssh gateway nc localhost %p

Марко говорит:

Вам не нужен netcat, если вы используете последнюю версию OpenSSH. Вы можете заменить nc localhost% p на -W localhost:% p.

Результат будет выглядеть так:

ProxyCommand ssh gateway -W localhost:%p
MountainX-для-Моника
источник
8

Большой Т, не маленький т.

-T' Disable pseudo-tty allocation.
-t' Force pseudo-tty allocation. 

Мой скрипт возвращал это сообщение и больше не работает.

/usr/bin/ssh -T -q -i $HOME/.ssh/one_command other_system

Я использую authorized_keyна other_system, чтобы заставить это выполнить команду:

from="my.mydomain.com",command="bin/remotely-run" ssh-rsa ... 
user46083
источник
3

Попробуйте это:

ProxyCommand ssh -A -t gateway ssh -t steve@targetip
Хауке Лагинг
источник
Подожди, как это отличается от того, что я пробовал?
Стив Беннетт
@SteveBennett Разница в том, что это не только попытка выделить TTY во второй системе, но и в первой.
Хауке Лагинг
это та же самая команда, которую я упомянул с "забавным, но бесполезным" результатом?
Стив Беннетт
@ SteveBennett Я действительно неправильно это понял. Моя цель состояла в том, чтобы иметь -tв обоих связях, и я видел это в неправильном. Я отредактировал свой ответ.
Хауке Лагинг
Ах. Ну все равно ничего хорошего. Перепробовал все комбинации.
Стив Беннетт
-3

Вы можете попробовать следующую технику ssh'ing на server1 с последующим ssh'ing на server2.

$ ssh -t user1@server1 ssh -t user2@server2 

Делать так, как это работает для меня.

Ян Мариус Эванг
источник
1
Пожалуйста, объясните больше ... Что делает эта команда и как полезно решить ответ.
Tejas