我要按照此处的详细说明保护服务器上文件上传目录的安全,但是在遵循这些说明之前,我遇到了一个问题。我不知道Apache以什么用户身份运行。

我发现可以在httpd.conf中查找建议,并且会有“ User”行,但是没有这样的行在我的httpd.conf文件中,因此我想Apache以默认用户身份运行。但是,我无法确定到底是什么。

所以,我的问题是:


如何找出默认值< br user是
是否需要更改默认用户
,如果答案是肯定的,那么我可以通过编辑httpd.conf来更改
默认用户,
是否有可能拧什么东西?

谢谢!

评论

为什么这个问题被否决?是的,由于已在其他地方得到答复,因此已进行了更新,但我认为无需投反对票?这是一个很好的问题?也许我们的否决者会在此添加一个建设性的意见?

您可能希望将该更新作为答案发布并接受它,因为您当前处于“未答复”队列中。

+1:在StackOverflow上被告知;一些用户似乎坚持要逃避新用户

链接的问题不再存在

下一个问题:该怎么做,因为它是两个用户之一,例如root和www-data。如何授予“正确的” Apache组访问权限?

#1 楼

ps aux | egrep '(apache|httpd)'通常会显示apache的运行方式。

通常不需要更改默认用户,“ nobody”或“ apache”通常是好的用户。只要不是“ root”;)

编辑:也可以更准确地捕获apache二进制文件的命令

评论


是的,否则在Ubuntu上将是www-data。

–gravyface
2010年4月19日在23:55

...和Debian。 :)

–cubuspl42
2014年1月28日13:07

该命令向我显示了一个列表,其中大部分来自apache,但也来自root。

–用户
2015年3月1日,凌晨3:40

我有3个进程(/ usr / sbin / apache2 -k启动),一个用户是root用户,另外两个是www-data。我应该担心吗?

– zundi
17年2月22日在18:33

@zundi,该服务以root用户身份启动,以进行绑定到保留端口(例如80和443)的操作。然后,它将以已定义的用户身份开始配置的进程数,Web服务器工作以及任何其他任务。这样,请求将由非特权进程处理。您会注意到所有其他进程的父ID(PPID)都相同。这个想法就是以根用户身份运行的那个进程的PID。

–凯文
17年8月15日在18:52

#2 楼

您可以尝试以下命令:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print }'


评论


我喜欢这个答案,比最喜欢的答案更好(更通用)。谢谢

– pgr
18年8月28日在17:24

#3 楼

使用apachectl -S,它将显示一些Apache用户和组,如下所示:

User: name="_www" id=70
Group: name="_www" id=70


评论


谢谢,在我的Mac上,我看到apache正在以“ _www”运行。

–水星
16-10-19在14:01

这是一个很好的答案,因为它是一个命令,它可以告诉您更多有关正在运行的Web服务器的信息,并以一种全面的方式展示它。

– kontur
19-09-5在8:08

#4 楼

根据ubuntuforums.org,在Ubuntu上,apache2的默认用户是www-data

在Ubuntu 13.10 Saucy上确实如此。


以上论坛中的LarsNoodén。


至请确定[用户]的设置是真的,请检查实际的配置文件。
伞形文件apache2.conf将具有以下内容,

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}


>这是对在/etc/apache2/envvars中设置的环境变量的引用。
mod_suexec还允许以其他用户和组身份运行脚本。

要查找可能使用备用用户,组或同时使用这两个用户的任何虚拟主机,请检查配置。

$ egrep "^User|^Group|^SuexecUserGroup" /etc/apache2/apache2.conf /etc/apache2/sites-available/*.conf



对于基于Red Hat的发行版,它将是(通常,其运行httpd的用户是apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf


#5 楼

我知道这是旧帖子,但仍被列为未答复,因此我将提出建议。如果找不到运行Apache的用户或组,请尝试打开httpd.conf文件。那里应该有“用户”和“组”的条目。您不仅可以查看应该以哪个用户身份运行Apache,而且可以在需要时更改它。

#6 楼

您可以在PHP脚本中包含以下代码:

echo exec('whoami');


评论


在这里当心,这显示了运行PHP的用户,而不是Apache用户。如果使用mod_php,它们是相同的,但是(如现在很常见)如果您使用的是其他内容(例如php_fpm),则它们很容易会有所不同。

–benz001
2014年7月31日在2:29



#7 楼

此代码将或多或少按字母顺序列出运行包含apache(或其名称包含apache)的进程的所有非root用户。

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq


评论


该列表可能包括正在运行“ grep apache”之类的进程的用户,例如您本人。

–mwfearnley
16年7月15日在13:58

#8 楼


要找出用户,只需在ps aux | grep apache运行时使用它即可。 >
第三,更改Apache用户将更改其访问某些目录的权限。您需要确保新用户和组可以访问/ var / www(或在您拥有网站的任何地方)。 apache(或类似名称)作为用户和组,因此它应该已经这样设置。


注意:这与我在Stackoverflow上给出的答案相同。

#9 楼

或者,您可以检查apache配置文件并查找所有者和组。

#10 楼

至少对于基于Debian / Ubuntu的发行版,另一种替代方法是使用Apache设置用户和组的相同方法:source /etc/apache2/envvars

$ echo "$(source /etc/apache2/envvars && echo "$APACHE_RUN_GROUP")"
www-data


如果如果想花点时间,可以在找不到文件的情况下抑制错误,并提供默认值:

$ apacheuser=$(
     source /fail/etc/apache2/envvars 2>/dev/null &&
     echo "$APACHE_RUN_GROUP" ||
     echo nobody  
)
$ echo "$apacheuser"
nobody


#11 楼

正如Noyo在这里建议的那样:

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if () print }')


然后:

echo $APACHE_USER


评论


获取用户(ubuntu命令行):echo $ APACHE_USER

–杰迪(Jadeye)
14-10-22在9:07

#12 楼

使用lsof并将端口apache作为参数传递给它。请参阅“用户”列,以了解用户设备的运行方式。

# lsof -i :80
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd     21058   root    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     21111 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     24915 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)


评论


当您有几个100k打开的文件句柄和/或非常繁忙的服务器时,lsof可能会很慢。

–丹尼斯·诺尔特
18-10-17在10:51

#13 楼

我发现这里提供的大多数解决方案都是特定于系统或配置的(特别是,大多数解决方案根本无法在MacOS上运行),还有一些依赖于用户才知道Apache的配置文件在哪里。 。

所以我作弊了一下,然后让Apache本身告诉我是什么。其结果可以很容易地解析。这是我的解决方案,在一些apachectl -S脚本的顶部使用该解决方案来确定在任何给定时间我可能需要的各种东西...

# Store the results so we don't have to keep calling apachetl...
astatus=`apachectl -S`

# Now grab whatever you want from the result... 
HTTPD_ROOT_DIR=$(expr "`echo "$astatus" | grep ServerRoot`" : ".*\"\(.*\)\".*")
HTTPD_DOC_DIR=$(expr "`echo "$astatus" | grep \"Main DocumentRoot\" `" : ".*\"\(.*\)\".*")
HTTPD_USER=$(expr "`echo "$astatus" | grep \"User:.*name=\" `" : ".*\"\(.*\)\".*")
HTTPD_GROUP=$(expr "`echo "$astatus" | grep \"Group:.*name=\" `" : ".*\"\(.*\)\".*")


这些值然后可以这样使用:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data


评论


您可以使用运算符<<<将字符串作为stdin传递给进程:grep b <<< $$ a \ nb \ nc \ n'

–天花板
1月21日14:33

#14 楼

我在CakePHP文档中找到了此命令。

 HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`
 


现在HTTPDUSER保存了用户名运行服务器的用户,在我的情况下,echo $HTTPDUSER使用rlerdorf / php7dev输出www-data

#15 楼

这就是我现在使用的:

apachectl -t -D DUMP_RUN_CFG 2>/dev/null |
sed -n '/^User/s/.*name="\([^"]*\)".*//p'