Ответы:
По умолчанию, когда вы запускаете команду на удаленном компьютере с помощью 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"'
Есть лучший способ использовать 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 . Подойдет любая из нескольких доступных версий.
Вы можете использовать опцию 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 ~]$
Вы можете переопределить опцию конфигурации 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.
ssh!