Su e Sudo em um script de concha
Pergunta
Há um script de shell (/bin/sh, não bash) que requer permissões de raiz para execução.
Se for executado por um usuário normal, ele deve pedir ao usuário uma senha para obter acesso root e se reexugar.
Agora ele usa o seguinte código:
if [ $(id -u) -ne 0 ]; then su root -- $0 $@ ; ... fi
Isso funciona bem, mas há algum sistema operacional como o Ubuntu que não possui senha raiz. Por outro lado, muitos sistemas usam sudo para permissões de raiz.
A questão é: como o script pode detectar se deve usar su
ou sudo
sem pedir ao usuário que insira muitas senhas (por exemplo, digite sudo
senha, se falhar - execute su
).
Solução
Não há uma maneira à prova de balas de fazer isso, porque qualquer distribuição pode colocar arquivos da maneira que desejar. Debian e Ubuntu costumam colocar arquivos do sistema em diretórios que não sejam Red Hat, por exemplo. É muito mais fácil personalizar o script para o sistema operacional em que está instalado.
Outras dicas
Não deveria. Se o script exigir privilégios de raiz, ele deve ser executado como root. É da conta do usuário como ele vai conseguir isso - usando SU, SUDO ou algum outro mecanismo.
Se você está preocupado com problemas de segurança e não deseja fazer de tudo, desde a raiz, pode soltar privilégios de raiz para essas partes.
Você pode configurar a conta para não precisar de uma senha para sudo em /etc /sudoers:
yourusername ALL=(ALL) NOPASSWD: ALL
Se você não quiser fazer isso, poderá forçá -los a executar o script como raiz. Adicione algo assim ao topo do seu script de shell:
if [ "$UID" -ne 0 ]; then
echo "You must be root to run this script"
exit 1
fi
Dessa forma, o usuário pode ser root, mas escolher (SU ou SUDO).
Crie mais um arquivo .sh deste arquivo, ligue para o seu original .sh
arquivo como -
su - oracle /u01/enlightics/Enlightiks/UploadFTP/ExportScript2.sh
Verifique se sudo
IST instalado
SU='su'
which sudo > /dev/null && SU='sudo'
Embora isso não responda completamente à sua pergunta, vale a pena notar que você pode verificar se o pacote sudo está instalado usando o seguinte:
Sistemas baseados em Debian:
dpkg -s sudo
Sistemas baseados em RPM:
rpm -q sudo