ssh-tunnel skript von systemd ausführen lassen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
steintasse
Beiträge: 31
Registriert: 26.11.2013 18:42:38

ssh-tunnel skript von systemd ausführen lassen

Beitrag von steintasse » 01.10.2015 11:49:53

Guten Tag, ich versuch gerade über Systemd mir automatisch ein Skript ausführen zu lassen das mir einen SSH-Tunnel zu einem Server aufbaut.

sshtunnel.sh

Code: Alles auswählen

ssh sshtunnel -p22 -fCN -D 5560
Und das Systemd Skript was ich auch enabled habe.

/lib/systemd/system/sshtunnel.service

Code: Alles auswählen

[Unit]
Description=ssh_tunnel_skript
After=network.target
After=NetworkManager.service

[Service]
User=cseipel
RemainAfterExit=yes
ExecStart=/bin/sh /home/cseipel/skriptsammlung/sshtunnel.sh
ExecReload=/bin/sh /home/cseipel/skriptsammlung/sshtunnel.sh
KillMode=process

[Install]
WantedBy=multi-user.target
Hier ist die Fehlerausgabe.
root@debian:/home/cseipel# systemctl status sshtunnel.service -l
● sshtunnel.service - ssh_tunnel_skript
Loaded: loaded (/lib/systemd/system/sshtunnel.service; enabled)
Active: active (exited) (Result: exit-code) since Do 2015-10-01 11:36:49 CEST; 9min ago
Process: 1152 ExecStart=/bin/sh /home/cseipel/skriptsammlung/sshtunnel.sh (code=exited, status=255)
Main PID: 1152 (code=exited, status=255)
CGroup: /system.slice/sshtunnel.service

Okt 01 11:36:49 debian sh[1152]: ssh: connect to host IP.IP.IP.IP port 22: Network is unreachable
Okt 01 11:36:49 debian systemd[1]: sshtunnel.service: main process exited, code=exited, status=255/n/a

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: ssh-tunnel skript von systemd ausführen lassen

Beitrag von MSfree » 01.10.2015 12:10:59

steintasse hat geschrieben:Okt 01 11:36:49 debian sh[1152]: ssh: connect to host IP.IP.IP.IP port 22: Network is unreachable
Daran ist doch eigentlich nichts falsch zu verstehen.

Das Netzwerk ist erreichbar. Das kann viele Gründe habe:
- Route nicht gesetzt
- es wird versucht, den SSH-Tunnel aufzubauen, bevor das Netzwerk konfiguriert ist.
- Firewall (iptables) verhindert den Verbindungsaufbau

steintasse
Beiträge: 31
Registriert: 26.11.2013 18:42:38

Re: ssh-tunnel skript von systemd ausführen lassen

Beitrag von steintasse » 01.10.2015 18:31:52

MSfree hat geschrieben:
steintasse hat geschrieben:Okt 01 11:36:49 debian sh[1152]: ssh: connect to host IP.IP.IP.IP port 22: Network is unreachable
Daran ist doch eigentlich nichts falsch zu verstehen.

Das Netzwerk ist erreichbar. Das kann viele Gründe habe:
- Route nicht gesetzt
- es wird versucht, den SSH-Tunnel aufzubauen, bevor das Netzwerk konfiguriert ist.
- Firewall (iptables) verhindert den Verbindungsaufbau
Du hast völlig Recht.

Von meiner Seite aus kann es zu 99.99999999% nur das zweite sein.
Deshalb denke ich auch das der Fehler bei meinem Systemd Skript zu finden ist.
Ein oder mehrere Dienste muss ich noch an After= hängen vermutlich.

Oder ich versuche durch Magie zu erreichen das mein Skript das ausgeführt wird 10 Sekunden wartet bis es mit ssh loslegt.

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: ssh-tunnel skript von systemd ausführen lassen

Beitrag von MSfree » 01.10.2015 19:32:07

steintasse hat geschrieben:Von meiner Seite aus kann es zu 99.99999999% nur das zweite sein.
Führ mal systemd-analyze plot > startupgraph.svg aus und lade startupgraph.svg in einen Webbrowser, z.B. Firefox kann svg darstellen. Das ist ein Plot der Startsequenz.

Bei mit steht sysinit.target relativ weit hinten und kommt auf alle Fälle nach der ifup@eth0.service. Wenn du dein SSH-Skript mit After=sysinit.target ergänzt, müßte dein SSH-Tunnel spät genug starten.

steintasse
Beiträge: 31
Registriert: 26.11.2013 18:42:38

Re: ssh-tunnel skript von systemd ausführen lassen

Beitrag von steintasse » 02.10.2015 19:17:48

Scheinbar bin ich zu dumm die richtigen Dienste auszuwählen :-(
http://picpaste.de/pics/startupgraph-GJ ... 806173.jpg

Ich hab immer noch die selbe Fehlermeldung was mich stark wundert, vorallem da ich after=openvpn@client.service drin habe o__O
[Unit]
Description=ssh_tunnel_skript
After=network.target
After=NetworkManager.service
After=sysinit.target
After=colord.service
After=openvpn@client.service
After=exim4.service
[Service]
User=cseipel
RemainAfterExit=yes
ExecStart=/bin/sh /home/cseipel/skriptsammlung/sshtunnel.sh
ExecReload=/bin/sh /home/cseipel/skriptsammlung/sshtunnel.sh
KillMode=process

[Install]
WantedBy=multi-user.target

Benutzeravatar
MSfree
Beiträge: 10686
Registriert: 25.09.2007 19:59:30

Re: ssh-tunnel skript von systemd ausführen lassen

Beitrag von MSfree » 03.10.2015 20:31:21

Ich habe dein Problem mal mit eigenen Rechnern nachvollzogen.Der Rechner, der einen Tunnel aufbauen soll, ist in meinem Fall ein Laptop, dessen Netzwerkverbindung über WLAN hergestellt wird, das wiederum erst nach dem Login des Benutzers und Eingabe des Keyring-Paßworts zur Verfügung steht.

Was passiert, wenn du dein Skript sshtunnel.sh in der Konsole ausführst?

Der Aufruf ssh sshtunnel -p22 -fCN -D 5560 kann vereinfacht werden: ssh sshtunnel -fCN -D 5560, Port 22 ist sowieso der Default und -p22 kann man sich sparen. Es empfiehlt sich auch, bei skriptgesteuerten Aufrufen, den Benutzer, unter dem die Verbindung aufgebaut werden soll, mitzugeben, also:
ssh benutzer@sshtunnel -fCN -D 5560. Ferner kommt es bei eine SSH-Verbindung immer zu einer Paßwortabfrage, die natürlich bei einem Start aus systemd nie den Benutzer erreicht. Man kann sich behelfen, indem man mit ssh-keygen ein Schlüsselpaar ohne Paßphrase generiert, das man dem Aufruf von ssh mitgeben muß:
ssh-keygen -t rsa -C username@sshtunnel -f username.rsa
Generiert ein Schlüsselpaar, von dem der öffentliche Schlüssel (username.rsa.pub) auf dem Zielsystem unter ~benutzer/.ssh an die Datei authorized_keys angehängt werden:
cat username.rsa.pub >> ~benutzer/.ssh/authorized_keys

Der private Schlüssel (username.rsa) muß auf der Quellmaschine unter ~benutzer/.ssh abgelegt werden. Es empfiehlt sich, auf beiden Maschinen mit chmod 400 username.rsa bzw. chmod 400 authorized_keys die Dateiberechtigungen einzuschränken, sonst nörgelt ssh.

Ich mußte auch noch den -f Parameter entfernen. Der Auruf in deinem Skript in seinerr vollen "Schönheit" ist also:
ssh benutzer@sshtunnel -CN -i /home/benutzer/.ssh/benutzer.rsa -D 5560

Wenn du nun das Skript ausführst, sollte der Tunnel aufgebaut werden und kein Paßwort verlangen.

So, nun zum systemd.service.

Die Datei /lib/systemd/system/sshtunnel.service hat bei mir folgenden Inhalt:

Code: Alles auswählen

[Unit]
Description=ssh_tunnel_skript
After=network.target
After=NetworkManager.service

[Service]
Type=simple
Restart=always
RestartSec=15
User=benutzer
ExecStart=/home/benutzer/bin/sshtunnel.sh
ExecReload=/home/benutzer/bin/sshtunnel.sh
KillMode=process

[Install]
WantedBy=multi-user.target
Hoffentlich hilft dir das weiter.

Antworten