我可以使用命令 sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
在mac上启动TFTP服务器。但是正在运行的TFTP服务器的进程名称是什么?
我试过了 ps aux | grep tftp
和 pgrep tftp
,既不给我任何东西......
我的目标是使用脚本来跟踪tftp服务器是否已打开或不...
我可以使用命令 sudo launchctl load -F /System/Library/LaunchDaemons/tftp.plist
在mac上启动TFTP服务器。但是正在运行的TFTP服务器的进程名称是什么?
我试过了 ps aux | grep tftp
和 pgrep tftp
,既不给我任何东西......
我的目标是使用脚本来跟踪tftp服务器是否已打开或不...
Answers:
如果您愿意使用它,我为此目的编写了一个脚本。 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”,则不会禁用该服务。
简短的回答是没有正在运行的过程
您需要更详细地查看plist(并且可能会阅读Apple的文档 启动代理和守护进程 。
tftp的plist提供了代理侦听的套接字列表。
当某人与plist launchd中列出的套接字进行通信时,将意识到需要在plist / usr / libexec / tftpd中列出的程序并启动它。
因此,直到某些内容与套接字进行通信,代理程序才会运行,我认为当代理程序打算兼容时,它会在套接字关闭时大喊大叫。当套接字打开时,将运行/ usr / libexec / tftpd进程
lsof
,如克里斯托弗发布的脚本所示
更新 :
受@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()
检查是否 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
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,这意味着:“找不到指定的服务”