"여기서 스크립트를 실행하세요"

"여기서 스크립트를 실행하세요"

어느 시점에서 디렉토리의 모든 내용을 나열하고 해당 디렉토리에서 일부 콘텐츠를 수집해야 하는 스크립트를 작성하려고 합니다. ls로는 할 수 없어요. 나는 내가 되어야 할 사람이 아니다. 그래서 echo 명령을 사용하여 ls 작업을 수행하려고 시도했지만 이제 권한 거부 오류가 표시됩니다. 아래 스크립트를 볼 수 있습니다.

#!/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

다음 오류가 발생합니다.

./carriercontrol.sh: line 10: /sys/class/net/apcli0: Permission denied

이 스크립트를 완료하려면 어떻게 해야 합니까? 디렉토리 목록을 가져와서 파이프로 연결하는 방법이 있습니까? 그리고 해당 권한을 제거할 수 있더라도 에코로 인해 더 많은 문제가 발생할 것이라고 생각합니다.

편집하다: echo를 find 명령으로 바꾸려고했는데 이것이 결과이자 오류입니다.

#!/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

답변1

carrier아래 파일을 쿼리하여 /sys/class/net/*/적어도 하나가 온라인 상태(무시됨)인지 여부를 나타내는지 확인 하려는 것 같습니다 */lo/carrier.

쉘 루프를 사용하십시오:

#!/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

사용 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

또는 bash"거의 한 줄짜리" 로

#!/bin/bash

shopt -s extglob

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

마지막 가정은, 운영자가 온라인이면 파일에 한 자리 숫자가 포함되고 1, 운영자가 온라인이면 데이터가 없거나 최소한 데이터가 없다는 것입니다 1.

위의 루프(사용)는 reada를 찾을 때까지 각 파일의 첫 번째 줄만 읽습니다.carrier1


코드의 문제는 명령 대체입니다 $(/sys/class/net/*). 이는 일치하는 첫 번째 파일 이름을 명령으로 실행하고 다른 일치하는 파일 이름을 인수로 실행하려고 시도합니다.

또한 테스트는 [ $OnLine ]비어 있지 않은 한 "true"입니다. $OnLine연산자가 온라인이 아닌 경우 구문 분석한 파일에 무엇이 포함되어 있는지 잘 모르겠지만 여기서는 0이라도 "참"으로 간주됩니다.

답변2

이 단 하나의 라이너는 어떻습니까? 즉, grep루프백이 명시적으로 제외되었습니다.

GNU grep

참고: GNU가 필요합니다.grep 2001년 3월 이후. 특히 grepOpenWRT와 함께 번들로 제공되는 BusyBox 에는 적용되지 않습니다 .

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

이전 GNU grep 버전 및 비 GNU grep을 위한 솔루션

예를 들어 BusyBox 버전입니다.

grep -x 1 /dev/null /sys/class/net/*/carrier|grep -qv /lo/ || ! echo 'not online' >&2

답변3

sudo 모드에서 위 스크립트를 실행해 볼 수 있습니다.

$sudosu

"여기서 스크립트를 실행하세요"

관련 정보