O bit setuid não tem efeito algum sobre scripts em sistemas baseados em Linux como o Ubuntu. O que você está observando é o resultado de um erro de citação que você cometeu ao criar o script. Seu script não verifica quem está executando o script. Ele tem theowner
codificado nele e sempre relata Running as user theowner
, independentemente de com qual usuário é executado. Para confirmar isso, basta verificar o conteúdo do script.
Meu nome de usuário é ek
. Quando eu faço seu script e verifico seu conteúdo, vejo:
$ echo "echo \"Running as user $(whoami)\"" > script.sh
$ cat script.sh
echo "Running as user ek"
Essa terceira linha mostra o conteúdo do script. O script não está determinando ek
programaticamente executando. Eu ainda não corri! O texto ek
aparece no próprio script, assim como o texto theowner
aparece no seu.
Eu não alterei as permissões no script. Aqui está o que acontece quando eu o tornar executável, então, execute-o como eu mesmo ( ek
) e, em seguida, execute-o como um usuário separado ( ek2
). Observe que isso acontece mesmo quando eu não configuro o bit setuid (e a saída de ls -l
revela que ele não está definido).
$ chmod +x script.sh
$ ls -l script.sh
-rwxrwxr-x 1 ek ek 26 Oct 4 18:29 script.sh
$ ./script.sh
Running as user ek
$ su ek2 -c './script.sh'
Password:
Running as user ek
Por que $(whoami)
foi avaliado em vez de ser preservado e escrito literalmente em seu script? Isso ocorre porque substituição de comandos , como expansão do parâmetro e outras expansões que são acionadas por $
, são executadas pelo seu shell mesmo dentro de cordas duplas com aspas .
Você pode usar aspas simples para evitar isso. Então você começa:
$ echo 'echo "Running as user $(whoami)"' > script2.sh
$ cat script2.sh
echo "Running as user $(whoami)"
$ chmod +x script2.sh
$ ls -l script2.sh
-rwxrwxr-x 1 ek ek 33 Oct 4 18:39 script2.sh
$ ./script2.sh
Running as user ek
$ su ek2 -c './script2.sh'
Password:
Running as user ek2
$ chmod u=rs,go+x script2.sh
$ ls -l script2.sh
-r-Srwxr-x 1 ek ek 33 Oct 4 18:39 script2.sh
$ ./script2.sh
-bash: ./script2.sh: Permission denied
$ su ek2 --c './script2.sh'
Password:
Running as user ek2
Observe que o script ainda é executado como ek2
porque o sistema operacional ignorou o bit setuid, como ocorre em todos os scripts. Os bits setuid e setgid são honrados somente em executáveis binários (e em diretórios, para o qual eles fazem algo completamente diferente ) .