web-dev-qa-db-fra.com

SSH à l'intérieur de SSH échoue avec "stdin: n'est pas un tty"

J'essaie de me connecter à la machine un avec ssh, puis de me connecter à une autre machine deux avec ssh, mais je reçois cette erreur.

ssh [email protected] 'ssh [email protected]'

stdin: is not a tty

Pourquoi?

62
Jhonathan

Par défaut, lorsque vous exécutez une commande sur la machine distante à l'aide de ssh, un TTY n'est pas alloué pour la session distante. Cela vous permet de transférer des données binaires, etc. sans avoir à faire face à des bizarreries ATS. Il s'agit de l'environnement fourni pour la commande exécutée sur computerone.

Cependant, lorsque vous exécutez ssh sans commande distante, il alloue un TTY, car vous exécutez probablement une session Shell. Ceci est attendu par le ssh [email protected], mais en raison de l'explication précédente, aucun TTY n'est disponible pour cette commande.

Si vous voulez un Shell sur computertwo, utilisez-le à la place, ce qui forcera l'allocation TTY lors de l'exécution à distance:

ssh -t [email protected] 'ssh [email protected]'

Cela est généralement approprié lorsque vous exécutez un shell ou un autre processus interactif à la fin de la chaîne ssh. Si vous alliez transférer des données, il n'est ni approprié ni obligatoire d'ajouter -t, mais alors chaque commande ssh contiendrait une commande produisant ou consommant des données, comme:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
73
mrb

Il existe une meilleure façon d'utiliser SSH comme relais: utilisez l'option ProxyCommand. Vous aurez besoin d'avoir une clé sur la machine client qui vous permet de vous connecter au deuxième ordinateur (la clé publique est la façon recommandée d'utiliser SSH dans la plupart des cas). Mettez ceci dans votre ~/.ssh/config et courir ssh computertwo.

Host computerone
HostName computerone.com
User user

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

nc est netcat . N'importe laquelle des plusieurs versions disponibles fera l'affaire.

Il attend un terminal interactif sur un périphérique tty sur le serveur intermédiaire.

Si vous essayez cette commande, elle devrait fonctionner:

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

Voir man ssh pour le -t option.

7
roknir

J'ai résolu cela en ajoutant RequestTTY Yes à mon fichier de configuration ssh situé dans ~/.ssh/config comme ceci ...

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
3
John

Vous pouvez utiliser l'option PROXY Jump dans 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.

Donc, si je dois me connecter à hostB, mais je dois d'abord passer par hostA pour y arriver. Normalement, je

 ssh hostA
 [user@hostA ~]$ ssh hostB

Je fais maintenant ça

ssh -J hostA hostB
[user@hostB ~]$

Vous pourriez même , séparer plusieurs hôtes

ssh -J hostA,hostB hostC
[user@hostC]

Beaucoup plus simple que d'essayer -t pour réexécuter la commande ssh.

2
nelaaro

Vous pouvez remplacer une option de configuration SSH "RequestTTY" à partir de la ligne de commande.

Mon exemple de travail cd-serv-one.sh départs /bin/bash dans la session SSH après avoir exécuté plusieurs commandes:

#!/bin/bash

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

Et maintenant je lance juste ./cd-serv-one.sh pour démarrer une session SSH nécessaire.

0
xorDiv