Як знайти запущене ім'я процесу TFTP Server?

Я можу скористатися командою sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist для запуску TFTP-сервера на Mac. Але яке ім'я процесу запущеного сервера TFTP?

Я спробував ps aux | grep tftp і pgrep tftp , ні дати мені нічого ...

Моя мета полягає в тому, щоб використовувати скрипт для відстеження, якщо сервер tftp увімкнено чи не ...

1
Будь ласка, не додайте відповіді безпосередньо до тексту запитань, це заплутує користувачів і пошукові системи. Ви можете опублікувати його як відповідь на власне запитання.
додано Автор Andrew Dunaway, джерело
Що ви маєте на увазі під "якщо tftp сервер був включений чи не"? Вона ввімкнена, якщо plist не містить ключа Disables - але це не означає, що він запускається лише тому, що якщо інший процес спробував використати його, він буде працювати, якщо був такий процес
додано Автор yoliho, джерело

5 Відповіді

Для цього я написав сценарій, якщо ви захочете його використати. Використання для TFTP буде наступним.

sudo what-listens.sh -p 69

Ви можете бути здивовані тим, що він показує launchd замість фактичного процесу TFTP. Служба повинна працювати, щоб побачити фактичний процес TFTP, і launchd , ймовірно, керує цією службою.

#!/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  ]"
}

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

Я бачу, що питання було змінено ...

Моя мета полягає в тому, щоб використовувати скрипт для відстеження, якщо сервер tftp увімкнено чи не ...

Це рішення нижче доводилося до Mavericks, 10,9, і, ймовірно, працює до El Capitan, 10.11.6; але, насправді, я не спробував його на Mac з версією вище 10.9. Щоб вимкнути службу:

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

Потім можна перевірити:

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

Якщо повернене значення не є "істинним", то служба не буде вимкнена.

2
додано
Спасибі Thats, що я шукаю, і я також додав простий і брудний сценарій я написав для моїх потреб :)
додано Автор Nicolas, джерело

Коротка відповідь полягає в тому, що немає запущеного процесу

Потрібно більш детально шукати plist (і, можливо, прочитати документацію компанії Apple на Агенти запуску та демони .

Те, що робить plist для tftp, містить список сокетів, на яких слухає агент.

Коли хтось розмовлятиме з сокетом, зазначеним у запуску plist, буде зрозуміло, що програма, вказана у полі plist,/usr/libexec/tftpd, потрібна і запускається.

Таким чином, поки щось не розмовляє з сокетом, агент не працює, і я думаю, що агент має намір бути сумісним, коли він закриється. Коли сокет відкритий, буде запущений процес/usr/libexec/tftpd

1
додано
@ m1xed0s можна використовувати lsof , як показано у скрипті, розміщеному Christopher
додано Автор Andrew Dunaway, джерело
Увімкнено, якщо вимкнено клавішу Disabled у списку pList, або ви починаєте натискання, яке переходить до tftpd і бачите, чи може він говорити з службою
додано Автор yoliho, джерело
Це має сенс ... але навіть для TFTPD не відкрито жодного сокета, є файл з ім'ям tftpd під/usr/libexec/folder ... Будь-який інший метод, який можна використовувати для відстеження, якщо TFTP включений чи ні?
додано Автор Nicolas, джерело

Update:

Як натхненний @Christopher, ось простий і брудний сценарій, який я написав для задоволення моїх потреб :)

#!/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()
1
додано

Щоб перевірити, чи активовано tftpd , команда:

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

і вихід повинен виглядати так:

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

Тест на $? є достатнім для підтвердження цього з точки зору системи послуга активована і буде перезавантажена за необхідності перед зовнішнім підключенням. Наприклад:

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

TFTPD - це послуга, яка означає, що виконуваний файл запускається за запитом при вхідному з'єднанні. Щоб дізнатися, чи відповість ваш Mac, чи активна служба TFTPD, можна скористатися наступною командою в терміналі або скрипті оболонки. Зауважте, що адміністративні права не потрібні для цього типу запиту:

launchctl print system/com.apple.tftpd

Це призведе до виводу конфігурації, якщо служба активна таким чином:

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

або помилка:

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

Це означатиме, що послуга не була запущена або не може бути запущена. Якщо все, що вас цікавить, працює/не працює стан, то найпростіше перевірити повідомлення про помилку або повернути ненульовий рівень помилок. Errorlevel 0 означає службу TFTPD активну, ненульове засіб не активне. Наприклад, якщо запуску не буде завантажено на всіх рівнях помилки, повертається номер 113, що означає: "Не вдалося знайти вказану службу"

0
додано