Jak znaleźć działającą nazwę procesu serwera TFTP?

1

Mogę użyć polecenia, sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plistaby uruchomić serwer TFTP na komputerze Mac. Ale jaka jest nazwa procesu działającego serwera TFTP?

Próbowałem ps aux | grep tftpi pgrep tftpnic mi nie dało ...

Moim celem jest użycie skryptu do śledzenia, czy serwer tftp został włączony LUB nie ...

m1xed0s
źródło
Co rozumiesz przez „jeśli serwer tftp został włączony LUB nie”? Włącza się, jeśli lista nie zawiera klucza Wyłącza - ale to nie znaczy, że działała tylko tak, że jeśli inny proces spróbowałby jej użyć, uruchomiłby się, gdyby istniał taki proces
Mark
Proszę nie dodawać odpowiedzi bezpośrednio do tekstu pytania, ponieważ myli zarówno użytkowników, jak i wyszukiwarki. Możesz jednak opublikować go jako odpowiedź na własne pytanie.
nohillside

Odpowiedzi:

2

Napisałem skrypt w tym celu, jeśli chcesz go użyć. Wykorzystanie TFTP byłoby następujące.

sudo what-listens.sh -p 69

Możesz być zaskoczony, gdy zobaczysz, że pokazuje on launchdzamiast faktycznego procesu TFTP. Usługa musi być uruchomiona, aby zobaczyć rzeczywisty proces TFTP i launchdprawdopodobnie zarządza tą usługą.

#!/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

Widzę, że pytanie zostało zmodyfikowane za pomocą ...

Moim celem jest użycie skryptu do śledzenia, czy serwer tftp został włączony LUB nie ...

To rozwiązanie działało do Mavericks, 10.9 i prawdopodobnie działa do El Capitan, 10.11.6; ale tak naprawdę nie próbowałem tego na komputerze Mac z wersją wyższą niż 10.9. Aby wyłączyć usługę:

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

Następnie można to sprawdzić:

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

Jeśli zwracana wartość nie jest „prawdziwa”, usługa nie jest wyłączona.

Krzysztof
źródło
Dzięki temu tego szukam, a także dodałem prosty i brudny skrypt, który napisałem na moje potrzeby :)
m1xed0s
1

Krótka odpowiedź brzmi: nie ma uruchomionego procesu

Musisz spojrzeć bardziej szczegółowo na listę (i prawdopodobnie przeczytać dokumentację Apple na temat agentów uruchamiania i demonów .

Plist dla tftp zapewnia listę gniazd nasłuchiwanych przez agenta.

Gdy ktoś porozmawia z gniazdem wymienionym na liście uruchomieniowej, zda sobie sprawę, że potrzebny jest program wymieniony na liście, / usr / libexec / tftpd i go uruchomi.

Więc dopóki coś nie odezwie się do gniazda, agent nie działa i myślę, że ponieważ agent jest zgodny, będzie krzyczeć, gdy gniazdo zostanie zamknięte. Gdy gniazdo jest otwarte, uruchomiony zostanie proces / usr / libexec / tftpd

znak
źródło
Ma to sens ... ale nawet jeśli nie ma otwartego gniazda dla TFTPD, nadal istnieje plik o nazwie tftpd w folderze / usr / libexec / ... Jakąkolwiek inną metodą mógłbym użyć do śledzenia, czy TFTP jest włączony, czy nie?
m1xed0s
@ m1xed0s możesz użyć lsof, jak pokazano w skrypcie opublikowanym przez Christophera
nohillside
Włącza się, gdy klawisz Wyłączony na liście pList zostanie usunięty lub uruchomisz prasę, która rozmawia z tftpd i zobaczysz, czy może porozmawiać z usługą
Mark
1

Aktualizacja :

Inspirowany przez @Christopher, oto prosty i brudny skrypt, który napisałem, aby spełnić moje potrzeby :)

#!/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()
m1xed0s
źródło
0

Aby sprawdzić, czy tftpdjest poprawnie aktywowane, polecenie to:

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

a wynik powinien wyglądać następująco:

{
        "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";
        );
};

Test włączony $?jest wystarczający, aby stwierdzić, że z punktu widzenia systemu usługa jest aktywowana i w razie potrzeby zostanie ponownie uruchomiona przed połączeniem zewnętrznym. Na przykład:

if /usr/bin/sudo launchctl list com.apple.tftpd ; then
    echo "tftpd is on"
else
    echo "tftpd is off"
fi
Dan
źródło
0

TFTPD jest usługą, co oznacza, że ​​plik wykonywalny jest uruchamiany na żądanie, gdy nawiązywane jest połączenie przychodzące. Aby sprawdzić, czy komputer Mac zareaguje, tj. Czy usługa TFTPD jest aktywna, możesz użyć następującego polecenia w skrypcie Terminal lub powłoki. Pamiętaj, że uprawnienia administratora nie są potrzebne dla tego typu zapytań:

launchctl print system/com.apple.tftpd

Spowoduje to wygenerowanie wyniku konfiguracji, jeśli usługa jest aktywna w następujący sposób:

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

lub błąd taki jak ten:

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

Co oznaczałoby, że usługa nie została uruchomiona lub nie można jej uruchomić. Jeśli wszystko, co Cię interesuje, to stan uruchomiony / niedziałający, wówczas najłatwiej jest sprawdzić komunikat o błędzie lub zwrócony niezerowy poziom błędu. Poziom błędu 0 oznacza, że ​​usługa TFTPD jest aktywna, wartość niezerowa oznacza, że ​​nie jest aktywna. Na przykład, jeśli uruchomiona aplikacja nie jest ładowana przy wszystkich poziomach błędu, zwracany jest numer 113, co oznacza: „Nie można znaleźć określonej usługi”

boris42
źródło