Php (U) 通过“安装”;执行官;加上;“sudo”;。用户是一个;“苏多尔”;用NOPASSWD
我已经看了这两个方面:Php (U) 通过“安装”;执行官;加上;“sudo”;。用户是一个;“苏多尔”;用NOPASSWD,php,linux,root,sudo,archlinux,Php,Linux,Root,Sudo,Archlinux,我已经看了这两个方面: 但是,我的问题似乎不同 我构建了一个扩展库,用于调用Linux CLI工具。它是围绕着家庭而建的 我正在使用它成功地执行所有(直到我点击这个mount/umountbug)CLI工具 现在,我正在构建一个RAID设置例程,它涉及到partprobe,parted-rm,mklabel,mkpart,mdadm-停止,零超级块,创建,dd,mkfs并最终mount/umount 实际上有两个优雅的例程,一个用于组装RAID,另一个用于拆解 正如标题所说,问题在于m
我构建了一个扩展库,用于调用Linux CLI工具。它是围绕着家庭而建的 我正在使用它成功地执行所有(直到我点击这个
mount
/umount
bug)CLI工具
现在,我正在构建一个RAID设置例程,它涉及到partprobe
,parted
-rm,mklabel,mkpart,mdadm
-停止,零超级块,创建,dd
,mkfs
并最终mount
/umount
实际上有两个优雅的例程,一个用于组装RAID,另一个用于拆解
正如标题所说,问题在于mount
和umount
。上面列出的其他工具及其命令成功执行
环境
Arch Linux-Linux stone 3.11.6-1-Arch#1 SMP抢占周五10月18日23:22:36 CEST 2013 x86_64 GNU/Linux
Arch正在运行systemd
-可能会以某种方式影响安装
Apache web服务器(最新版本),运行mod_php(最新版本)。Apache以http:http
的形式运行
http
在wheel
组中,wheels
是sudoers-%wheel ALL=(ALL)NOPASSWD:ALL
请不要开始讨论
webserver
的完整根功能-该单元是一个NAS,它运行一个定制的WebOS,并且仅用于内部网。即使有黑客企图-这些很可能会破坏整个系统,这对客户来说是不健康的。NAS是用于存储的,它运行大量的相关服务,并且这些单元已部署在30多个对象中,没有任何问题。简而言之,webserver
不是为web服务,而是为操作系统服务
在编写之前,为了快速测试,我向sudoers显式地添加了http
-httpall=(ALL)NOPASSWD:ALL
-不起作用
问题
RAID组装过程中运行的最后一个命令是mount/dev/md/stone\:supershare/mnt/supershare
,它返回的退出代码为0
执行后续装载会导致:
mount: /dev/md127 is already mounted or /mnt/supershare busy
/dev/md127 is already mounted on /mnt/supershare
退出代码为32
。所以,阵列安装在某个地方
执行umount/dev/md/stone \:supershare
在上述mount
之后,返回退出代码0
。执行后续的umount
会导致:
umount: /dev/md/stone:supershare: not mounted
上面的命令是使用sudo自动运行的
所以,它安装成功,卸载成功,但是。。。我在TTY0上以root
身份登录,在执行mount
操作后运行lsblk
,但我没有看到mountpoint
:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 55.9G 0 disk
├─sda1 8:1 0 1M 0 part
├─sda2 8:2 0 1G 0 part [SWAP]
├─sda3 8:3 0 12G 0 part /
└─sda4 8:4 0 16.6G 0 part /home
sdb 8:16 0 931.5G 0 disk
└─sdb1 8:17 0 899M 0 part
└─md127 9:127 0 1.8G 0 raid0
sdc 8:32 0 931.5G 0 disk
└─sdc1 8:33 0 899M 0 part
└─md127 9:127 0 1.8G 0 raid0
尝试从TTY0使用相同的mount
命令将其成功装载(lsblk在之后显示)
如果我使用CLI工具装载它,然后同时使用CLI工具运行
mount-l
和lsblk
,则装载点可见
从TTY0以root用户身份立即运行这两个命令时,不显示装入点
重新启动,重置所有装载(非自动装载),然后从TTY0装载并从TTY0运行
lsblk
,显示装载点
然后,使用CLI工具运行lsblk
,显示装入点
然后,使用CLI工具运行umount
,退出code0
-卸载
再次使用CLI工具运行lsblk
,不会显示装入点
从TTY0运行lsblk
,仍然显示装入点
当使用my CLI工具运行
mount
/umount
时,它似乎会私下执行sudo
会话运行程序的命令
umount
ing在TTY0装载后,确实会卸载它,但再次-私下卸载
从TTY0以
http
身份登录并在从CLI工具装入RAID后运行lsblk
,装入点不会显示。这种类型否定了“为sudo
会话运行程序私自执行”
我还发现了以下内容: mount命令使用真实用户ID而不是有效用户ID来确定用户是否具有适当的访问权限。系统组成员可以发布设备装载,前提是他们对装载点和/etc/filesystems文件中指定的装载具有写访问权具有root用户权限的用户可以发出任何装载命令
我希望我的解释足够好,不要太混乱,我也希望你们能帮助我抓住这个问题
更新(2013-10-28) 我尝试在web上下文之外使用CLI工具进行测试,这是一个简单的PHP文件,我使用
root
和一个自定义用户执行该文件
在这两种情况下,装载和卸载都是成功的。所以,这一定是Apache执行命令的原因,不过,我不明白为什么其他命令可以工作
问题:
是什么导致了这个问题,我该如何克服它呢?简而言之,就是这个问题
是Apache相应的systemd
服务发出了指令。显然,该指令使用新的文件系统名称空间执行该进程
这个问题,在试图调试和修复这个问题时,在互联网上引发了许多其他帖子 每一个都来自于我在这个过程中学到的东西 我从获取有关
mount
使用EUID
的更深入信息开始。很快,我发现我的简单的sudo
cal
<?php
...
exec("sudo mount /dev/sda1 /mnt/drive", $output, $ret);
...
?>
exec("ls /mnt/drive", $o, $r);
foreach ($o as $line){
echo $line.'<BR>';
}
PrivateTmp=false
/lib/systemd/system/apache2.service
system('ischroot;echo $?');