php文件命令行执行文件,PHP可执行文件将在命令行中运行,但不在brows中运行

我怀疑您的问题是nmap命令行的sudo部分。如果将subprocess.call替换为^{},我想您会发现该命令会引发一个^{}。在

假设您的用户帐户在/etc/sudoers文件中,但Web服务器没有。在

由于shell的输出重定向操作符(>)做的第一件事是截断输出文件,所以运行nmap的失败尝试将导致一个零字节whohome.txt。然后,Python脚本的其余部分对website.txt执行相同的操作,最终您的网站上没有显示任何内容。在

解决方案

不需要sudo

在我的Linux桌面上,我需要以root用户身份运行nmap来执行本地ping扫描。如果在您的系统上是真的,那么您应该能够删除nmap命令中的sudo部分,并完成它。在

不过,这是有区别的。^当-pSping扫描由^{运行时,{}将对每个目标执行更彻底的测试。从旧的nmap手册页(添加了重点):-sP (Skip port scan) .

[...]

The -sP option sends an ICMP echo request, TCP SYN to port 443, TCP ACK to port 80, and an ICMP timestamp request by default. When executed by an unprivileged user, only SYN packets are sent (using a connect call) to ports 80 and 443 on the target. When a privileged user tries to scan targets on a local ethernet network, ARP requests are used unless send-ip was specified. [...]

为您的Web服务器启用sudo

如果您需要这些额外的信息(听起来像您一样),您需要使用超级用户权限运行nmap(或调用它的Python脚本)。我从未尝试过强制Web服务器执行此操作,但我认为您至少必须将Web服务器的用户添加到/etc/sudoers。比如:apache localhost=/usr/bin/nmap -sP

或者:

^{pr2}$

…依此类推,取决于用户名,nmap所在的位置,您希望将参数限制在nmap的严格程度,等等

创建一个SUID可执行文件来为您运行nmap

另一种选择是(我讨厌我自己推荐这种方法——这里的必须是更好的方法)是编写一个小的SUID(Set User ID)程序,只执行您想要的nmap命令。下面是一个C程序可以做到:#include

#include

int main(void);

int main(void) {

int retval = 0;

char* const error_string = "ERROR: Failed to execute \"/usr/bin/map\"";

char* const nmap_args[] = {

"/usr/bin/nmap",

"-sP",

"192.168.1.0/24",

NULL

};

retval = execv("/usr/bin/nmap", nmap_args);

/* execv returns _only_ if it fails, so if we've reached this

* point, print an error and exit.

*/

perror(error_string);

return retval;

}

将上述内容另存为nmap_lan.c,并使用以下命令进行编译:$ gcc -Wall -o nmap_lan nmap_lan.c

然后,将其移动到保存网站脚本的位置,并以root用户的身份更改其所有权和权限:# chown root:root nmap_lan # Or whatever group name you use.

# chmod 4555 nmap_lan

前导4设置SUID位。目录的颜色ls可能会突出显示该文件。权限应该如下所示:# ls -l nmap_lan

-r-sr-xr-x. 1 root root 6682 May 23 03:04 nmap_lan

任何运行nmap_lan的用户将被临时提升为拥有nmap_lan文件的人(在本例中,root),直到程序退出。这是非常慷慨的,这就是为什么我在那个程序中硬编码了所有的东西。。。要更改它所做的任何事情—甚至只是要扫描的IP范围—您必须编辑nmap_lan.c文件,重新编译并重新安装。在

我在我的命令行上测试了nmap_lan,当由通常只能得到有限输出的非特权用户运行时,它会产生特权用户nmap输出。在

对Python脚本的注释

一般来说,Python在解析shell参数方面比shell要好得多(一个原因是shell的默认值是^{),所以让Python脚本尽可能多地完成任务,包括解析shell命令、重定向输入和重定向输出。在

用Python做这项工作的一个主要优点是,如果无法打开、读取、写入或关闭任何文件,则会立即导致崩溃和堆栈跟踪,而不是您一直在处理的无声失败。在

我重写了call命令以使用显式分隔的参数列表。{38>可以通过传递参数来处理打开的文件。通过让Python打开输出文件并显式写入,可以消除最后一点shell重定向。在nmap_file='/home/pi/whohome.txt'

with open(nmap_file, 'wt', encoding='ascii') as fout:

subprocess.call(

['/usr/bin/nmap', '-sP', '192.168.1.0/24'], # Or just ['nmap_lan']

stdout=fout,

universal_newlines=True,

)

output_file='/var/www/html/website.txt'

with open(nmap_file, 'rt', encoding='ascii') as fin:

with open(output_file, 'wt', encoding='ascii') as fout:

for line in fin:

...

print('Output here', file=fout) # Add `file=...` to each print.

另外,除非您需要whohome.txt文件来做其他事情,否则可以通过使用^{}将nmap命令的输出存储为字符串,然后把它分成几行。(至少在python3中,universal_newlines参数还处理将bytes对象转换为str的操作lines = subprocess.check_output(

['/usr/bin/nmap', '-sP', '192.168.1.0/24'], # Or just ['nmap_lan']

universal_newlines=True

).split('\n')

output_file='/var/www/html/website.txt'

with open(output_file, 'wt', encoding='ascii') as fout:

for line in lines:

...

print('Output here', file=fout) # Add `file=...` to each print.

注意,我使用with块免费关闭文件。在

(最后,这一系列的if命令迫切需要重写为for machine in machines_dict:循环,您要搜索的字符串作为字典中的键,要打印的输出作为值。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值