Nach SSH Verbindung Befehl ausführen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Hallo,

ich möchte den VNC Client über SSH starten.
Direkt über die Linux Konsole kann ich den Befehl ausführen.


ssh Verbindung steht.
Der Befehl wird in der Konsole angezeigt, aber der Befehl startet nicht.

Kann mir jemand einen Tipp geben?

Code: Alles auswählen

def btnConnectVNCClick():
    host = "192.168.178.1"
    port = "22"
    username = "Admin"
    password = "Admin"
    commands=["sudo ../etc/init.d/x11vnc start"]



    client = SSHClient()
    client.set_missing_host_key_policy(AutoAddPolicy())
    try:
        client.connect(hostname=host, username=username, password=password)
        print("Verbindung zu der IP "+str(host))
    except:
        print("[!] Verbindung nicht möglich")
        exit()
    # execute the commands
    #time.sleep(10) 
    for command in commands:
        print("="*10, command, "="*10)
        stdin, stdout, stderr = client.exec_command(command)
        print(stdout.read().decode())
        err = stderr.read().decode()
    if err:
        print(err)
        
        
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Nachtrag zu meinen Eintrag,

anbei der komplett befehl in Pythen Code.

Das stoppen des VNC Server über SSH funktioniert auf der Linux Maschien.
Auch Abrufen "date" pwd geht.

Könnne solch Befehle wie VNC start nicht über SSH ausgefühert werden, gibt es eine andere Möglichkeit?

Code: Alles auswählen


import locale
import tkinter as tk
import tkinter.font as font
from tkinter import messagebox
import time
from paramiko.client import SSHClient, AutoAddPolicy 
from sshtunnel import open_tunnel
from scp import SCPClient
import requests
from threading import Timer, Thread, Event
import subprocess

window = tk.Tk()

# setting attribute
#window.attributes('-fullscreen', True)
window.geometry('600x400')
window.resizable(True, True) 
window.title("Servicetool")

#Schriftarte defenieren
txtFont = font.Font(family='Helvetica')  # Schriftart
txtWeight = font.Font(weight="bold")  # Art der Schriftstärke
txtSize25 = font.Font(size=25)  # Schriftgröße
txtSize12 = font.Font(size=12)  # Schriftgröße


def btnConnectVNCClick():
    host = "192.168.178.1"
    port = "22"
    username = "Admin"
    password = "Admin"
    commands=["sudo ../etc/init.d/x11vnc start"]



    client = SSHClient()
    client.set_missing_host_key_policy(AutoAddPolicy())
    try:
        client.connect(hostname=host, username=username, password=password)
        print("Verbindung zu der IP "+str(host))
    except:
        print("[!] Verbindung nicht möglich")
        exit()
    # execute the commands
    #time.sleep(10) 
    for command in commands:
        print("="*10, command, "="*10)
        stdin, stdout, stderr = client.exec_command(command)
        print(stdout.read().decode())
        err = stderr.read().decode()
    if err:
        print(err)

def btnCloseClick():
    window.destroy()


btnClose = tk.Button(window, text="Schließen",
                      #width=10,
                      #height=100,
                      padx=5,
                      pady=3,
                      #image=photoKommen,
                      bd=2,
                      #relief="sunken",
                      #compound="top",
                      command=btnCloseClick)
btnClose['font'] = txtFont
btnClose['font'] = txtWeight
btnClose['font'] = txtSize12
btnClose.pack()
btnClose.place(x=500, y=350)


btnConnectVNC = tk.Button(window, text="Start VNC",
                      width=15,
                      #height=100,
                      padx=5,
                      pady=3,
                      #image=photoKommen,
                      bd=2,
                      #relief="sunken",
                      #compound="top",
                      command=btnConnectVNCClick)
btnConnectVNC['font'] = txtFont
btnConnectVNC['font'] = txtWeight
btnConnectVNC['font'] = txtSize12
btnConnectVNC.pack()
btnConnectVNC.place(x=50, y=50)








window.mainloop()
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die .. vor deinem x11vnc Kommando sind falsch. Dadurch wird das au einem relativen Pfad, und du willst einen absoluten. Lass die weg. Die fest kodierten Zugangsdaten sind ein fürchterliches sicherheitsleck. Sowas macht man über den authorized key Mechanismus.

Mein Verdacht läge erstmal auf dem sudo. Geht das ohne Passworteingabe? Und wenn du das ganze ohne Python machst, sondern per ssh auf der Kommandozeile (da kann man auch Kommandos angeben, statt sich einzulegen), geht das?
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Hallo __deets__,

Ich hatte das schon ohne Sudo und … gemacht.
Hatte das nur mal getestet. Login wird beim Start des vnc nicht benötigt.

Wenn ich mich Manuel auf die Linux Maschine gehe, kann ich mit den Kommando den vnc Starten.
Das geht ja auch. Nach den manuellen Start des VNC kann ich über das Kommando wie oben beschrieben über Python den vnc Stoppen.

Code: Alles auswählen


 commands=[„/etc/init.d/x11vnc stop"]
 commands=[„/etc/init.d/x11vnc start"]

Ich habe auch andere Kommandos die ich ausführen will, die auch nicht funktionieren. Entweder es liegt an der Rückmeldung nach der Befehlseingabe da diese mehrere Zeilen sind..

Die SSH Maschine ist im einem Intranet. Das Passwort ändert sich täglich und es sind immer verschiedene IP.
Sicherheit ist nicht mein Problem.
(Hinweis IP, BN und PW sind natürlich bei meinen Beispiel verändert).
Das Linux kann ich nicht verändern. Deshalb möchte ich das so umsetzen.

Ich komme nicht dahinter warum der Befehl nicht ausgeführt wird.
Zuletzt geändert von Jnpanzer am Donnerstag 3. März 2022, 12:22, insgesamt 1-mal geändert.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heißt das Linux kannst du nicht verändern? Einen key zur autorized_keys hinzuzufügenden muss gehen, sonst könntest du gar nicht auf die Maschine.

An Rückmeldungen kann es nicht liegen, außer du musst das Passwort eingeben bei sudo. Und was passiert, wenn du

ssh user@machine "ein Kommando"

machst, wie auch hier https://malcontentcomics.com/systemsboy ... a-ssh.html beschrieben - geht das mit deinen gedachten Kommandos? Bevor das , kann es auch in Python nicht gehen.
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Sorry doppelt geschrieben
Zuletzt geändert von Jnpanzer am Donnerstag 3. März 2022, 12:31, insgesamt 1-mal geändert.
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Ich dachte immer das wird so gemacht.

Code: Alles auswählen

 client.set_missing_host_key_policy(AutoAddPolicy())
Ich kann mich mit ssh einloggen und das Kommando „uptime“ absetzen mit einer Rückantwort.

Ich schau mir mal den Link an.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast nicht verstanden, was authorized keys sind. Den Begriff kannst du mal recherchieren, dann wird das hoffentlich klarer. Und was ich meine ist eben genau NICHT erstmal einloggen, und DANN was eintippen. Sondern in einem. Das kann wegen dem fehlenden kontrollterminal einen großen Unterschied machen.
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Hallo __deets__,

Ok das mit den Kontrollterminal ist jetzt einleuchtend.
Es gehen ohne authorized_keys nicht alle befehle nur ein Tel, desghalb geht "update", date usw. aber keine ifconfig.

Danke für die Hilfe, befasse mich damit mal.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das klingt danach als ob du da nicht richtig die Anführungsstriche setzt. Soweit ich weiß, muss das Kommando ein String sein. Mehrere sind mehrere Kommandos.
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Ne du hatest recht mit den Post mit den Kontrollterminal
Beim Befehl Uprime gehts, bei date bekomme ich eine Rückmledung, bei Ifconfig Kommando nicht bekannt.

Mehrer Commandos gehen mit Komma getrennt.

Code: Alles auswählen

commands=["uptime", "date", "pwd" ]
Rückmeldung date uptime und pwd

Code: Alles auswählen

========== uptime ==========
 12:11:05 up 45 days,  3:45,  0 users,  load average: 0.12, 0.05, 0.05

========== date ==========
Thu Mar  3 12:11:05 UTC 2022

========== pwd ==========
/root



Rückmeldung bei ifconfig

Code: Alles auswählen

sh: ifconfig: not found
Has mir aber schon weitergeholfen ;-)
Weis nur nicht wie ich es löse, da die Linux Maschinen ich nicht verädern möchte bzw, diese werden immer wieder getauscht und ämdern PW und Software.

Muss mal nachdenken
paddie
User
Beiträge: 101
Registriert: Donnerstag 11. Oktober 2018, 18:09

ifconfig liegt wahrscheinlich in /sbin und zum Beispiel bei Debian (bei anderen Distributionen wahrscheinlich auch) ist /sbin bei normalen Usern NICHT in $path. Du müsstest ifconfig mit /sbin/ifconfig aufrufen, dann sollte es gehen.
nezzcarth
User
Beiträge: 1635
Registriert: Samstag 16. April 2011, 12:47

Vorab: Teilweise gehen in deinen Posts die Begriffe Client und Server durcheinander. Ich gehe davon aus, dass du den VNC Server meinst.
Könnne solch Befehle wie VNC start nicht über SSH ausgefühert werden, gibt es eine andere Möglichkeit?
Das kann man so pauschal nicht sagen. VNC ist erst einmal nur das Protokoll, von dem es verschiedene Implementierungen gibt, bei dir wohl x11vnc. Soweit ich das verstehe, hat das die Eigenschaft, dass schon ein X11-Server mit einer aktiven Sesssion, die dann übertragen wird, laufen muss. Und an der Stelle hängt es sehr von deiner Konfiguration ab, ob das erfolgreich ist, wenn du den Rechner nur per SSH steuerst. Z.B. muss der X11 Server ggf. für den headless Betrieb eingerichtet sein. Für Details s. z. B.: https://wiki.archlinux.org/title/X11vnc. Eine Alternative kann es sein, eine andere VNC Implementation zu verwenden. (Stoppen eines anderweitig gestarteten Server-Prozesses über SSH ist natürlich kein Problem).

Ansonsten noch: Sowohl 'ifconfig' als auch die Variante, Server-Prozesse über /etc/init.d zu starten, sind unter den meisten modernen Distributionen eigentlich mindestens deprecated oder werden gar nicht mehr unterstützt. Statt ifconfig nimmt man heute unter Linux im allgemeinen 'ip <subbefehl>', während man Prozesse mit systemctl start/stop steuert. Um welche Linux Distribution geht es hier denn?
Jnpanzer
User
Beiträge: 10
Registriert: Dienstag 1. März 2022, 18:56

Hallo padie,
hallo nezzcarth,

Natürlch ist es ein VNC Sever auf denerr Linux Maschine.
Das ist ein Tinycore Linux.
Danke für den Tipp., aber es ist vermutlich das Problem was __deets__ beschrieben hat, das ich keine Kommndokonsole bekomme, deshalb gehen viele Befehle nicht.

Vermutlich fehlt bei der ssh Verbindung der KexAlgorithms=+diffie-hellman-group1-sha1.

Code: Alles auswählen

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 Admin@192.168.178.50
so baue ich ein Verbindung auf.

ich weis nicht wie ich dies bei Python übergeben muss.
Antworten