Pourquoi la redirection de 'script' vers / dev / null / allow 'screen' fonctionne-t-elle tant que l'utilisateur est un autre utilisateur?

37

J'ai été invité à exécuter un script particulier de longue durée. Je voulais utiliser screen mais le message d'erreur "Impossible d'ouvrir votre terminal '/ dev / pts / 4' - veuillez vérifier."

J'ai donc cherché sur Google et suis tombé sur un message du forum qui demandait de courir $ script '/dev/null/'. Je l'ai fait et j'ai ensuite pu passer au crible.

Pourquoi ça marche? Qu'est-ce que su fait que l'écran ne peut pas s'exécuter en tant qu'utilisateur su'ed? Pourquoi rediriger 'script' vers / dev / null empêche-t-il cela autrement? Utilisez-vous un script pour écrire un journal en tant qu'utilisateur d'origine?

Ichorus
la source
2
Cleaner serait de courir à supartir d'une session d'écran.
justarobert
@justarobert pas si vous voulez que plusieurs utilisateurs puissent se connecter à ce même écran pour un compte de service / batch-script en cours d'exécution.
Ashley

Réponses:

41

Eh bien, techniquement, vous ne redirigez rien ici.

L' appel script /dev/nullest tout simplement scriptenregistrer la totalité tapuscrit en /dev/nullqui signifie la pratique de jeter le contenu.

Voir man scriptles informations détaillées et le paquet util-linux-ng pour implementation ( misc-utils/script.c).

Cela n'a rien à voir avec screenréellement. Pourquoi cela fonctionne-t-il? L'appel scripta pour effet secondaire de créer un pseudo-terminal pour vous sur /dev/pts/X. De cette façon, vous n'avez pas à le faire vous-même, et screen n'aura pas de problèmes de permission - si vous passez sud'utilisateur A à utilisateur B , appelez directement screenpour essayer de prendre possession du pseudo-terminal de l'utilisateur A. Cela ne réussira que si vous êtes root . C'est pourquoi vous voyez le message d'erreur.

Karol J. Piczak
la source
6

Pour sortir directement sur la fenêtre de votre terminal, le programme en cours doit pouvoir écrire sur votre terminal de contrôle. Si vous utilisez un xterm ou ssh ou une autre connexion virtuelle (par opposition à un terminal réel directement connecté), votre terminal de contrôle est un pseudo tty (pty).

Votre pty est configuré avec une permission en écriture pour vous seul lorsque vous vous connectez, sinon les autres utilisateurs pourraient gribouiller sur votre écran (ou le lire). Ainsi, lorsque vous appelez un autre utilisateur (et que cet utilisateur n'est pas root), cet utilisateur n'a pas accès au pty sous-jacent.

Cependant, des E / S plus complexes, telles que screen, nécessitent un accès direct à la machine pour fonctionner, il est donc magique de contrôler tout votre écran. C'est alors que vous rencontrez des problèmes avec la personne qui exécute la commande n'a pas accès au terminal de contrôle.

En redirigeant le script vers / dev / null, screen ne tente pas d'écrire sur le terminal de contrôle, ce qui évite le problème des autorisations.

Phil Hollenback
la source
2
Alors, comment puis-je voir ce que l’écran écrit s’il passe à / dev / null? Je suis sûr d'avoir mal compris et cela ne va pas vraiment dans / dev / null, mais où est-ce que ça va?
user63623
"it", signifiant la sortie d'écran, ne va pas à /dev/null. Premièrement: le script enregistre votre session (voir la page de manuel), et vous n'en avez pas du tout besoin: cela va donc dans / dev / null. Mais cela n’a pas d’effet secondaire: cela crée un pseudo-terminal, et maintenant vous l’utilisez, et screen peut écrire dans l’affichage de one one. Voir @ karol-piczak.
Nanne