如何查找正在运行的TFTP Server进程名称?


1

我可以使用命令 sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist 在mac上启动TFTP服务器。但是正在运行的TFTP服务器的进程名称是什么?

我试过了 ps aux | grep tftppgrep tftp,既不给我任何东西......

我的目标是使用脚本来跟踪tftp服务器是否已打开或不...


你的意思是“如果tftp服务器已打开或不打开”?如果plist不包含Disables键,它会打开 - 但这并不意味着它只运行,如果有另一个进程试图使用它,如果有这样的进程就会运行
Mark

请不要直接在问题文本中添加答案,这会让用户和搜索引擎感到困惑。你可以发布它作为你自己的问题的答案。
nohillside

Answers:


2

如果您愿意使用它,我为此目的编写了一个脚本。 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 <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服务器是否已打开或不...

下面的解决方案是10.9的Mavericks,可能适用于El Capitan,10.11.6;但是,我还没有在版本高于10.9的Mac上尝试过它。要禁用服务:

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

如果返回值不为“true”,则不会禁用该服务。


谢谢,我正在寻找什么,我还添加了一个简单而又脏的脚本,我为我的需求写了:)
m1xed0s

1

简短的回答是没有正在运行的过程

您需要更详细地查看plist(并且可能会阅读Apple的文档 启动代理和守护进程

tftp的plist提供了代理侦听的套接字列表。

当某人与plist launchd中列出的套接字进行通信时,将意识到需要在plist / usr / libexec / tftpd中列出的程序并启动它。

因此,直到某些内容与套接字进行通信,代理程序才会运行,我认为当代理程序打算兼容时,它会在套接字关闭时大喊大叫。当套接字打开时,将运行/ usr / libexec / tftpd进程


这是有道理的......但即使没有为TFTPD打开套接字,在/ usr / libexec /文件夹下仍然有一个名为tftpd的文件...我可以使用任何其他方法来跟踪TFTP是否打开?
m1xed0s

你可以使用@ m1xed0s lsof,如克里斯托弗发布的脚本所示
nohillside

如果删除了pList中的Disabled键,或者您启动了与tftpd对话的新闻,并查看它是否可以与服务进行通信,则会将其打开
Mark

1

更新

受@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()

0

检查是否 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服务是否处于活动状态,您可以在终端或shell脚本中使用以下命令。请注意,此类查询不需要管理员权限:

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服务有效,非零表示无效。例如,如果未加载launchd,则返回错误级别113,这意味着:“找不到指定的服务”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.