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

58

J'essaie de me connecter à la machine un avec ssh, puis à une autre machine deux avec ssh, mais j'obtiens cette erreur.

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

stdin: is not a tty

Pourquoi?

Jhonathan
la source
1
Je ne pense pas que vous ayez besoin de ces guillemets simples autour de la seconde ssh!
coffeMug

Réponses:

70

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 aux erreurs de TTY. C'est l'environnement fourni pour la commande exécutée computerone.

Cependant, lorsque vous exécutez ssh sans commande à distance, il attribue un TTY, car vous exécuterez probablement une session shell. Ceci est prévu par la ssh [email protected]commande, mais en raison de l'explication précédente, aucun TTY n'est disponible pour cette commande.

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

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

Cela est généralement approprié lorsque vous exécutez éventuellement un shell ou un autre processus interactif à la fin de la chaîne ssh. Si vous deviez transférer des données, il n'est ni approprié ni nécessaire de les ajouter -t, mais chaque commande ssh contiendrait une commande produisant des données ou une commande -consuming, telle que:

ssh [email protected] 'ssh [email protected] "cat /boot/vmlinuz"'
mrb
la source
9

Il existe un meilleur moyen d'utiliser SSH en tant que relais: utilisez l' ProxyCommandoption. Vous aurez besoin d'une clé sur la machine cliente qui vous permettra de vous connecter au deuxième ordinateur (la clé publique est de toute façon recommandée pour utiliser SSH dans la plupart des cas). Mettez ceci dans votre ~/.ssh/configet lancez ssh computertwo.

Host computerone
HostName computerone.com
UserName user

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

ncest netcat . Toutes les versions disponibles feront l'affaire.

Gilles, arrête de faire le mal
la source
Ne sommes-nous pas obligés d'ajouter une ligne liée à un "proxy" dans 'authorised_keys' sur computerone? Je continue à vouloir examiner le pouvoir 'proxy' d'OpenSSH, mais je ne l'ai pas encore compris.
Felipe Alvarez
7

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

Si vous essayez cette commande, ça devrait marcher:

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

Voir man sshpour l' -toption.

Roknir
la source
2

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

Host myserver.com
  User my-ssh-username
  RequestTTY Yes
John
la source
1

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 que je dois d'abord passer par hostA pour y arriver. Normalement je voudrais

 ssh hostA
 [user@hostA ~]$ ssh hostB

Je fais maintenant ça

ssh -J hostA hostB
[user@hostB ~]$
Nelaaro
la source
0

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

Mon exemple de travail cd-serv-one.shcommence /bin/bashdans une session SSH après l'exécution de plusieurs commandes:

#!/bin/bash

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

Et maintenant, je cours juste ./cd-serv-one.shpour démarrer une session SSH nécessaire.

xorDiv
la source