Estou executando um script que depende da instalação da rede e de um compartilhamento de rede montado. O script é executado no login (o que acontece automaticamente após a inicialização). O problema é que, no momento em que o script é executado, geralmente eu ainda não tenho um endereço IP (DHCP). No momento, durmo o script por 15 anos, mas não gosto dessa abordagem, pois quero poder dizer ao usuário se algo está errado.
Qual é o meu plano é fazer um loop enquanto eu ainda não tenho um endereço IP e continuar quando tiver. Crucialmente, ele deve expirar após um tempo. O que eu vim com é, if [ ifconfig | grep "192.168.100" ];
mas o que acontece é que o grep consome ];
e não gosta. Então o bash também fica chateado, porque não consegue encontrar o ];
que grep comeu. E então eu nem implementei o tempo limite.
Alguém sugeriu manter uma variável e dormir por, digamos, um segundo em cada iteração e aumentar essa variável a cada vez. Aqui está o meu script completo (que não funciona) (eu sou bastante novo no bash scripting):
x=0
while [ ifconfig | grep "192.168.100." > /dev/null ]; do
echo "no nework"
if "$x" -gt 200; then
#Time out here
exit 1
x=$((x+1))
sleep .1
fi
done
#continue with rest of script...
Qualquer indicação na direção certa seria muito apreciada!
fonte
network-online.target
...grep
saída para/dev/null
. Use a-q
opção. E também não estou pensando em se o ifconfig é uma boa idéia. Por que não usarping
?ping
pode falhar dependendo da rede em questão. É melhor apenas verificar a configuração de execução do sistema.Respostas:
Sintaxe do shell
Você parece estar confuso com relação às condicionais nos scripts de shell. Todo comando shell possui um status de saída, que é um número inteiro entre 0 e 255, com 0 significando sucesso e qualquer outro valor significando falha. Declarações como
if
ewhile
que esperam operandos booleanos inspecionam o status de saída do comando e tratam 0 (sucesso) como verdadeiro e qualquer outro valor (falha) como falso.Por exemplo, o
grep
comando retornará 0 se o padrão for encontrado e 1 se o padrão não for encontrado. assimrepete o loop desde que o padrão
192.168.100.
seja encontrado na saída deifconfig
. Observe que o padrão192.168.100.
corresponde a seqüências de caracteres como192x168 1007
, porque.
em uma expressão regular corresponde a qualquer caractere; Para procurar uma string literal, passe a opção-F
paragrep
. Para inverter a condição, coloque!
na frente.Além disso, no script, você deseja comparar o valor de uma variável com um número. Você usa o
-gt
operador, que faz parte da sintaxe das expressões condicionais compreendidas pelotest
comando. Otest
comando retornará 0 se a expressão condicional for verdadeira e 1 se a expressão condicional for falsa.É habitual usar o nome alternativo
[
para otest
comando. Este nome espera que o comando para terminar com o parâmetro]
. As duas maneiras de escrever este comando são exatamente equivalentes.O Bash também oferece uma terceira maneira de escrever este comando, com a sintaxe especial
[[ … ]]
. Essa sintaxe especial pode suportar mais operadores do que[
, porque[
é um comando comum sujeito às regras de análise usuais, enquanto[[ … ]]
faz parte da sintaxe do shell.Novamente, lembre-se de que
[
é para expressões condicionais , que são uma sintaxe para operadores como-n
,-gt
...[
não significa "valor booleano": qualquer comando tem um valor booleano (status de saída = 0?).Detectando que a rede está ativa
Sua maneira de detectar que a rede está ativa não é robusta. Em particular, observe que seu script será acionado assim que qualquer interface de rede adquirir um endereço IP dentro do intervalo especificado. Em particular, é bem possível que o DNS ainda não esteja ativo nesse momento, sem falar nos compartilhamentos de rede montados.
Você realmente precisa executar esses comandos quando alguém fizer login? É mais fácil executar um comando automaticamente quando a rede é criada. A maneira de fazer isso depende da sua distribuição e se você usa o NetworkManager.
Se você precisar executar esses comandos como parte dos scripts de logon, teste o recurso que realmente precisa, não a presença de um endereço IP. Por exemplo, se você quiser testar se
/net/somenode/somedir
está montado, useSe você tem iniciante ou systemd…
então você pode usá-lo. Por exemplo, com o Upstart , marque seu trabalho como
start on net-device-up eth0
(substituaeth0
pelo nome da interface que fornece a conectividade de rede desejada). Com o Systemd, consulte Causar a execução de um script após o início da rede?fonte
/net/
deveria ser/proc/net
?/net
é um local comum para esses pontos de montagem.Apenas conte a saída de
ip add show
Por exemplo:Em seguida, você pode apenas ramificar o número de linhas retornadas conforme apropriado. Você provavelmente verificaria se era zero e, se for o caso, durma e repita o ciclo.
Código não testado para ilustração:
fonte
Ping retornará uma resposta 0 se pelo menos uma tentativa foi bem-sucedida. Você pode considerar executar ping no servidor ao qual está se conectando até que seja bem-sucedido.
fonte