1 votes

Comment trouver le nom du processus du serveur TFTP en cours d'exécution ?

Je peux utiliser la commande sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist pour démarrer le serveur TFTP sur mac. Mais quel est le nom du processus du serveur TFTP en cours d'exécution ?

J'ai essayé ps aux | grep tftp y pgrep tftp ni ne me donne quoi que ce soit...

Mon but est d'utiliser script pour savoir si le serveur tftp a été activé OU non....

2voto

Christopher Points 965

J'ai écrit un script à cette fin si vous souhaitez l'utiliser. L'utilisation pour TFTP serait la suivante.

sudo what-listens.sh -p 69

Vous serez peut-être surpris de constater qu'il montre launchd au lieu du processus TFTP proprement dit. Le service doit être en cours d'exécution pour voir le processus TFTP réel, et launchd gère probablement ce service.

#!/bin/bash
if [[ "$EUID" -ne 0 ]]; then
    echo 'This script must be run as root.' 1>&2
    exit 1
fi

CMD_SUDO='/usr/bin/sudo'
CMD_LSOF='/usr/sbin/lsof'
CMD_GREP='/usr/bin/grep'

function port() {
    PORT="$1"
    $CMD_SUDO $CMD_LSOF -n -i4TCP:"$PORT" | $CMD_GREP 'LISTEN'
    if [[ "$?" -eq 1 ]]; then
        echo "There is no program listening on port $PORT."
    fi
}

function usage() {
    echo "Usage: $0 [-p,--port <port> ]"
}

B_NEED_ARG=0
case "$1" in
    -p|--port)
        FUNCTION=port
        B_NEED_ARG=1
        ;;
     *)
        echo "Error: unknown parameter: '$1'."
        FUNCTION=usage
        ;;
esac

if [[ $B_NEED_ARG -eq 1 ]] ; then
    if [[ -z "$2" ]] ; then
        echo "Error: option '$1' requires an argument."
        usage
        exit 1
    else
        if ! [[ "$2" =~ ^[0-9]+$ ]]; then
            echo "Error: argument to '$1' option must be an integer."
            usage
            exit 1
        fi
    fi
fi

${FUNCTION} "$2"

unset CMD_SUDO
unset CMD_LSOF
unset CMD_GREP
unset B_NEED_ARG
unset FUNCTION
unset PORT

Je vois que la question a été modifiée avec...

Mon but est d'utiliser script pour savoir si le serveur tftp a été activé OU non....

Cette solution fonctionnait jusqu'à Mavericks, 10.9, et probablement jusqu'à El Capitan, 10.11.6 ; mais je ne l'ai pas encore essayée sur un Mac avec une version supérieure à 10.9. Pour désactiver un service :

sudo defaults write /private/var/db/launchd.db/com.apple.launchd/overrides.plist 'com.apple.tftpd' -dict Disabled -bool true

Il peut ensuite être vérifié :

sudo /usr/libexec/PlistBuddy -c 'print com.apple.tftpd:Disabled' /private/var/db/launchd.db/com.apple.launchd/overrides.plist

Si la valeur de retour n'est pas "true", le service n'est pas désactivé.

1voto

yoliho Points 340

La réponse courte est qu'il n'y a pas de processus en cours

Vous devez examiner la liste de contrôle plus en détail (et probablement lire la documentation d'Apple sur l'option Agents de lancement et démons .

La liste de contrôle pour tftp fournit une liste de sockets sur lesquelles l'agent est à l'écoute.

Lorsque quelqu'un parle à la socket listée dans la plist, launchd se rend compte que le programme listé dans la plist, /usr/libexec/tftpd, est nécessaire et le démarre.

Ainsi, tant que quelque chose ne parle pas au socket, l'agent ne fonctionne pas et je pense que comme l'agent est compatible avec l'intention, il s'éteindra lorsque le socket sera fermé. Lorsque le socket est ouvert, un processus /usr/libexec/tftpd est en cours d'exécution.

1voto

m1xed0s Points 145

Mise à jour :

Comme inspiré par @Christopher, voici le script simple et sale que j'ai écrit pour répondre à mes besoins :)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys,os

my_pid = os.system("sudo lsof -n -i4UDP:69 > /dev/null 2>&1")

if len(sys.argv) == 1:
    if my_pid == 0:
        print 'TFTP Server is already turned on.'
    else:
        print "Parameter (start/stop) is required to turn on/off TFTP Server!"
elif len(sys.argv) > 2:
    print "Only One Parameter (start/stop) is acceptable!"
else:
    cmdarg = str(sys.argv[1])

    if cmdarg == 'start':
        if my_pid == 0:
            print 'TFTP Server is already turned on, No Action!'
        else: 
            os.system("sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist")
            os.system("sudo chmod 777 /private/tftpboot")
            print 'TFTP Server been Started.'
    elif cmdarg == 'stop':
        if my_pid == 0:
            os.system("sudo launchctl unload -F /System/Library/LaunchDaemons/tftp.plist")
            os.system("sudo chmod 755 /private/tftpboot")
            print "TFTP Server has been Stopped."
        else:
            print "TFTP Server was not Turned on! No Action!"
    else:
        print "Correct Parameter (start/stop) is required!"
sys.exit()

0voto

Rich Points 2429

Pour vérifier si tftpd est correctement activée la commande est :

/usr/bin/sudo launchctl list com.apple.tftpd

et la sortie devrait ressembler à ceci :

{
        "Wait" = true;
        "Sockets" = {
                "Listeners" = (
                        file-descriptor-object;
                        file-descriptor-object;
                );
        };
        "LimitLoadToSessionType" = "System";
        "Label" = "com.apple.tftpd";
        "inetdCompatibility" = true;
        "TimeOut" = 30;
        "OnDemand" = true;
        "LastExitStatus" = 0;
        "Program" = "/usr/libexec/tftpd";
        "ProgramArguments" = (
                "/usr/libexec/tftpd";
                "-i";
                "/private/tftpboot";
        );
};

Un test sur $? est suffisante pour établir que du point de vue du système le service est activé et sera redémarré si nécessaire lors d'une connexion externe. Par exemple :

if /usr/bin/sudo launchctl list com.apple.tftpd ; then
    echo "tftpd is on"
else
    echo "tftpd is off"
fi

0voto

boris42 Points 1311

Le TFTPD est un service, ce qui signifie que l'exécutable est lancé à la demande lorsqu'une connexion entrante est établie. Pour savoir si votre Mac répond, c'est-à-dire si le service TFTPD est actif, vous pouvez utiliser la commande suivante dans le terminal ou le shell script. Notez que les privilèges d'administrateur ne sont pas nécessaires pour ce type de requête :

launchctl print system/com.apple.tftpd

Cela produira une sortie de configuration si le service est actif comme ceci :

com.apple.tftpd = {
   active count = 0
   path = /System/Library/LaunchDaemons/tftp.plist
   state = waiting
   [...cut for brevity...]
   system service = 1
   }
}

ou une erreur de ce type :

"Could not find service "com.apple.tftpd" in domain for system"

Ce qui signifie que le service n'a pas été ou ne peut pas être démarré. Si tout ce qui vous intéresse est l'état de fonctionnement ou de non fonctionnement, il est plus facile de vérifier le message d'erreur ou le niveau d'erreur non nul renvoyé. Le niveau d'erreur 0 signifie que le service TFTPD est actif, un niveau non nul signifie qu'il n'est pas actif. Par exemple, si launchd n'est pas du tout chargé, le niveau d'erreur 113 est renvoyé, ce qui signifie : "Could not find specified service" (Impossible de trouver le service spécifié)

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X