Ist es möglich, ein Dialog- / Whiptail-Skript von einem anderen TTY aus auszuführen?

3934
pxul

Der Ursprung dieser Frage besteht für mich darin, einen Whiptail-Befehl in einem %preSkript von einer Kickstart-Datei aus ausführen zu können, wenn eine auf Centos basierende benutzerdefinierte Distribution installiert wird. Das in Anaconda beobachtete Verhalten kann jedoch problemlos über die virtuellen Terminals eines beliebigen Linux-Systems reproduziert werden.

Um den Whiptail-Befehl in Anaconda als Kickstart- %preSkript auszuführen, müssen Sie TTY umschalten und den Befehl in diesem neuen TTY ausführen. Der vorherrschende Vorschlag, wie dies zu tun ist, lautet:

%pre exec </dev/tty6 >/dev/tty6 2>/dev/tty6 chvt 6  # then execute your command, for example: whiptail --inputbox "Enter some text..." 10 30  # switch back to the original TTY chvt1 exec </dev/tty1 >/dev/tty1 2>/dev/tty1 %end 

Bei dieser Methode wird das Whiptail-Dialogfeld im neuen TTT richtig dargestellt. Es kann jedoch keine Interaktion mit dem Dialogfeld stattfinden. Zum Beispiel drücken Sie tab, anstatt zwischen den Texteingabeelementen "Ok" und "Cancel" zu wechseln Registerkarte im Texteingabefeld. In ähnlicher Weise führt die Verwendung der Pfeiltasten dazu, dass Escape-Sequenzen in das Dialogfeld geschrieben werden:

Ist es möglich, ein Dialog- / Whiptail-Skript von einem anderen TTY aus auszuführen?

Dieses Verhalten wird auch bei der Verwendung von Python-Snack (verwendet dieselbe Bibliothek wie Whiptail-Libnewt) und Dialogfeld verwendet.

Natürlich könnte ich nur ein interaktives Shellskript verwenden, anstatt Whiptail, aber ich wunderte mich nur, ob jemand Vorschläge hatte, warum dieses Verhalten zu sehen ist, da ich gedacht hätte, dass die einzigen Voraussetzungen für dieses Funktionieren bestehen würden um die Eingabe- und Ausgabeströme korrekt umzuleiten.

TL; DR

Ich bin daran interessiert, ein Skript zu erstellen, das Whiptail- / Dialogbefehle enthält, die in einem TTY ausgeführt werden können und die Ausgabe / Eingabe des Skripts an einen anderen TTY weiterleiten.

1

2 Antworten auf die Frage

1
Gooseman

Das funktionierte für mich (Anaconda, Fedora 20):

%pre --log=/tmp/ks_pre.log #!/bin/bash  # Backup fds in temporal ones exec >&1 exec >&2  # Go to current terminal for pre% section exec 1>>/dev/pts/0 exec 2>>/dev/pts/0  # Show message whiptail --yesno 'Do you like StackOverflow?' --yes-button 'Yes' --no-button 'No' 10 70 if [ $? = 1 ] then echo 'User sucks' >> /tmp/ks_pre.log else echo 'User rocks' >> /tmp/ks_pre.log fi  # Restore fds exec 1>&$STDOUTBACK exec 2>&$STDERRBACK  # Close temporal fds exec >&- exec >&-  %end 

Mögliche Fragen:

  1. Warum hast du verwendet /dev/pts/0?

    Denn von der Anaconda - Konsole aus habe ich herausgefunden, welches Gerät als Standardeinstellung für die Skripts verwendet wurde, die in der ausgeführt werden pre% section. Ich denke, es könnte eine andere sein, abhängig von den RedHat- und Fedora-Versionen. Es ist jedoch sehr einfach herauszufinden, welcher für Ihren Fall der richtige ist.

  2. Was ist das exec >&1und exec >&-was?

    Lesen Sie Ihre man bashund suchen Sie nach dem REDIRECTIONAbschnitt, in dem Sie Folgendes finden können:

Jeder Umleitung, der eine Dateideskriptornummer vorangestellt werden kann, kann stattdessen ein Wort der Form vorangestellt werden. In diesem Fall weist die Shell für jeden Umleitungsoperator außer> & - und <& - einen Dateideskriptor auf, der größer als 10 ist, und ordnet ihn varname zu. Wenn> & - oder <& - vor steht, definiert der Wert von var- name den zu schließenden Dateideskriptor.

0
user150471

Dies sollte ein Kommentar sein, aber ...

Sie müssen stdin, stderr und stdout bearbeiten, damit Whiptail in eine Variable ausgegeben werden kann.

x=`whiptail --inputbox "hello" 10 40 3>&1 1>&2 2>&3` 

Dies setzt die Ausgabe in / tmp / x:

whiptail --inputbox "hello" 10 40 3>/tmp/x 1>&2 2>&3 
Vielleicht war meine Frage nicht zu klar. Ich bin daran interessiert, ein Skript zu erstellen, das Whiptail- / Dialogbefehle enthält, die in einem TTY ausgeführt werden können und die Ausgabe / Eingabe des Skripts an einen anderen TTY weiterleiten. Dies kann simuliert werden, indem ein virtuelles Terminal geöffnet wird und versucht wird, (a) Eingabe- / Ausgabeströme und (b) virtuelle Terminals aus einem Skript heraus zu wechseln. Oben wird dies durch `exec / dev / tty6 2> / dev / tty6` und` chvt 6` erreicht. pxul vor 9 Jahren 0