Lassen Sie tmux warten, bis ich SSH aktiviert habe, um den Rest des Tmuxinator-Skripts abzuschließen


13

Nachdem ich kürzlich tmux und Tmuxinator entdeckt habe, habe ich versucht, eine Entwicklungsumgebung für die Verwendung einzurichten.

Gemäß Protokoll dürfen wir Passwörter / Passphrasen nicht in Skripten speichern. Also, was ich suche, ist ein Warten auf tmux, bis der SSH-Tunnel eingerichtet ist (Passwort eingegeben, gedrückt und angemeldet).

Ich weiß, dass es in tmux 1.8+ einen "wait-for" -Befehl gibt. Ich verwende 1.9a über Cygwin. Aber obwohl ich die Dokumentation durchgelesen habe, fällt es mir schwer, sie zu verstehen.

tmux new-session -s development -n editor -d
tmux split-window -v
tmux split-window -v

"Need to send to all panes.
tmux send-keys -t development 'ssh user@example.com' C-m

Hier ist eine sehr einfache Version von dem, was ich habe.

Gedanken? Ich weiß, dass ich Sessions synchronisieren kann.

Bearbeiten : Befehle untersuchen und Variablen aus dem Bereich aus synchronisierten Bereichen in den Befehl ziehen. Dies könnte ein "besserer" Weg sein, bis ich herausfinden kann, wie ich TMUX dazu bringen kann, mich zur Benutzereingabe aufzufordern.

Könnte eine Funktionsanforderung ausstellen.


2
Warum verbindest du dich nicht ohne das Passwort und benutzt den öffentlichen / privaten Schlüssel?
YoMismo

Mir wurde gesagt, dass ich auf diese Weise keine Verbindung herstellen könne. Während ich technisch konnte , ist es nicht akzeptabel , mit der Politik, die geschaffen wurde. Ich habe auch keine Stimme / Autorität, um diese Änderung (schnell?) Vorzunehmen. In meinem Fall scheint es also vielversprechend zu sein, die Straßen mit dem geringsten Widerstand zu untersuchen.
Tango Bravo

1
Ich nehme an, dass auf der remote box nicht tmux installiert ist? Ansonsten wäre es viel besser, in die Remote-Box zu sshen und erst dann tmux zu starten. // Auch, ich würde vorschlagen , dass Sie von Ihrer machen ~/.ssh/configDatei: Put Host foo, User userund Hostname example.coman drei aufeinander folgenden Zeilen in der Konfigurationsdatei. Dann ssh foowird gleichbedeutend mit ssh user@example.com. // Vielleicht hilft auch so etwas:command-prompt -p 'log in as:' -I 'user@example.com' 'split-window -v -d %1; split-window -v -d %1'
damien

Antworten:


3

Einige Notizen von wait-for

Die grundlegende Verwendung von Wait-for ist also nicht allzu kompliziert, wenn Sie es als analog zum Threading von Concurrency-Primitiven ansehen

Es ist nicht wirklich mit anderen tmux-Funktionen verbunden, sondern lediglich eine praktische Implementierung von IPC.

wait-for event_nameist wie das Warten auf ein Ereignis wait-for -S event_name ein Mittel, um ein Ereignis zu signalisieren

Die Optionen -Uund -Lsind orthogonal und wirken wie Semaphoren

Beantworten Sie Ihre Frage direkt

Sie können diese Art von Racebedingung wait-fornur dann lösen , wenn die Befehle synchron sind.

tmux send-keys 'sync-command ; tmux wait-for -S command-finished' C-m
tmux wait-for command-finished

Das Problem, das Sie hier haben, ist, dass der Befehl ssh nicht synchron ist: Sie können nicht feststellen, wann er beendet ist.

Wenn wir das Handbuch durchsehen, finden wir die LocalCommandAnweisung, die zu tun scheint, was wir wollen: Führen Sie einen Befehl lokal aus, nachdem die Verbindung hergestellt wurde, damit wir ihn aufrufen können

ssh root@iris.tatw.name -o 'PermitLocalCommand yes' -o 'LocalCommand  tmux wait-for -S done'

Mit "nicht mit anderen Funktionen verbunden" meinen Sie also, dass das channelnur ein Name in einem eigenen Namespace ist und nichts mit den vordefinierten "Ereignissen" von tmux zu tun hat?
Ormaaj

Es kann immer noch ein Rennen geben, wenn wait-for -Sdie Zustellung der Nachrichten und die sync-commandvorherigen Ergebnisse nicht garantiert werden wait-for.
Ormaaj
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.