Wie kann man das "Pseudo-terminal wird nicht vergeben werden, weil die Standardeingabe ist kein terminal" in Alpine Linux?

Ich Schreibe ein PHP Programm, das eine Vielzahl von shell-Befehlen. Manchmal braucht es nennen su und design, ich möchte, dass eine Eingabeaufforderung für erhöhte Rechte Passwort. Mit passthru() in PHP funktioniert gut für diese.

Habe ich gewählt, um schreiben funktionale tests nur in meinem Programm, da Sie abhängig von ssh, su und anderen shell-Befehlen. Ich möchte deswegen führen Sie das echte Ding in PHPUnit, um zu sehen, ob es funktioniert wie ich erwarte.

Da dies erfordert einen SSH-server und Benutzer-account-Konfigurationen, habe ich die tests für die Ausführung im Andockfenster. Dieser Ansatz sieht, wie es wird in Ordnung sein - das Bild baut, wenn es läuft, ruft es PHPUnit, und wird dann beendet. Ich erwarte, dass gibt es eine Möglichkeit, ich kann ein ResultSet zurück, über das Andockfenster an eine aufrufende system, wie Travis CI.

Habe ich ausgewählt Alpine Linux als mein base Andockfenster Bild, aber ich habe Probleme mit Klemmenbelegung. Ich ursprünglich dachte, PHPUnit wurde in der Weise erhalten (siehe original-version in dieser Frage), aber ich habe inzwischen verengt Sie sich auf SSH, entweder durch PHP oder auch nur an der Konsole.

Dieser gut funktioniert:

su -c whoami

Jedoch nicht:

ssh localhost -t 'su -c whoami'

Bekomme ich:

su: must be suid, um richtig zu arbeiten

Verbindung zu localhost geschlossen.

Beachten Sie, dass ssh mit einrichten ohne Passwort Zugriff auf "localhost" (für Test-Zwecke), so ist das einzige Passwort, das ich erwarte, ist die Eingabe der su ein.

Handbuch für ssh deutet darauf hin, dass -f ist hilfreich für die, wo Passwörter gebeten werden (der Schalter "Anfragen ssh zu gehen, um den hintergrund kurz vor command execution"), so dass ich versuchen, diese:

ssh localhost -t -f 'su -c whoami'

Und ich bekomme:

Pseudo-terminal wird nicht zugewiesen werden, da die Standardeingabe nicht ein terminal.

4275760bde94:~$ su: must be suid, um richtig zu arbeiten

Ah, ein weiterer Fehler! OK, also Ich habe versucht, diese Ideen, insbesondere zwingen, eine Klemme:

ssh localhost -tt -f 'su -c whoami'

Des Doppel-t strahlt immer noch Beschwerden über SUID, und funktioniert immer noch nicht.

Jedoch, wenn ich das auf meinem Ubuntu-dev-Maschine (auch konfiguriert mit der PPK den Zugang zu sich selbst) es funktioniert:

$ ssh localhost -t 'su -c whoami'
Password: 
root
Connection to localhost closed.

Macht es so Aussehen wie Alpine oder BusyBox ist OpenSSH ist Schuld. Wie kann ich in diese zu Graben weiter?

One-Lösung ist einfach zu tauschen, zu einem anderen base-Distribution und Ubuntu würde sicherlich funktionieren, aber das wird Massiv Blasen meine Docker-image-Größe (derzeit auf einem sehr schönen 68M total). Also, ich möchte weiterhin die Alpine für ein bisschen, wenn ich kann.

Unwahrscheinlich, dass Docker

Habe ich Frage mich, ob das Andockfenster können verhindern, dass ein terminal erstellt wird oder angebracht ist, aber schnell discounted diese, da bekomme ich eine interaktive shell, mit docker exec -it container_name sh. Außerdem, ich kann die ssh und dann su in zwei separate Befehle innerhalb eines Docker-shell einwandfrei.

Bash nicht helfen

Merke ich, dass Bash ist verfügbar in Alpine, aber das hat nicht geholfen, entweder, das wundert mich:

/ $ apk add bash
bash-4.3$ bash
bash-4.3$ su nonpriv
bash-4.3$ ssh localhost whoami
nonpriv
bash-4.3$ ssh localhost 'su -c whoami'
su: must be suid to work properly
bash-4.3$ ssh localhost 'su -s /bin/bash -c whoami'
su: must be suid to work properly
bash-4.3$ ssh -t localhost 'su -s /bin/bash -c whoami'
su: must be suid to work properly
Connection to localhost closed.
bash-4.3$ ssh -tt localhost 'su -s /bin/bash -c whoami'
su: must be suid to work properly
Connection to localhost closed.
bash-4.3$ ssh -tf localhost 'su -s /bin/bash -c whoami'
Pseudo-terminal will not be allocated because stdin is not a terminal.
bash-4.3$ su: must be suid to work properly

bash-4.3$ ssh -ttf localhost 'su -s /bin/bash -c whoami'
bash-4.3$ su: must be suid to work properly
Connection to localhost closed.

Versucht shell interpolation

Ich habe festgestellt, dass dies fast funktioniert:

/ $ ssh -t localhost "$( su -c whoami )"
sh: Password:: not found
sh: root: not found
Connection to localhost closed.

Diese nutzt die standard-Alpine sh shell, und verwendet die "$()" konstruieren, die sich auf dem oben genannten link, und die ich nicht ganz verstehen. Es gibt Password:, das ist die Aufforderung in su, und wartet dann auf das Passwort. Wenn das Kennwort eingegeben wird, das whoami ausgeführt wird, werden die Drucke root.

So wie es aussieht ist es der den Befehl ausführt, aber ich bin nicht sicher, ob es mit der whoami sofort und dann übergabe an ssh (will ich nicht) oder ob es immer eine remote-shell auf localhost, dann dann tut es (was ich vorhabe).

In jedem Fall, es wird versucht zu laufen stdout Linien, als wären Sie Befehle. Wie kann ich es nur zu drucken, die Ausgabe läuft über SSH?

  • Ich weiß es wirklich nicht, aber neugierig auf Vollständigkeit, was sagt dein test Aussehen?
  • Danke @Jeff, es stellt sich heraus, es ist nicht wirklich PHPUnit, das ist das problem. Es hat sich in der Art der Ausgabe, die auslösen würde expect zeitnah, aber ich kann Sie mildern, dass mit timeouts. Wie es aussieht, das problem ist, wie Alpine erlaubt die Befehle in einer ssh Befehl. Ich Frage mich, ob es gibt einige Flags in SSH bin ich fehlt.
  • Wenn ich einen moment habe ich vereinfacht sich diese Frage, da die PHPUnit, was zu sein scheint ein Ablenkungsmanöver.
  • Auf den ersten Blick wäre dies ein Duplikat dieser Frage, aber die Lösungen funktionieren nicht. Ich Frage mich, ob ich bin auf der Suche auf einer Alm-spezifisches problem?
  • Ich habe umgeschrieben, die Frage zu konzentrieren, was ich denke, ist der Kern des Problems.
InformationsquelleAutor halfer | 2017-05-30
Schreibe einen Kommentar