Echo Permission Denied (Tentando usar o echo em vez do comando ls no shell script)

0

Estou tentando escrever um script e, em algum momento, precisei listar todas as coisas em um diretório e no grep desse diretório. Eu não posso fazer isso com ls. Não é meu cara para fazer isso. Então eu tentei fazer o trabalho de ls com o comando echo, mas está me dando um erro de permissão negada agora. 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 alguma coisa. Além disso, até eu poderia me livrar dessa permissão, então acho que o eco causará mais problemas para mim.

EDITAR: Tentei substituir o eco pelo comando find, aqui estão os resultados e os 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
    
por Ugur Akgul 27.07.2018 / 12:22

3 respostas

4

Você parece querer consultar os arquivos carrier em /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:

#!/bin/sh

online=0
for carrier in /sys/class/net/*/carrier; do
    case "$carrier" in
        */lo/carrier) continue ;;
    esac

    if read online <"$carrier" && [ "$online" -eq 1 ]; then
        break
    fi
done

if [ "$online" -ne 1 ]; then
    echo 'not online' >&2
    exit 1
fi

Usando bash :

#!/bin/bash

shopt -s extglob

online=0
for carrier in /sys/class/net/!(lo)/carrier; do
    if read online <"$carrier" && [ "$online" -eq 1 ]; then
        break
    fi
done

if [ "$online" -ne 1 ]; then
    echo 'not online' >&2
    exit 1
fi

Ou, como um bash "quase um-liner"

#!/bin/bash

shopt -s extglob

grep -qx 1 /sys/class/net/!(lo)/carrier || ! echo not online >&2

Este último pressupõe que os arquivos contêm um único digito 1 se essa operadora estiver on-line e que não há dados, ou pelo menos não 1 , se não estiver.

Os loops acima (usando read ) lerão a primeira linha somente de cada arquivo carrier até que 1 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 arquivos correspondentes como argumentos.

Além disso, o teste [ $OnLine ] seria "verdadeiro" sempre que $OnLine não estiver vazio. Não tenho certeza do que os arquivos que você analisou contêm se a operadora não estiver on-line, mas até mesmo um zero seria considerado "verdadeiro" aqui.

    
por 27.07.2018 / 13:06
1

Como sobre esses one-liners. ou seja, ter grep especificamente excluindo o loopback.

GNU grep

Nota: requer o GNU grep de março de 2001 ou posterior . Especificamente não funciona no BusyBox grep empacotado no OpenWRT.

grep -q --exclude '/sys/class/net/lo/carrier' 1 /sys/class/net/*/carrier || echo "not online" >&2

Solução adequada para versões antigas do GNU grep e não-GNU grep

por exemplo. Versões do BusyBox.

grep -x 1 /dev/null /sys/class/net/*/carrier|grep -qv /lo/ || ! echo 'not online' >&2
    
por 27.07.2018 / 12:44
-3

você pode tentar executar o script acima no modo sudo

$ sudo su

"execute seu script aqui"

    
por 27.07.2018 / 12:58