Ich habe einen systemctl-Dienst, der einen Prozess smd-loop
in einer screen
Sitzung startet . Dieser Prozess erfordert den Zugriff auf entfernte SSH-Quellen (zu Synchronisierungszwecken) und muss daher auf meinen id_dsa
privaten Schlüssel zugreifen können .
Wie kann ich den systemd-Dienst so einrichten, dass er funktioniert? Der folgende Dienst startet den Vorgang korrekt, erfordert jedoch, dass ich eine Verbindung zur Bildschirmsitzung herstelle und das id_dsa
Kennwort manuell eingebe.
[Unit]
Description=smd loop
After=local-fs.target network.target
[Service]
User=%i
Group=users
Type=Forking
ExecStart=/usr/bin/screen -S smd-loop-win -md "smd-loop"
RemainAfterExit=yes
Wenn ich smd-loop
das id_dsa
Passwort manuell starte, ist es nicht erforderlich, da ich das pam_ssh
Modul installiert habe ssh-agent
, das ein Passwort startet , das das Passwort bei der Anmeldung enthält.
ssh
gnu-screen
services
systemd
Romeovs
quelle
quelle
Antworten:
Sie müssen die Identitätsdateien mit dem nicht verschlüsselten privaten Schlüssel in das
~/.ssh
Verzeichnis des Benutzers stellen, den der Dienst ausführt. Außerdem müssen Sie die Umgebungsvariable HOME dafür festlegen, z. B. wenn sie als root ausgeführt wird:Wenn Sie die Steuerung der
smd-loop
Aufrufe steuernssh
können, können Sie alternativ eine-I
Option hinzufügen , um diessh
zu verwendende Identitätsdatei anzuweisen.In jedem Fall muss die Identitätsdatei diesem Benutzer gehören und nur diesem Benutzer zugänglich sein (
chmod 0400 ~/.ssh/id*
).quelle
env
sollte/usr/bin/env
systemd nicht wissen, wo esenv
ist. auch tatsächlich der Befehlsmd-loop
,smd-loop-win
ist der Name der Bildschirms Instanz erstellt.Wenn der Dienst nur funktionieren muss, während Sie angemeldet sind, stellen Sie eine Verbindung zu dem Dienst her
ssh-agent
, den Sie mit Ihrer Sitzung beginnen. Der einfachste Weg, dies zu tun, besteht darin, einen festen Pfad für den Agent-Socket zu verwenden. Setzen Sie dieSSH_AUTH_SOCK
Umgebungsvariable/home/romeovs/.ssh/darkstar.agent.socket
sowohl im systemd-Job als auch in Ihrem auf so etwas wie.profile
. Beachten Sie, dass Sie, wenn Ihre Distribution einenssh-agent
Prozess für Sie startet , ihn möglicherweise beenden oder unbenutzt lassen und durch Ihren eigenen ersetzen müssen. Wenn dieSSH_AUTH_SOCK
Variable in der Umgebung vorhanden ist,ssh-agent
wird der darin enthaltene Pfad für ihren Socket verwendet. Wenn Sie sich dann anmelden, führen Siessh-add
Ihren privaten Schlüssel aus, und der Job kann ihn verwenden.Wenn der Job ständig ausgeführt werden muss, empfehle ich, zu diesem Zweck einen bestimmten kennwortlosen Schlüssel zu erstellen (
ssh-keygen -t rsa -f ~/.ssh/smd.id_rsa -N ''
) und ihn nur zu autorisieren, einen bestimmten Befehl auf dem Server auszuführen, indem Sie acommand=
undfrom=
Einschränkungen in der~/.ssh/authorized_keys
Datei auf dem Server verwenden. Diefrom=
Option bedeutet, dass der Schlüssel nur für Anmeldeversuche von einem bestimmten Host gültig ist undcommand=
einen Befehl angibt, der anstelle des vom Client angegebenen Befehls ausgeführt wird.ssh-rsa AAAA…== romeovs@darkstar no-agent-forwarding no-port-forwarding no-x11-forwarding from="[email protected]" command="somecommand --foo"
Der Befehl wird von Ihrer Login-Shell ausgeführt. Wenn Sie Parameter an diesen Befehl übergeben müssen, haben Sie zwei Möglichkeiten:
SSH_ORIGINAL_COMMAND
Umgebungsvariablen. Achten Sie darauf, Probleme nicht zu zitieren, wenn Sie versuchen, sie zu analysieren.AcceptEnv
Direktive in dersshd_config
Datei).quelle
Ich würde einen eigenen SSH-Schlüssel ohne Passphrase für diesen Dienst generieren.
Auf den Zielsystemen würde ich dann "command =" in den autorisierten Schlüsseln verwenden, um die Verwendung dieses Schlüssels auf einen einzelnen Befehl zu beschränken.
Danach müssen Sie zum Auslösen des Zielbefehls nur noch eine Verbindung zum Server herstellen - Sie müssen nichts mehr angeben (den Befehl nicht mehr ausführen).
quelle