[RESOLVIDO] Logar-se como root no próprio script .sh

Iniciado por Monster Bass, 02 de Maio de 2010, 19:42

tópico anterior - próximo tópico

Monster Bass

Saudações,

Uso o Ubuntu faz 2 meses e estou adorando. Tenho dois computadores em minha casa, um (o qual eu utilizo) com o Ubuntu instalado e o outro com o Windows XP. Após muitas pesquisas no google, consegui compartilhar conexão ADSL do Ubuntu para o XP através de um tutorial do Morimoto (se quiserem posto o mesmo aqui, com os devidos créditos). Porém, pra compartilhar rede toda vez eu tinha que ir lá e digitar no terminal:

rafael@rafael-desktop:~$ sudo su
rafael@rafael-desktop:~$ ifconfig eth0:0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up
rafael@rafael-desktop:~$ iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE
rafael@rafael-desktop:~$ echo 1 > /proc/sys/net/ipv4/ip_forward
rafael@rafael-desktop:~$ iptables -I INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT


Aí, pensei na idéia de se fazer um script .sh com os comandos acima:

#!/bin/bash
ifconfig eth0:0 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 up
iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -I INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT


O script funciona normalmente quando rodo no terminal como root, mas como eu faço para rodá-lo como root sem ter que entrar no terminal?

raidicar

#1
faz o seguinte:
Supondo que o nome do script seja "compart_net.sh" e que o nome do usuário do sistema seja monsterbass:
1 - copie o script para /usr/bin (EX: sudo cp /home/monsterbass/compart_net.sh /usr/bin)
2 - edite o arquivo /etc/sudoers (sudo gedit /etc/sudoers) .
3 - insira no final do arquivo o seguinte:
monsterbass ALL=NOPASSWD: /usr/bin/compart_net.sh
4 - de o comando sudo chmod +x /usr/bin/compart_net.sh
5 - Clique com o botão direito na barra de menu e selecione "Adicionar ao Painel"
6 - Selecione a opção "Lançador de aplicativo personalizado"
7 - Selecione em tipo de aplicativo a opção "aplicativo de terminal" para que o terminal seja executado junto com o script.
- em comando informe apenas o sudo + nome do script. EX: sudo compart_net.sh ou sudo /usr/bin/compart_net.sh
- em Comentário insira o que faz o script: Compartilha internet.
- Clique no icone do lado esquerdo para selecionar (apenas se quiser) um icone para a aplicação.
Pronto.

Esse acredito ser o jeito mais longo para realizar essa tarefa, mas é mais interessante por que:
1 - Mostra que la no arquivo /etc/sudoers vc pode definir mais aplicações a serem executadas com o sudo sem precisar digitar a senha, Ex:
monsterbass ALL=NOPASSWD: /usr/bin/apt-get
Agora não mais será necessário digitar a senha para dar o comando "sudo apt-get install" ou "sudo apt-get update". Muito cuidado com o sudoers.
2 - Se deixar o script em /usr/bin com permissão de execução dada pelo "chmod", ao entrar no terminal, não precisa navegar até a pasta ou digitar o caminho do script, basta digitar o nome do script e o mesmo será executado. Pode fazer isso de outras formas também, mas eu sou preguiçoso e já uso o diretório /usr/bin para armazenar meus scripts.

Se entendeu tudo, vai perceber que não é necessário copiar o script para usr/bin podendo simplesmente deixa-lo onde está e apenas apontar o diretório correto no sudoers e no atalho a ser criado no painel do gnome. Também pode criar o icone na area de trabalho clicando com o botão direito na tela e selecionando a opção "criar lançador"
Ou seja, a unica coisa importante é: para executar algo como root sem precisar digitar a senha, basta editar o sudoers e inserir:
1 - nome_do_usuario ALL=NOPASSWD: caminho_do_executavel.
2 - Se a aplicação estiver dentro do diretório /usr/bin/ não mais será preciso informar o caminho da aplicação, podendo executa-la de qualquer diretório pelo terminal ou pelo executar do gnome apenas digitando o nome da aplicação.
O resto é só pra encher lingüiça.
Quem ama extremamente, deixa de viver em si e vive no que ama. Na vida três coisas são certas, o amor, a morte e o Linux !
Se Platão disse, então realmente sofremos de uma perigosa doença mental.

Monster Bass

Raidicar, procedi como você disse e funcionou corretamente. Muito obrigado pela ajuda! Um grande abraço!

Azuos

Coloca "(Resolvido)" no título do tópico para as pessoas que estão com o mesmo problema verem e acharem a solução.

fabio2paolini

#4
Apenas para acrescentar uma informação que pode ser útil. O uso do ifconfig em linha de comando para configurar a rede (mesmo que seja através de um script) é mais interessante para uma configuração temporária. Caso a sua configuração seja permantente, ou seja, caso você não precise mudá-la constantemente, então há formas melhores de se configurar.

Uma opção que já deixaria o seu pc configurado no boot seria configurar o arquivo /etc/network/interfaces. Por exemplo acrescentando as linhas


auto eth0:0
iface eth0:0 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
up iptables -t nat -I POSTROUTING -o ppp0 -j MASQUERADE
up iptables -I INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
up echo 1 > /proc/sys/net/ipv4/ip_forward
down iptables -t nat -D POSTROUTING -o ppp0 -j MASQUERADE
down  iptables -D INPUT -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT
down echo 0 > /proc/sys/net/ipv4/ip_forward



Além disso as opções
up echo 1 > /proc/sys/net/ipv4/ip_forward
down echo 0 > /proc/sys/net/ipv4/ip_forward
podem ser dispensadas se o comentário da linha
#net.ipv4.ip_forward=1
do arquivo /etc/sysctl.conf for removido deixando assim
net.ipv4.ip_forward=1
OBS: Não sei se toda versão do Ubuntu possui este arquivo de configuração

Mais uma maneira de configurar a rede no boot seria acrescentar o "caminho" do seu script no final do arquivo /etc/rc.local
e se certificar de que o rc.local esteja definido  como executável, e pronto o scritp será executado no fim a inicialização do sistema.
Para mais informações sobre a configuração do arquivo interfaces, basta "man interfaces".
É isso, espero ter sido útil