So starten Sie ein Remote-x11-Programm mit ssh neu

1

Ok, ich habe 2 Linux-Maschinen, Maschine A und Maschine B. Maschine A ist ein Server, auf dem Icecast-Audioserver ausgeführt werden. Maschine B ist ein Desktop im Studio, auf dem BUTT (Broadcast Using This Tool) ausgeführt wird, eine x11-App, die Audio an Maschine A zurücksendet.

Hintern auf Maschine B stürzt manchmal ab (in der Tat stürzt jede App, die wir ausprobiert haben, und auch auf Windows irgendwann ab) und beendet den Stream. Ich habe jedoch herausgefunden, dass ich icecast so konfiguriere, dass bei jeder Trennung der Quelle ein Stript ausgeführt wird. Ich habe eine Berechtigung für private Schlüssel, die für ssh zwischen A und B funktioniert. Ich habe ein Skript, das bei Ausführung auf B (über normales interaktives ssh) die Hintern wieder freigibt. Was ich nicht weiß, ist, wie man das Skript auf A schreibt, damit es das Skript ausführt, das ich auf B habe.

Ich habe das versucht:

#!/bin/bash
ssh username_placeholder@B '/home/username_placeholder/broadcast.sh'
exit

Laufen von A. Aber das scheint ssh am Leben zu halten. Alles was ich tun möchte, ist es laufen zu lassen und aufzulegen. broadcast.sh sieht so aus:

#!/bin/bash
killall butt
env DISPLAY=:0 butt&
exit

Dies liegt daran, dass Butt nur im GUI-Modus ausgeführt wird. und wir wollen die gui trotzdem von zeit zu zeit im studio sehen. Wie bringe ich es dazu, dieses Skript auszuführen und aufzulegen, oder gibt es eine noch bessere Möglichkeit, dies auf A zu tun, ohne zu versuchen, das Skript auf B aufzurufen? muss immer noch auf B angezeigt werden, nicht auf A. Und A ist der Computer, der wissen kann, wann die Quelle auf B auflegt.)

Auf Computer A wird Ubuntu-Server ausgeführt, und auf Computer B wird Linux Mint ausgeführt, falls sich jemand darum kümmert.

UserZer0
quelle

Antworten:

0

Sie sollten in Betracht ziehen, den Befehl screen zu verwenden, damit Sie das tun können, was Sie möchten, und den zusätzlichen Vorteil, dass Sie jederzeit eine neue Verbindung zur Shell herstellen können.

SSH, UM HOST ZU FERNEN

machine_a:> ssh machine_b

STARTEN SIE EINE NEUE MUSCHEL MIT DEM BILDSCHIRM

machine_b:> screen
machine_b:> run your script here

LÖSEN SIE SICH VOM BILDSCHIRM

( Press Ctrl-a then ctrl-d to disconnect from the screen )

VERLASSEN SIE DIE SERVER SHELL

machine_b:> exit
machine_a:> 

ZURÜCK IN DEN SERVER ANMELDEN (zu einem späteren Zeitpunkt)

machine_a:>ssh machine_b

FÜHREN SIE ALLE BILDSCHIRME AUF, DIE FÜR IHREN BENUTZER BESTEHEN

screen -list  (to show a list of all screen sessions that exist).

eg.    
username@machine_b:~/> screen -list
There are screens on:
        30264.pts-5.machine_b  (Detached)
2 Sockets in /var/run/uscreens/S-username.

AN EINEN ABGEHÄNGTEN BILDSCHIRM ANSCHLIESSEN

machine_b:> screen -dr 30264

Zu diesem Zeitpunkt können Sie Ihr Skript / Ihren Befehl / Ihre Shell genau so sehen, wie Sie sie verlassen haben. Auch wenn der von Ihnen ausgeführte Befehl eine xwindows-Anwendung war, deren Anzeige auf die Anzeige des Remoteservers eingestellt ist.

Um den Remote-Bildschirm mit Ihrem Skript so zu erstellen, wie Sie es mit nur ssh versuchen, versuchen Sie Folgendes:

ssh -t username_placeholder@B 'screen -d -m /home/username_placeholder/broadcast.sh'

quelle
Vielen Dank für Ihre Antwort, aber es tut mir leid, dass ich das nicht sehr gut verstehe. Soll ich diese Befehle für den Installationsvorgang ausführen und dann den "screen -dr 30264" in mein Skript einfügen, um die Verbindung zu diesem Bildschirm wiederherzustellen? Trennt dies die Verbindung, wenn ich sie nicht benutze? Ist 30264 ein Port, den ich auf meinem Router zum Schutz von B öffnen muss? Ich verstehe immer noch nicht, was ich in das Skript für A geschrieben habe, das Befehle für B ausführt und auflegt. Auch Butt muss die GUI auf B zeigen, es scheint, als würden wir hier eine Art virtuelle Anzeige machen, ist das, was los ist? Danke
UserZer0
entschuldigung für die verzögerung ... stellen sie sich screen als einen hintergrundprozess vor, zu dem sie später wieder eine verbindung herstellen können. dh Sie können sich aus der Ferne anmelden, einen Bildschirm erstellen, Befehle ausführen oder mehrere und diese ausführen lassen. Trennen Sie die Verbindung zu dieser Shell (Sie kehren zu Ihrer ursprünglichen SSH-Shell zurück), und Sie können diese Shell sicher beenden. Dann zu einem späteren Zeitpunkt Mit den Befehlen screen -list und screen -dr kann ssh wieder auf die entfernte Maschine zugreifen und eine Verbindung zum "Bildschirm" herstellen.
Ja, führen Sie den Bildschirmbefehl in Ihrem Skript nicht aus. Ich habe meine Antwort aktualisiert, um klarer zu sein, wie Sie sie verwenden. Sie könnten das Ganze mit einem einzigen ssh-Befehl automatisieren, wahrscheinlich wie ...
Versuchen Sie Folgendes: ssh -t Benutzername_Platzhalter @ B 'screen -d -m /home/Benutzername_Platzhalter/broadcast.sh'
0

Sie müssen Ihr Broadcast-Skript von Computer A mit der Option '-f' von ssh ausführen:

#!/bin/sh
ssh -f username_placeholder@B /home/username_placeholder/broadcast.sh

Dadurch wird "broadcast.sh" automatisch in den Hintergrund verschoben.

Das Skript 'broadcast.sh' selbst sollte dann so aussehen:

#!/bin/sh
killall butt
DISPLAY=:0 butt
Sparkie
quelle