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 einerssh
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dachte ich, in meiner Frage, dass das funktionieren würde in ein Ubuntu-container, und das erwies sich als richtig. Interessanterweise bekomme ich noch die "muss ausgeführt werden, von einer terminal -" Fehler, die mit diesem Befehl:
Aber nicht hier, wo ein terminal zugeordnet ist explizit in einer SSH ohne Passwort-Befehl an mich selbst:
Leider das neue OS hat bis stieß meinen 68M Bild 430M, urgh! Ich sollte daher sein, die meisten nehmen gerne neue Antworten bekommen, dass diese arbeiten auf Alpine.