我可以使用 访问远程服务器ssh
,但访问权限受到限制:例如UseR
,我的帐户可以在/tmp
其主目录中及其主目录中创建文件,但不能在其他地方创建文件;它可以在chmod
没有sudo
自己的文件的情况下调用,但不能调用chown
.
在这种情况下,我首先想授予 Apache用户在主文件夹www-data
的子目录中创建文件的权限;UseR
但无论我做什么,我都做不到——我总是得到“许可被拒绝”。然后,我想也许我可以给一个文件授予权限,这样www-data
就可以在不创建它的情况下写入它 - 我制作了下面的脚本permtest.sh
来测试这个概念,并通过 ssh as 运行它UseR
,并从 php 脚本运行它,因此它运行为www-data
;并获得了一些日志。
这是所涉及的路径元素的细分:
755 drwxr-xr-x 27 root root 4096 Apr 28 11:51 /
1777 drwxrwxrwt 7 root root 4096 May 25 11:22 /tmp
755 drwxr-xr-x 9 root root 4096 Oct 25 2013 /home
755 drwxr-xr-x 9 root root 4096 Apr 29 12:49 /home/users
755 drwxr-xr-x+ 12 no root 4096 Apr 30 17:07 /home/users/GROUP
775 drwxrwxr-x+ 47 UseR group_users 4096 Jun 21 11:20 /home/users/GROUP/UseR
777 drwxrwxrwx+ 3 UseR group_users 4096 Jun 21 11:22 /home/users/GROUP/UseR/tmp
我permtest.sh 1
首先运行 as UseR
then as ,它在和www-data
中启动文件,然后首先运行 as then as ,它尝试附加到文件;最后运行as打印出文件,结果为:/tmp
/home/users/GROUP/UseR/tmp
permtest.sh 2
www-data
UseR
permtest.sh 3
UseR
+ cat /tmp/MYtest_UseR.txt
testing write
testing write again
test www-data append
test UseR append
+ cat /home/users/GROUP/UseR/tmp/MYtest_UseR.txt
testing write
testing write again
test UseR append
+ cat /tmp/MYtest_www-data.txt
testing write
testing write again
test www-data append
test UseR append
+ cat /home/users/GROUP/UseR/tmp/MYtest_www-data.txt
test UseR append
所以,事情是这样的:在 中/tmp
,UseR
和都www-data
可以在实例化时创建一个具有 777 权限的文件,其他用户可以随后追加到该文件。但这在主文件夹子目录中似乎不可能做到/home/users/GROUP/UseR/tmp
;如果运行为www-data
,无论是尝试附加到/home/users/GROUP/UseR/tmp/MYtest_UseR.txt
拥有的UseR
,还是尝试创建/home/users/GROUP/UseR/tmp/MYtest_UseR.txt
- 该命令都会失败并显示cannot create ... Permission denied
。请注意,这种情况发生在包含权限为 777 的文件夹中/home/users/GROUP/UseR/tmp
。
所以我的问题是:
- 上述信息中是否有任何内容可以告诉我先验
www-data
将无法在用户文件夹中创建文件/home/users/GROUP/UseR/tmp
?如果没有,原则上我如何获取此信息(除了运行下面的脚本之外)? - 作为受限用户,我有哪些选项可以允许
/home/users/GROUP/UseR/tmp
to中的文件写入权限www-data
,以便它可以修改/追加数据?
permtest.sh
:
#!/bin/sh
STAGENUM=${1}
MESELF=$(whoami)
if [ "$STAGENUM" = "" ] ; then
STAGENUM=1
fi
if [ "$STAGENUM" = "1" ] ; then
for ix in /tmp /home /home/users /home/users/GROUP /home/users/GROUP/UseR /home/users/GROUP/UseR/tmp ; do
printf '%s ' `stat -c "%a " ${ix} 2>&1`
ls -lad ${ix} 2>&1
done
set -x
for ix in /tmp /home/users/GROUP/UseR/tmp ; do
touch ${ix}/MYtest_${MESELF}.txt 2>&1
chmod 777 ${ix}/MYtest_${MESELF}.txt 2>&1
ls -la ${ix}/MYtest_${MESELF}.txt 2>&1
echo "testing write" > ${ix}/MYtest_${MESELF}.txt 2>&1
echo "testing write again" | tee -a ${ix}/MYtest_${MESELF}.txt 2>&1
cat ${ix}/MYtest_${MESELF}.txt 2>&1
echo rm ${ix}/MYtest_${MESELF}.txt 2>&1 # don't remove now
done
fi
if [ "$STAGENUM" = "2" ] ; then
set -x
echo "test $MESELF append" >> '/tmp/MYtest_UseR.txt' 2>&1
echo "test $MESELF append" >> '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1
echo "test $MESELF append" >> '/tmp/MYtest_www-data.txt' 2>&1
echo "test $MESELF append" >> '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
set +x
ls -la '/tmp/MYtest_UseR.txt' 2>&1
ls -la '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1
ls -la '/tmp/MYtest_www-data.txt' 2>&1
ls -la '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
fi
if [ "$STAGENUM" = "3" ] ; then
set -x
cat '/tmp/MYtest_UseR.txt' 2>&1
cat '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1
cat '/tmp/MYtest_www-data.txt' 2>&1
cat '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
set +x
fi
if [ "$STAGENUM" = "4" ] ; then
rm '/tmp/MYtest_UseR.txt' 2>&1 ;
rm '/home/users/GROUP/UseR/tmp/MYtest_UseR.txt' 2>&1 ;
rm '/tmp/MYtest_www-data.txt' 2>&1 ;
rm '/home/users/GROUP/UseR/tmp/MYtest_www-data.txt' 2>&1
fi
答案1
您的 ls 输出显示为+登录文件和目录使用 ACL 的模式。
drwxr-xr-x+ ...
这些可能会限制您的访问。列出 acl 权限
getfacl <file or directory>
并删除它们
setfacl -b <file or directory>
然后再次检查。
来自OP的编辑:确实,就是这样 - 这是我在 ssh shell 中所做的一个片段(首先从一个文件上的其他地方复制权限,然后为www-data
另一个文件提供额外的权限) - 然后www-data
可以将罚款附加到这些文件:
UseR:~/tmp$ getfacl MYtest_www-data.txt
# file: MYtest_www-data.txt
# owner: UseR
# group: group_users
user::rw-
user:www-data:r-x #effective:r--
group::r-x #effective:r--
group:www-data:r-x #effective:r--
mask::r--
other::r--
UseR:~/tmp$ getfacl /tmp/MYtest_www-data.txt
getfacl: Removing leading '/' from absolute path names
# file: tmp/MYtest_www-data.txt
# owner: www-data
# group: www-data
user::rwx
group::rwx
other::rwx
UseR:~/tmp$ getfacl /tmp/MYtest_www-data.txt | setfacl --set-file=- MYtest_www-data.txt
getfacl: Removing leading '/' from absolute path names
UseR:~/tmp$ getfacl MYtest_www-data.txt
# file: MYtest_www-data.txt
# owner: UseR
# group: group_users
user::rwx
group::rwx
other::rwx
UseR:~/tmp$ ls -la MYtest_www-data.txt
-rwxrwxrwx 1 UseR group_users 22 Jun 21 12:44 MYtest_www-data.txt
$ getfacl MYtest_UseR.txt
# file: MYtest_UseR.txt
# owner: UseR
# group: group_users
user::rwx
user:www-data:r-x
group::r-x
group:www-data:r-x
mask::rwx
other::rwx
UseR:~/tmp$ setfacl -m u:www-data:w MYtest_UseR.txt
UseR:~/tmp$ getfacl MYtest_UseR.txt
# file: MYtest_UseR.txt
# owner: UseR
# group: group_users
user::rwx
user:www-data:-w-
group::r-x
group:www-data:r-x
mask::rwx
other::rwx
UseR:~/tmp$ setfacl -m u:www-data:rw MYtest_UseR.txt
UseR:~/tmp$ getfacl MYtest_UseR.txt
# file: MYtest_UseR.txt
# owner: UseR
# group: group_users
user::rwx
user:www-data:rw-
group::r-x
group:www-data:r-x
mask::rwx
other::rwx