Como executo um script bash que requer privilégios de root?

15

Eu tenho estas linhas de script do meu ISP:

sudo bash
echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Funciona se eu colar linha por linha no Terminal. Quero criar um arquivo * .command e executá-lo clicando duas vezes. Mas tudo o que recebo é o prompt de senha e a janela vazia do bash. O arquivo "opções" resultante está vazio.

Eu tentei isso:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Eu recebo:

/ etc / ppp / options: permissão negada

Eu acho que preciso usar algum comando para obter privilégios de root de dentro do bash.

Dmitriy
fonte
Quando você criou seu script, você o executou digitando sudo ./ispscript.command? Além disso, os scripts do bash geralmente possuem um sufixo .sh: ipscript.sh.
Aaron Lake
1
Para sua informação, este script só precisa ser executado uma vez. Além disso, se você continuar executando o script como está, ele será ANEXADO >> ao arquivo. O arquivo de opções continuará a crescer em tamanho quanto mais você o executar (o script). Isso pode ou não causar problemas no que está lendo o arquivo de opções.
Dhempler
@ dennis.hempler, obrigado, eu sei disso. Na verdade, executarei esse script com frequência. Como o dispositivo de modem USB precisa que esse arquivo esteja em branco para funcionar corretamente. Portanto, antes de inserir o modem USB, apago o arquivo e, antes de conectar à Internet com fio, escrevo essas opções no arquivo.
Dmitriy

Respostas:

15

Pegue o script que você criou:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

Salve-o no diretório inicial ou em um diretório 'scripts' dentro do diretório inicial, como l2tp.sh. Permita que seja executado (escreva este comando no Terminal):

chmod 700 ~/path/to/l2tp.sh

Para executar o arquivo usando o sudo (privilégios de root):

Método 1. No tipo de terminal:

$ sudo ~/path/to/l2tp.sh

Método # 2. Crie um arquivo run_l2tp.command com este conteúdo:

sudo ~/path/to/l2tp.sh

Permita que seja executado:

chmod u+x run_l2tp.command

Quando você clica duas vezes em run_l2tp.command e insere a senha, o arquivo l2tp.sh será executado com privilégios de root.

Algumas notas:

  • Em sistemas como UNIX, ~ é a abreviação de "meu diretório pessoal".
  • O Chmod 700 tornará o arquivo executável somente por você. Para mais informações: consulte esta página da Wikipedia .
  • digitando 'sudo' antes que um comando execute o programa usando privilégios de root. Tenha cuidado ao fazer isso, coisas ruins podem acontecer se você não tiver certeza do que está fazendo.
  • Obviamente, você pode omitir o / path / para se você salvou esse script diretamente no seu diretório pessoal.
Aaron Lake
fonte
4

Guarde isso:

#!/bin/bash

echo "plugin L2TP.ppp">>/etc/ppp/options 
echo "l2tpnoipsec">>/etc/ppp/options

para a área de trabalho em um arquivo chamado script.sh.

Abra uma janela do Terminal e digite:

sudo bash ~/Desktop/script.sh

Digite sua senha quando solicitado e todos os comandos no arquivo serão executados com privilégios de superusuário.

Ian C.
fonte
4

Se, por motivos de segurança, você não deseja que nenhum usuário do sistema possa executar o script, mas deseja que seja solicitada uma senha administrativa, uma solução alternativa seria salvar o script de shell e usar o programa AppleScript Editor para criar um AppleScript.

O AppleScript seria uma frase, dizendo do shell script «your script's name here» with administrator privileges. Salve esse script como um aplicativo. Então, quando você clica nele, solicita uma senha de administrador e, em seguida, executa o script de shell com privilégios de administrador.

Obviamente, substitua «your script's name here»pelo caminho do seu script.

Daniel
fonte
2

O problema é que quando você fazê-lo a partir da linha de comando, o que você está fazendo está começando bashsob sudoe, em seguida, enviar esses próximos dois comandos para bash, não o shell originais. (o sinal é que você precisa exitduas vezes)

Quando você faz isso em um script, o bashcomando nunca sai, portanto, os próximos dois comandos nunca são executados.

Não é tão elegante quanto a solução AppleScript, mas se você fizer isso como um script na linha de comando, o equivalente seria:

#!/bin/sh --
sudo bash -c 'echo "plugin L2TP.ppp">>/etc/ppp/options' 
sudo bash -c 'echo "l2tpnoipsec">>/etc/ppp/options'

Se não precisássemos do redirecionamento io (o >>bit), poderíamos simplesmente chamar o comando diretamente via sudosem precisar do sudo sh -ctruque. (e observe que eu tive que citar o argumento para sh -cimpedir que ele execute o eco como raiz, mas o arquivo anexado como usuário original.)

Ele vai funcionar como um .commandarquivo a partir do Finder, mas vai abrir uma janela de terminal, pedindo sua senha, e se digitado corretamente, vai executar os comandos. (supondo que você não tenha se autenticado recentemente por sudo... se tiver, ele será executado sem avisar)

Joe
fonte