Talvez tudo o que você queira fazer seja:
exec ./test.sh
Isso substitui o processo atual do shell pelo script, para que, quando ele terminar, não haja mais nada para executar.
Eu gostaria de criar um script que:
Exemplo: test.sh
echo "test script"
sudo su
logout
Se eu executar um script como este:
echo "test"
sudo su
whomai
Eu obtenho o resultado desejado:
[wolfy@ubuntusrv ~ ]# ./test.sh
test
[root@ubuntusrv wolfy]# date
Fri 19 Jun 10:56:52 CEST 2015
[root@ubuntusrv wolfy]# echo bla
bla
[root@ubuntusrv wolfy]# exit
wolfy
[wolfy@ubuntusrv ~ ]#
Como você pode ver, o script executa meu comando echo e eu sudo su para o root, onde posso fazer o que preciso e depois que eu saio do root execute o script execute o último comando ( whoami ).
Meu problema é que não consigo me fazer logout no final deste script.
Eu preciso de uma maneira de fazer isso sem privilégios de root.
Alguém pode me ajudar?
Explicação adicional:
Talvez tudo o que você queira fazer seja:
exec ./test.sh
Isso substitui o processo atual do shell pelo script, para que, quando ele terminar, não haja mais nada para executar.
Normalmente, para executar um comando como root, sudo
é suficiente.
#!/bin/bash
echo test
sudo whoami
Se você insistir em usar su
, por qualquer motivo, você pode usar o sinalizador -c:
#!/bin/bash
echo test
sudo su -c whoami
E aqui está o resultado, mesmo nos dois casos:
$ ./test.sh
test
[sudo] password for xieerqi:
root
Se você quiser entrar no shell do root, use sudo -i
serg@ubuntu[/home/xieerqi]
$ sudo -i
# date
Fri Jun 19 13:16:15 EEST 2015
# whoami
root
# exit
serg@ubuntu[/home/xieerqi]
$
Com su:
serg@ubuntu[/home/xieerqi]
$ sudo su -c /bin/bash
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
root@anaconda:/home/xieerqi# date
Fri Jun 19 12:41:06 EEST 2015
root@anaconda:/home/xieerqi# echo blah
blah
root@anaconda:/home/xieerqi# exit
exit
serg@ubuntu[/home/xieerqi]
$ whoami
xieerqi
Se você deseja executar comandos como outro usuário, não apenas root, você pode usar sudo -u username command
$ sudo -u testuser whoami
testuser
Mesma ideia com su
:
serg@ubuntu[/home/xieerqi]
$ sudo su -c bash testuser
bash: cannot set terminal process group (-1): Inappropriate ioctl for device
bash: no job control in this shell
testuser@anaconda:/home/xieerqi$ whoami
testuser
testuser@anaconda:/home/xieerqi$ exit
exit
serg@ubuntu[/home/xieerqi]
$ whoami
xieerqi
Um logout
em um script não afeta nada, pois logout
só funciona para shells de login e os scripts não são normalmente executados como shells de login.
Parece-me que você está se conectando via SSH (ou algo assim), sendo executado como outro usuário e imediatamente se desconectando. Nesse caso, apenas forneça o script, para que os comandos sejam executados no shell atual. Então, logout
funcionará.
Ou você pode usar exec
, mas, nesse caso, não é logout
que está entrando em vigor - logout
falhará e o final do script simplesmente fará com que ele saia. Distinção sem diferença, suponho.
Ou, se você achar complicado usar . ./script
, defina uma função com chaves:
switchuser () {
echo "test script"
sudo su -
exit
}
Os comandos entre chaves são executados no shell atual e os comandos entre parênteses são executados em um sub-shell. Adicione isto ao seu .bashrc
, então você pode simplesmente fazer:
switchuser