Benutzer-LaunchAgent wurde erfolgreich geladen

Ich habe eine Plist-Datei erstellt, um einen xinetd- Prozess zu ersetzen, den ich erfolgreich in Windows (Cygwin) und Linux verwendet habe, um eine imapd- Verbindung von einem Remote-Server über ssheinen Port auf dem Localhost zu streamen.

Der plutilBefehl sagt, dass meine Konfiguration in Ordnung ist. launchctl load path-to-plistläuft ohne Fehler.

Wenn ich launchctl listden Agenten ausführe, wird er nicht angezeigt. Wenn ich versuche, eine Verbindung zum Port auf dem Localhost herzustellen, wird die Verbindung abgelehnt.

Hier ist meine plist-Datei:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
            <string>com.my.ssh_tunnel</string>
        <key>Program</key>
            <string>/usr/bin/ssh</string>
        <key>ProgramArguments</key>
            <array>
                    <string>-F /Users/userx/.ssh/config</string>
                    <string>dname /usr/sbin/imapd</string>
            </array>
        <key>Sockets</key>
            <dict>
                <key>Listeners</key>
                <dict>
                    <key>SockServiceName</key>
                        <string>dname-imapd</string>
                    <key>SockType</key>
                        <string>stream</string>
                    <key>SockProtocol</key>
                        <string>TCP</string>
                </dict>
            </dict>
        <key>inetdCompatibility</key>
            <dict>
                <key>Disabled</key>
                <false/>
                <key>Wait</key>
                <false/>
            </dict>
        <key>EnvironmentVariables</key>
            <dict>
                <key>SSH_AUTH_SOCK</key>
                    <string>/Users/userx/.ssh-agent.sock</string>
            </dict>
    </dict>
</plist>

Ich habe /etc/services eine Zeile für dname-imapd und einen nicht zugewiesenen Port (49022) hinzugefügt. Letztendlich werde ich dies in Verbindung mit ssh-agent (damit dies „passwortlos“ funktioniert) und Thunderbird verwenden, um E-Mails von einem sehr gesperrten System abzurufen.

Hier stellen sich im Wesentlichen zwei Fragen. Erstens, woher weiß ich, dass mein Agent geladen wird (und wie bestätige ich das)? Zweitens, ist meine Plist tatsächlich korrekt?

Hier ist meine ursprüngliche xinetd- Konfiguration:

service imapssh
{
        disable         = no
        type            = UNLISTED
        port            = 2208
        socket_type     = stream
        protocol        = tcp
        wait            = no
        server          = /usr/bin/ssh
        server_args     = dname /usr/sbin/imapd
        user            = userx
}

Danke für jede Hilfe. Das macht mich ein bisschen verrückt.

Dies ist auf einem El Capitan Macbook Pro.

Außerdem habe ich einen direkten SSH-Tunnel ausprobiert, aber das funktioniert nicht wirklich (bevor es jemand vorschlägt). Es sei denn, jemand weiß, wie man es so macht, dass es wie inetd funktioniert und jedes Mal spawnt, wenn sich der Mail-Client mit dem Port verbindet.

Ich denke, Ihr Array ProgramArgumentssollte in 4 aufgeteilt werden <string>…</string>, eine für jeden argv[i], als <string>-F</string>….
Die bestehenden, funktionierenden Listen scheinen kein Problem mit mehr als einem String in einem String-Tag zu haben.

Antworten (1)

OK, zuerst auf Ihre zweite Frage eingehen ( ist meine Plist tatsächlich korrekt? ), plutil(in ihrem Standardaufruf) "lints" (überprüft) plistDateien auf Korrektheit:

plutil ~/Library/LaunchAgents/local.brew.update.plist

Gleichwertig:

plutil -lint ~/Library/LaunchAgents/local.brew.update.plist

Zu Ihrer ersten Frage ( Woher weiß ich, dass mein Agent geladen wird (und wie bestätige ich das)? ) finden Sie hier ein paar Dinge, mit denen Sie das überprüfen können.

Zunächst würde ich empfehlen, die Protokollierung hinzuzufügen, um das Debuggen zu unterstützen. Ich logge mich ein ~/Library/Logs, also füge so etwas zu meinem hinzu plist:

<key>StandardOutPath</key>
<string>/Users/userx/Library/Logs/local.brew.update.stdout</string>
<key>StandardErrorPath</key>
<string>/Users/userx/Library/Logs/local.brew.update.stderr</string>

Versuchen Sie, Ihr neu zu laden, plistund überprüfen Sie dann Ihre Protokolle:

less ~/Library/Logs/local.brew.update.stdout
less ~/Library/Logs/local.brew.update.stderr

Ein paar zusätzliche Beobachtungen:

Mein Verständnis von Ihnen inetdCompatibilityist, dass der Agent starten sollte, wenn er geladen ist. Sie sagen jedoch, das launchctl listzeigt den Agenten nicht. Ändert sich das, wenn Sie launchctl start com.my.ssh_tunneles nach dem Laden versuchen plist? Zeigen die Protokolle etwas Neues?

ProgramIch verstehe die Beziehung zwischen und nicht ganz ProgramArguments- könnte nur ich sein, aber ich finde die man launchd.plistErklärung von ProgramArgumentsschwierig. Ich würde versuchen, /usr/bin/sshals erstes stringin hinzuzufügen ProgramArgumentsund den Eintrag für zu entfernen Program. (Dann neu laden und die Protokolle überprüfen. Starten Sie neu und überprüfen Sie die Protokolle, falls erforderlich).

Schließlich bin ich mir ziemlich sicher, dass @daniel-Azuelos richtig ist, und Sie müssen Ihre ProgramArgumentswie folgt angeben (ich habe usr/bin/sshwie oben erwähnt hinzugefügt):

<key>ProgramArguments</key>
<array>
    <string>/usr/bin/ssh</string>
    <string>-F</string>
    <string>/Users/userx/.ssh/config</string>
    <string>dname</string>
    <string>/usr/sbin/imapd</string>
</array>

Meine Begründung dafür ist, dass die wenigen plists, die ich auf meinem System finden kann, die (mehr als eine) verwenden, ProgramArgumentsdieses Idiom verwenden:

<key>Label</key>
<string>com.divx.uninstall.preferences</string>
<key>ProgramArguments</key>
<array>
    <string>/bin/bash</string>
    <string>-c</string>
    <string>if [[ ! -e "/Applications/DivX/DivX Preferences.app" ]] ; then open "/Library/Application Support/DivX/Uninstall DivX for Mac.app"; fi</string>
</array>

Beachten Sie, dass die Option bashvon -cund die entsprechende command_stringin separaten Argumenten stehen.