Caricamento di LaunchAgent utente con successo

4

Ho creato un file plist per sostituire un processo xinetd che ho usato con successo in Windows (Cygwin) e Linux per trasmettere una connessione imapd da un server remoto tramite ssh su una porta sull'host locale.

Il comando plutil dice che la mia configurazione è OK. launchctl load path-to-plist viene eseguito senza errori.

Quando eseguo launchctl list l'agente non viene visualizzato. Quando provo a connettermi alla porta sul localhost, ottengo la connessione rifiutata.

Ecco il mio file plist:

<?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>

Ho aggiunto una riga a / etc / services per dname-imapd e una porta non assegnata (49022). In definitiva userò questo in congiunzione con ssh-agent (per rendere questo lavoro 'senza password') e Thunderbird per recuperare la posta da un sistema molto bloccato.

Qui ci sono essenzialmente due domande. Uno, come faccio a sapere che il mio agente viene caricato (e come posso confermarlo)? Due, il mio plist è effettivamente corretto?

Ecco la mia configurazione originale xinetd :

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
}

Grazie per l'aiuto. Questo mi sta facendo impazzire.

Questo è su un MacBook Pro El Capitan.

Inoltre, ho provato un tunnel ssh diretto ma non funziona (prima che qualcuno lo suggerisca). A meno che qualcuno non sappia come farlo funzionare come inetd e spawn ogni volta che il client di posta si connette alla porta.

    
posta mrmacross 16.12.2015 - 08:03
fonte

1 risposta

1

OK, risolvendo prima la seconda domanda ( la mia plist è effettivamente corretta? ), plutil (nella sua invocazione predefinita) "lint" (controlla) plist file per la correttezza:

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

Equivalente a:

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

Passando alla tua prima domanda ( come faccio a sapere che il mio agente viene caricato (e come posso confermarlo)? ), ecco alcune cose per aiutarti a controllarlo.

Per prima cosa, consiglierei di aggiungere la registrazione per facilitare il debug. Accedo a ~/Library/Logs , quindi aggiungi qualcosa di simile al mio 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>

Prova a caricare nuovamente plist e quindi controlla i tuoi registri:

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

Alcune osservazioni aggiuntive:

La mia comprensione del inetdCompatibility è che l'agente dovrebbe avviarsi quando viene caricato. Tuttavia, tu dici che launchctl list non mostra l'agente. Ciò cambia se provi launchctl start com.my.ssh_tunnel dopo aver caricato plist ? I registri mostrano qualcosa di nuovo?

Non capisco del tutto la relazione tra Program e ProgramArguments - potrei essere solo io, ma trovo la spiegazione di man launchd.plist di ProgramArguments hard-going. Sarei propenso a provare ad aggiungere /usr/bin/ssh come primo string in ProgramArguments e a rimuovere la voce per Program . (Quindi ricaricare e controllare i log. Riavvia e controlla i log, se necessario).

Infine, sono abbastanza sicuro che @ daniel-Azuelos sia corretto, e devi specificare il tuo ProgramArguments come questo (ho aggiunto usr/bin/ssh come menzionato sopra):

<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>

Il mio ragionamento per questo è, i pochi plist s che posso trovare sul mio sistema che usano (più di uno) ProgramArguments usano questo idioma:

<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>

Nota come l'opzione bash -c e il corrispondente command_string siano in argomenti separati.

    
risposta data 10.12.2016 - 16:25
fonte

Leggi altre domande sui tag