Warum tut der Bildschirm scheinbar nichts mit Befehlen, die mit -X übergeben werden?

7

Ich habe versucht, ein automatisiertes Backup-System für einen Minecraft-Server einzurichten, und ich habe Probleme mit dem Bildschirm, insbesondere wenn ich 'screen -r Sitzungsname -X "/ var / minecraft / somebatchfile"' verwende. Es passiert nichts.

Mein Prozessablauf ist im Moment ungefähr so:

screen -m -d -S minecraft /var/minecraft/bin/server_nogui.sh

Dadurch wird der Minecraft-Server ohne Probleme gestartet. Das Problem ist jedoch, dass selbst einfache Folgemaßnahmen wie diese fehlschlagen:

screen -r minecraft -X "stop"

Ich erhalte keine Fehlermeldung oder Erfolgsmeldung, und der Server trennt die Clients nicht und fährt herunter, wie es sollte. Ich nehme an, ich mache etwas falsch, aber ich weiß nicht was. Gibt es einen offensichtlichen Fehler, den ich mache? Ich habe die Manpage ein bisschen gelesen, aber ich habe kein Glück, es selbst herauszufinden.

Sukasa
quelle

Antworten:

6

Sie müssen dem Parameter -Xeinen screenBefehl geben. Ich denke, Sie möchten einen Minecraft-Server-Befehl in die screenSitzung "stopfen" .

screen -r minecraft -p 0 -X stuff "stop $(printf '\r')"

Das printfsendet einen Wagenrücklauf, so dass der Befehl "stop" ausgeführt wird. -p 0stellt sicher, dass die Zeichen an das anfängliche Bildschirmfenster gesendet werden .

Um es zu senden, müssen sshSie den Befehl einschließen " "(Sie können ihn auch verwenden ` `, aber damit können Sie den Befehl nicht ersetzen).

ssh -t -i ~/.ssh/id_dsa server_user@server_address "screen -r minecraft -X stuff "even other_server_name is getting in on the action\! $(echo -ne '\r')""

Passen Sie auf, dass dies !ein reserviertes Wort ist, Sie müssen ihm entkommen.

Es ist auch möglich , eine vom Benutzer generierte neue Zeile in den Befehl aufzunehmen, um ihn auszuführen:

ssh -t -i ~/.ssh/id_dsa server_user@server_address "screen -r minecraft -X stuff 'even other_server_name is getting in on the action!
'"

Flucht !ist hier nicht notwendig.

wedeln
quelle
Das funktioniert super, aber jetzt kann ich das natürlich nicht über ssh / command line ausführen. ssh -t -i ~/.ssh/id_dsa server_user@server_address screen -r minecraft -X stuff "even other_server_name is getting in on the action! $(echo -ne '\r')" Ich bin wirklich nicht gut mit Unix, leider: /
Sukasa
1

Wie wir in dieser ähnlichen Frage festgestellt haben , hat der Bildschirm Probleme beim Senden von Schlüsseln an Sitzungen, die noch nie angehängt wurden. Wenn Sie jemals einen Anhang angehängt haben, wird der Standardfensterbereich auf Null gesetzt. Andernfalls schlägt er stillschweigend fehl, da die Tastenanschläge nicht in ein Fenster gelangen. Sie können dies vermeiden, indem Sie-p 0 Ihrem Bildschirmbefehl ein Argument hinzufügen .

Alternativ können Sie tmuxstattdessen das viel besser benommene verwenden :

tmux new-session -d -n minecraft /var/minecraft/bin/server_nogui.sh

Senden Sie dann dem Minecraft-Server den Befehl stop wie folgt:

tmux send-keys -t minecraft "stop^M"

Beachten Sie, dass die obige ^ M-Sequenz eine visuelle Darstellung einer realen Eingabe ist. Sie können dies auf dem Befehl wie durch Drücken von Ctrl+ erzeugen v Enter. Dies ist einfacher als das Senden des Wagenrücklaufs mithilfe der Echo-Anweisung in der Antwort von wag .

Caleb
quelle