Comment résoudre `ttyname a échoué: ioctl inapproprié pour périphérique` dans Vagrant?


21

Lors de l'utilisation de cet extrait (provisionneur de shell en ligne):

config.vm.provision "shell" do |s|
  s.inline = <<-SHELL
    <shell code>
  SHELL
end

il en résulte:

==> default: mesg: 
==> default: ttyname failed
==> default: : 
==> default: Inappropriate ioctl for device

Il semble que d'autres personnes aient également trouvé ce problème . Quelqu'un sait-il comment le résoudre?


J'ai remarqué que même ce message était affiché comme une erreur, le script a été exécuté avec succès! Quelques jours plus tard, j'ai vu une solution possible et j'ai posté une réponse ici . Alors peut-être que vous n'en avez pas besoin, mais vous pouvez l'essayer et l'utiliser si cela fonctionne pour vous.
Ministre

@Minister Merci. Cela résout le problème. Pourriez-vous supprimer la réponse de SO et la publier sur SuperUser? Stackoverflow concerne la programmation.
030

Je suis content que la solution fonctionne aussi pour vous! Merci pour votre confirmation rapide! Je viens de poster une réponse ici, mais je ne sais pas si je dois supprimer ma réponse de SO ou un modérateur devrait déplacer la question de SO ici sur SU? Je suis d'accord si quelqu'un avec les autorisations appropriées modifie / supprime ma réponse là-bas, mais cela peut aider quelqu'un d'autre, donc je le laisse "tel quel" pour l'instant, réalisant que c'est une sorte de doublon (comme la question semble). ..
Ministre

Réponses:


10

J'ai remarqué que même ce message était affiché comme une erreur (en couleur ROUGE), le script a été exécuté avec succès! Quelques jours plus tard, j'ai vu un correctif possible et j'ai posté une réponse sur SO . Le "correctif" est:

# Prevent TTY Errors (copied from laravel/homestead: "homestead.rb" file)... By default this is "bash -l".
config.ssh.shell = "bash -c 'BASH_ENV=/etc/profile exec bash'"

Peut-être que vous n'en avez tout simplement pas besoin, mais vous pouvez l'essayer et l'utiliser si cela fonctionne pour vous.

Comme vous pouvez le voir dans la ligne commentée ci-dessus - le "mesg: ttyname a échoué ioctl inapproprié pour le périphérique" a été empêché par l'équipe laravel. Merci pour celui-ci!

La plupart des développeurs souhaitent éviter les erreurs / avertissements lors du développement, il semble donc que le correctif (un correctif possible) dont nous avions besoin.

Remarque importante: je n'ai pas trop testé cette solution, mais la boîte démarre sans l'erreur "mesg: ttyname a échoué ioctl inapproprié pour le périphérique"! Vous êtes libre de l'essayer et si vous rencontrez des problèmes, déposez simplement un commentaire pour gagner du temps à quelqu'un d'autre!


1
Remarque, cela semble casser vagrant ssh -c '...'. Peut-être que les arguments fournis sont ignorés.
Skeen

Cela semble cacher cette erreur pour moi mais cela ne fonctionne toujours pas
OZZIE

16

1) ouvrez /root/.profile

2) supprimer la ligne offensive

3) remplacez-le par:

tty -s && mesg n

Joyeux linuxing et bonne année.

George Hart, LSU


5
Soupir. Si seulement les distributions ubuntu (et autres?) Corrigeaient cela dans la norme /root/.profile... Cependant, man ttysur MacOS dit que "l'option -s est déconseillée au profit de la commande` `test -t 0 ''." , donc un meilleur remplacement pourrait êtretest -t 0 && mesg n
lindes

1
Pour automatiser cela, vous pouvez utilisersed -i -e 's/mesg n .*true/tty -s \&\& mesg n/g'
Gogowitsch

11

Il semble que cela soit dû à une interaction entre la configuration vagabonde par défaut de config.ssh.shellbe bash -l(qui simule un shell de connexion, traitant ainsi des fichiers de configuration liés à la connexion tels que .profile) avec une ligne dans le /root/.profilefichier sur au moins certaines distributions de Linux (y compris, par exemple, celui dans la boîte vagabonde ubuntu / xenial64 ), qui a:

mesg n || true

Une meilleure option pour cette ligne dans ce fichier serait probablement de lui faire dire:

test -t 0 && mesg n

... et, étant donné qu'il est difficile de changer en tant qu'utilisateur vagabond individuel, une solution plus immédiate consiste à supprimer l' -loption de la configuration vagabonde, par exemple avec (à l'intérieur Vagrantfile):

config.ssh.shell="bash"

(Mise en garde: il est concevable que ce changement puisse avoir des effets secondaires potentiellement négatifs. Il a semblé fonctionner très bien pour moi, cependant, avec certains approvisionneurs de shell de base, par exemple avec apt-get update, et ainsi de suite.)


Merci beaucoup pour cela! Ma prise: remplacer /root/.profile github.com/felixhummel/saltstates/blob/debian9/warts/bash/…
felixhummel

1

Quelles versions de Vagrant et VirtualBox utilisez-vous?

J'étais confronté à ce problème hier lors de l'utilisation de Vagrant 1.8.5 avec VirtualBox 5.1.4 (avec Ubunty 16.04). Cependant, après la mise à niveau vers Vagrant 1.9.2 et VirtualBox 5.1.14 aujourd'hui, le problème a disparu.

Notez qu'avant la mise à niveau, comme @Minister l'a également mentionné, le script s'est exécuté sans problème. Il ne faisait que générer le message "ttyname failed", qui donnait l'impression qu'une erreur s'était produite, alors que le script de provisioning s'était en fait exécuté avec succès.


0

Ce problème a commencé à se produire dans une installation Vagrant que j'utilisais depuis des années et que j'avais également mise à niveau de temps en temps. Je suis passé au dernier Vagrant (1.9.1 -> 2.0.3) et le problème a disparu. (il a également éliminé d'autres choses excentriques qui s'étaient glissées dans son fonctionnement)

Je ne sais pas si c'est la nouvelle version qui l'a corrigé ou si les fichiers / configurations existants ont été rafraîchis dans le processus de mise à niveau ou une combinaison des deux.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.