Estou tentando escrever um script e em algum momento precisei listar todas as coisas em um diretório e grep algo desse diretório. Eu não posso fazer isso com ls. ls não é meu cara para fazer isso. Então, tentei fazer o trabalho de ls com o comando echo, mas agora está me dando um erro de permissão negada. Você pode ver o script abaixo:
#!/bin/sh
# Test for network connection
for interface in $(echo $(/sys/class/net/*) | grep -v lo);
do
if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
OnLine=1;
fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
exit;
fi
E estou recebendo este erro:
./carriercontrol.sh: line 10: /sys/class/net/apcli0: Permission denied
O que posso fazer para concluir este script? Existe uma maneira de obter a listagem de um diretório e canalizá-lo com algo. Além disso, até eu poderia me livrar dessa permissão, então acho que o echo causará mais problemas para mim.
EDIT: Tentei substituir echo por find command , aqui estão os resultados e erros.
#!/bin/sh
# Test for network conection
for interface in $(find /sys/class/net -mindepth 1 | grep -v lo);
do
if [ "$(cat /sys/class/net/"$interface"/carrier)" = 1 ]; then
OnLine=1;
fi
done
if ! [ $OnLine ]; then echo "Not Online" > /dev/stderr;
exit;
fi
cat: can't open '/sys/class/net//sys/class/net/ra0/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/eth0/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/br-lan/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/eth0.1/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/apcli1/carrier': No such file or directory
cat: can't open '/sys/class/net//sys/class/net/apcli0/carrier': No such file or directory
Você parece querer consultar os
carrier
arquivos abaixo/sys/class/net/*/
para ver se há pelo menos um que indique se você está online ou não (ignorando*/lo/carrier
).Com um loop de shell:
Usando
bash
:Ou, como um
bash
"quase um forro"Este último assume que os arquivos possuem um único dígito
1
se essa operadora estiver online e que não há dados, ou pelo menos não1
, se não estiver.Os loops acima (usando
read
) lerão apenas a primeira linha de cadacarrier
arquivo até que a1
seja encontrado.O problema em seu código é a substituição de comando
$(/sys/class/net/*)
que tentará executar o primeiro nome de arquivo correspondente como um comando com os outros nomes de arquivo correspondentes como argumentos.Além disso, o teste
[ $OnLine ]
seria "verdadeiro" sempre que$OnLine
não fosse vazio. Não tenho certeza do que os arquivos que você analisa contêm se a operadora não estiver on-line, mas mesmo um zero seria considerado "verdadeiro" aqui.Que tal esses one-liners. ou seja,
grep
exclui especificamente o loopback.GNU grep
Nota: requer GNU
grep
datado de março de 2001 ou posterior . Especificamente, não funciona no BusyBoxgrep
incluído no OpenWRT.Solução adequada para versões GNU grep mais antigas e não GNU grep
por exemplo, versões BusyBox.
você pode tentar executar o script acima no modo sudo
$ sudo su
"execute seu script aqui"