「ここでスクリプトを実行してください」

「ここでスクリプトを実行してください」

ある時点で、ディレクトリのすべての内容を一覧表示し、そのディレクトリから一部のコンテンツを収集する必要があるスクリプトを作成しようとしています。 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/*/少なくとも1つがオンライン(無視)かどうかを示すかどうかを確認したいようです*/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、オペレータがオンラインの場合はデータがないか、少なくともデータがないことです1

上記のループ(使用)は、readaが見つかるまで各ファイルの最初の行だけを読み取ります。carrier1


コードの問題はコマンドの置き換えです$(/sys/class/net/*)。これは、一致する最初のファイル名をコマンドとして実行し、別の一致するファイル名を引数として実行しようとします。

また、テストは[ $OnLine ]空でない限り「真」です。$OnLine演算子がオンラインでない場合、解析したファイルに何が含まれているのかわかりませんが、ここではゼロでも「真」と見なされます。

答え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

「ここでスクリプトを実行してください」

関連情報