SSH внутри SSH терпит неудачу с «stdin: это не tty»

58

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

ssh user@computerone.com 'ssh otheruser@computertwo.com'

stdin: is not a tty

Почему?

Jhonathan
источник
1
Я не думаю, что вам нужны эти одинарные кавычки вокруг второго ssh!
coffeMug

Ответы:

70

По умолчанию, когда вы запускаете команду на удаленном компьютере с помощью ssh, TTY не выделяется для удаленного сеанса. Это позволяет передавать двоичные данные и т. Д. Без необходимости работать с причудами TTY. Это среда, предусмотренная для команды, выполняемой на computerone.

Однако, когда вы запускаете ssh без удаленной команды, он выделяет TTY, потому что вы, скорее всего, будете запускать сеанс оболочки. Это ожидается ssh otheruser@computertwo.comкомандой, но из-за предыдущего объяснения для этой команды нет доступного TTY.

Если вы хотите включить оболочку computertwo, используйте это вместо этого, что приведет к выделению TTY во время удаленного выполнения:

ssh -t user@computerone.com 'ssh otheruser@computertwo.com'

Это обычно подходит, когда вы в конце концов запускаете оболочку или другой интерактивный процесс в конце цепочки ssh. Если вы собираетесь передавать данные, добавлять их не нужно и не нужно -t, но тогда каждая команда ssh будет содержать команду создания данных или -consuming, например:

ssh user@computerone.com 'ssh otheruser@computertwo.com "cat /boot/vmlinuz"'
МРБ
источник
9

Есть лучший способ использовать SSH в качестве реле: используйте ProxyCommandопцию. Вам понадобится ключ на клиентском компьютере, который позволит вам войти на второй компьютер (открытый ключ в любом случае является рекомендуемым способом использования SSH). Положи это в свой ~/.ssh/configи беги ssh computertwo.

Host computerone
HostName computerone.com
UserName user

Host computertwo
HostName computertwo.com
UserName otheruser
ProxyCommand ssh computerone exec nc %h %p

ncэто netcat . Подойдет любая из нескольких доступных версий.

Жиль "ТАК - перестань быть злым"
источник
Разве нам не нужно добавлять строку, связанную с «прокси», в «author_keys» на computerone? Я продолжаю думать о «прокси» власти openSSH, но пока не дошел до этого.
Фелипе Альварес
7

Он ожидает интерактивный терминал на tty устройстве на промежуточном сервере.

Если вы попробуете эту команду, она должна работать:

ssh user@computer1 -t "ssh otheruser@computer2"

Смотрите man sshдля -tварианта.

roknir
источник
2

Я решил это, добавив RequestTTY Yes к моему файлу конфигурации ssh, расположенному в ~ / .ssh / config следующим образом ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
Джон
источник
1

Вы можете использовать опцию PROXY Jump в SSH

-J [user@]host[:port]
 Connect to the target host by first making a ssh connection to the jump host and then establishing a TCP forwarding to the ultimate destination from there.  Multiple jump hops may be specified
 separated by comma characters.  This is a shortcut to specify a ProxyJump configuration directive.

Поэтому, если мне нужно подключиться к hostB, но сначала мне нужно пройти через hostA. Обычно я бы

 ssh hostA
 [user@hostA ~]$ ssh hostB

Я сейчас делаю это

ssh -J hostA hostB
[user@hostB ~]$
nelaaro
источник
0

Вы можете переопределить опцию конфигурации SSH «RequestTTY» из командной строки.

Мой рабочий пример cd-serv-one.shначинается /bin/bashв сеансе SSH после выполнения нескольких команд:

#!/bin/bash

ssh -o "requestTTY=yes" User@ExampleHostName "cd /home/myPathFoo/myPathBar; /bin/bash"

А сейчас я просто запускаю ./cd-serv-one.shнеобходимый сеанс SSH.

xorDiv
источник