Eu tenho acesso a um servidor remoto com ssh
, mas o acesso é limitado: minha conta, digamos UseR
, pode criar arquivos em /tmp
e em seu diretório pessoal, mas não em outro lugar; ele pode chamar chmod
sem sudo
nos próprios arquivos, mas não pode chamar chown
.
Nesse contexto, primeiro quis dar às permissões de usuário www-data
do Apache para criar arquivos em um subdiretório da pasta base de UseR
; mas não importa o que eu fiz, eu não pude - eu sempre tive "permissão negada". Então, pensei que talvez pudesse apenas dar permissões a um arquivo, então www-data
pode escrever nele sem criá-lo - eu fiz o script abaixo permtest.sh
para testar esse conceito e executá-lo via ssh como UseR
, e de um script php para que ele seja executado como www-data
; e obtivemos alguns logs.
Esta é a divisão dos elementos do caminho envolvidos:
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
Eu executo permtest.sh 1
primeiro como UseR
, em seguida, como www-data
, que inicia arquivos em /tmp
e /home/users/GROUP/UseR/tmp
e, em seguida, execute permtest.sh 2
como www-data
como UseR
, que tenta anexar para arquivos; e finalmente execute permtest.sh 3
as UseR
para imprimir os arquivos, cujo resultado é:
+ 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
Assim, as coisas são: em /tmp
, UseR
e www-data
podem criar um arquivo com 777 permissões na instanciação, ao qual o outro usuário pode acrescentar posteriormente. Mas isso parece impossível de fazer no subdiretório da pasta base /home/users/GROUP/UseR/tmp
; se executado como www-data
, independentemente de tentar anexar a /home/users/GROUP/UseR/tmp/MYtest_UseR.txt
de propriedade de UseR
ou de tentar criar /home/users/GROUP/UseR/tmp/MYtest_UseR.txt
, o comando falhará com cannot create ... Permission denied
. Observe que isso acontece com a pasta contida /home/users/GROUP/UseR/tmp
com 777 permissões.
Então minhas perguntas são estas:
- Existe alguma coisa nas informações acima, que me diria a priori que
www-data
não será capaz de criar um arquivo na pasta do usuário /home/users/GROUP/UseR/tmp
? Se não, como eu poderia, em princípio, obter essa informação (além de executar o script abaixo)?
- Quais opções eu tenho, como usuário limitado, para permitir permissões de gravação para um arquivo em
/home/users/GROUP/UseR/tmp
to www-data
, de modo que ele possa modificar / anexar dados?
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