SSH всередині SSH не вдається "stdin: не tty"


58

Я намагаюся підключитися до машини один із ssh, а потім підключити до другої машини два з ssh, але я отримую цю помилку.

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

stdin: is not a tty

Чому?


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 містила б команду, що створює дані або -споживання, наприклад:

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є сітка . Будь-яка з декількох доступних версій буде виконана.


Невже нам не потрібно додавати лінію "проксі" в "дозволені_кейси" на комп'ютері? Я все ще маю на увазі вивчити "проксі" силу openSSH, але просто до цього часу не дочекався.
Феліпе Альварес

7

Він очікує інтерактивного терміналу на tty пристрої на проміжному сервері.

Якщо ви спробуєте цю команду, вона повинна працювати:

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

Див man sshдля -tопції.


2

Я вирішив це, додавши RequestTTY Так у свій файл конфігурації 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 ~]$

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.