web-dev-qa-db-fra.com

Comment traiter "Le pseudo-terminal ne sera pas attribué car stdin n'est pas un terminal."

ssh -t remotehost vim /tmp/x.txt

Je sais que je peux exécuter une commande comme ci-dessus.

Mais j'aimerais pouvoir utiliser n'importe quel code bash local sur une machine distante. Pour cette raison, j'aimerais appeler la 'bash -s' distante afin qu'elle puisse traiter n'importe quel code bash local.

ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt

Cependant, l'exemple ci-dessus montre "Le pseudo-terminal ne sera pas attribué car stdin n'est pas un terminal". Est-il possible de laisser ssh prendre le code bash local via stdin et l'exécuter via la commande 'bash -s' distante? Merci.

4
user1424739
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt

Vous obtenez le message "Le pseudo-terminal ne sera pas attribué ..." parce que vous exécutez ssh avec une seule option -t, lorsque l'entrée standard du processus ssh n'est pas un TTY. SSH imprime ce message spécifiquement dans ce cas. La documentation pour -t dit:

-t
Forcer l'allocation pseudo-terminale. Cela peut être utilisé pour exécuter des programmes d'écran arbitraires sur une machine distante, ce qui peut s'avérer très utile, par exemple. lors de la mise en œuvre des services de menu. Les options -t multiples forcent l'allocation de tty, même si ssh n'a pas de tty local.

L'option de ligne de commande -t est liée à l'option de configuration ssh RequestTTY :

RequestTTY
Spécifie s'il faut demander un pseudo-tty pour la session. L'argument peut être l'un des suivants: non (ne jamais demander un TTY), oui (toujours demander un TTY lorsque l'entrée standard est un TTY), forcer (toujours demander un TTY) ou auto (demander un TTY lors de l'ouverture d'une session). Cette option reflète les indicateurs -t et -T pour ssh (1).

Un seul -t équivaut à "RequestTTY yes", tandis que deux d'entre eux équivalent à "RequestTTY force".

Si vous souhaitez que vos commandes à distance s'exécutent avec un TTY, spécifiez -t deux fois:

ssh -tt remotehost 'bash -s' <<< vim /tmp/x.txt
or
ssh -t -t remotehost 'bash -s' <<< vim /tmp/x.txt

ssh allouera un téléscripteur au système distant et n'imprimera pas ce message.

Si la ou les commandes en cours d'exécution sur le système distant ne nécessitent pas de TTY, vous pouvez laisser l'option -t désactivée:

ssh remotehost 'bash -s' <<< vim /tmp/x.txt
6
Kenster

Je crois que ce qui suit pourrait convenir à vos objectifs:

vim /tmp/x.txt ; ssh remotehost 'bash -s' < /tmp/x.txt

La première expression (vim ...) vous permet de spécifier les commandes que vous souhaitez exécuter à distance sous la forme d'un fichier local appelé /tmp/x.txt; la deuxième expression (ssh ...) appelle l'interpréteur bash distant et lui envoie le contenu de votre fichier local pour exécution. Notez que vous n'avez pas besoin de l'option -t pour ssh dans ce cas (ce qui a donné lieu à l'avertissement pseudo-terminal) et que vous n'avez pas besoin d'utiliser une chaîne ici (<<<) mais que vous pouvez utiliser le fichier normal opérateur de saisie (<).

Cette solution semble fonctionner, par exemple, pour le contenu du fichier suivant:

echo These commands are being executed on $HOSTNAME
echo This is a second command
0
ngj