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 ssh
einen Port auf dem Localhost zu streamen.
Der plutil
Befehl sagt, dass meine Konfiguration in Ordnung ist. launchctl load path-to-plist
läuft ohne Fehler.
Wenn ich launchctl list
den 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.
OK, zuerst auf Ihre zweite Frage eingehen ( ist meine Plist tatsächlich korrekt? ), plutil
(in ihrem Standardaufruf) "lints" (überprüft) plist
Dateien 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, plist
und ü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 inetdCompatibility
ist, dass der Agent starten sollte, wenn er geladen ist. Sie sagen jedoch, das launchctl list
zeigt den Agenten nicht. Ändert sich das, wenn Sie launchctl start com.my.ssh_tunnel
es nach dem Laden versuchen plist
? Zeigen die Protokolle etwas Neues?
Program
Ich verstehe die Beziehung zwischen und nicht ganz ProgramArguments
- könnte nur ich sein, aber ich finde die man launchd.plist
Erklärung von ProgramArguments
schwierig. Ich würde versuchen, /usr/bin/ssh
als erstes string
in hinzuzufügen ProgramArguments
und 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 ProgramArguments
wie folgt angeben (ich habe usr/bin/ssh
wie 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 plist
s, die ich auf meinem System finden kann, die (mehr als eine) verwenden, ProgramArguments
dieses 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 bash
von -c
und die entsprechende command_string
in separaten Argumenten stehen.
Dan
ProgramArguments
sollte in 4 aufgeteilt werden<string>…</string>
, eine für jedenargv[i]
, als<string>-F</string>…
.MrMacross