Reinicie o firewall do arquivo bash

2

Eu preciso reiniciar o firewall periodicamente, então criei um arquivo bash para adicioná-lo às tabelas CRON.

No terminal, reinicio o firewall usando o comando:

service firewall restart

mas se eu tiver uma linha semelhante no meu arquivo bash ( myscript.sh ):

#!/bin/sh
service firewall restart

e executá-lo a partir do terminal (como root)

sh myscript.sh

o firewall não está sendo reiniciado.

Qual é a diferença? Como posso reiniciar o serviço de um arquivo bash?

EDITAR

Eu também experimentei estes comandos:

/etc/init.d/firewall stop
/etc/init.d/firewall start

e

/etc/init.d/firewall restart

E também tentou executar o arquivo assim:

/bin/sh myscript.sh

Ainda não está funcionando.

EDITAR Meu script bash está parecendo assim:

#!/bin/sh
if [ some statement ]; then
    /etc/init.d/firewall restart # also tried: eval /etc/init.d/firewall restart
    stat /some/file -c %Y > /root/statfile
    # if I add any statement here it is being executed, so it is not the fault of incorrect if statement
fi
    
por Gacek 10.06.2015 / 12:57

7 respostas

3

O ambiente de cron não é o mesmo que o ambiente do seu shell de login aleatório. O mais provável é que algo em seu ambiente não seja o que seu script de firewall precisa que seja.

Tente verificar /var/mail ou qualquer que seja o seu spool de e-mail. Cron padrão para enviar a saída para o usuário cujo crontab ele executa algo, mas se você não tiver configurado seu MTA você não verá essa saída. Se a saída encontrada não for esclarecedora, tente adicionar set -x à parte superior do seu script e / ou adicione o comando env (sem argumentos) e compare a saída com a saída do mesmo comando quando executado a partir do seu concha.

Se tudo isso falhar, poste a saída e o script completo (não o edite - só porque você acha que está tudo bem, não significa que é, e você não pode esperar ajuda se você perdeu informações).

    
por 24.06.2015 / 22:42
1

O que você pretende com some statement

Extrair

if [ some statement ]; then ...

Isso não faz sentido

    
por 24.06.2015 / 12:09
1

E se você fizer /etc/init.d/firewall restart em vez de service firewall restart ?

Pode ser o caminho.

Lembre-se de torná-lo executável:

chmod +x myscript.sh
    
por 10.06.2015 / 13:02
1

O procedimento de solução de problemas mais sensato seria simplificar o script, de modo que ele reconecte incondicionalmente o firewall. Adicione esse script ao cron e determine se um reinício simples e incondicional está funcionando como esperado.

Assumindo que funciona, adicione sua condição (a parte de [declaração misteriosa]) e tente novamente.

Sem saber que condição você está testando, é difícil para qualquer um dizer por que ele não está funcionando no cron, mas eu apostaria que o problema está dentro dessa declaração if, e alguma suposição que você está fazendo sobre seu env não é verdade para o env do cron.

    
por 25.06.2015 / 01:40
0

O script deve ser chamado usando sudo. Ou por ter outro usuário na conta do grupo do administrador de roda junto com o sudo. Tudo depende de qual distro você está usando com as opções que você pode usar e como usá-las para executar o script com permissões altas o suficiente.

sudo -u [username] -S myscript.sh < password_file.txt

Ao usar uma conta de grupo para permissões de arquivo, você deve incluí-la nas permissões de grupo do arquivo de script (myscript.sh) e estar em um diretório no qual o grupo tenha permissões para acessar. O usuário que está na roda ou em outro grupo deve ser chamado com o script usando a opção -u [usename]. Ao usar a conta de roda, eu não usaria a conta do cron como usuário. Você também precisará adicionar o usuário à lista de sudo. O grupo de rodas foi descontinuado em algumas distros, pois foi provado que é um risco de segurança. Nesse caso, crie um grupo para fins de administração e use esse grupo para permissões de arquivo.

As instruções para adicionar um usuário à lista sudo podem ser encontradas aqui: link ... Use este tutorial como um guia.

Além disso, se você incluir o código stderr e / ou redirecionar o sdtout para um arquivo de texto em seu script, ele terá uma idéia de quaisquer problemas ao invocar o script.

Há um grande número de maneiras e técnicas sobre o sudo e usá-lo com segurança. É realmente tudo sobre convenções e políticas de segurança do usuário e / ou empresa.

    
por 22.06.2015 / 23:16
0

Quando você espera que o script seja executado a partir do CRON, você precisa definir o PATH para incluir o local do serviço binário (geralmente localizado em / sbin) (ou), fornecer caminho absoluto como /sbin/service firewall restart

Além disso, você pode compartilhar a saída dos comandos abaixo da sua sessão de terminal:

# which service
# bash -x <your-script-to-restart-fw>
# strace -e process -f bash -x <your-script-to-restart-fw>
    
por 24.06.2015 / 22:22
0

Em seu script, você precisa alterar a primeira linha, o chamado shebang, para% #!/bin/bash
e, em seguida, invocar o script da seguinte maneira:
bash myscript.sh
Bash é um superconjunto de sh e é capaz das mesmas ações e ainda mais ações como sh.

No cronjobs você deve sempre usar o comando bash em vez do comando sh.

    
por 25.06.2015 / 03:36