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?
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"'
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.
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
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.
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.