Відповіді:
За замовчуванням, коли ви запускаєте команду на віддаленій машині за допомогою 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 містила б команду, що створює дані або -споживання, наприклад:
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
є сітка . Будь-яка з декількох доступних версій буде виконана.
Ви можете використовувати параметр 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
!