シェルスクリプトのコマンドに対する権限

シェルスクリプトのコマンドに対する権限

ホストの状態を確認するには、単純なスクリプトを実行する必要があります。

次のスクリプトがあります。

#!/bin/bash
echo "Host checker:"
if [ "`ping -c 1 172.17.10.1`" ]
then
  echo "HOST UP"
else
  echo "HOST DOWN"
fi

次の権限:

-rwxrwxrwx  1 sysadmin users   142 Jul 13 16:14 lgchk.sh

Bashでpingを実行すると、すべてがうまく動作します。

sysadmin@host:~$ ping 172.17.10.1
PING 172.17.10.1 (172.17.10.1) 56(84) bytes of data.
64 bytes from 172.17.10.1: icmp_seq=1 ttl=64 time=0.159 ms
64 bytes from 172.17.10.1: icmp_seq=2 ttl=64 time=0.186 ms
64 bytes from 172.17.10.1: icmp_seq=3 ttl=64 time=0.203 ms

ただし、スクリプトを実行するとエラーが発生します。

sysadmin@host:~$ ./lgchk.sh
Host checker:
ping: icmp open socket: Operation not permitted
HOST DOWN

次のスクリプトでpingを実行すると:

...
if [ "`su -u sysadmin ping -c 1 172.17.10.1`" ]
...

すべてが大丈夫ですが、パスワードを求めるメッセージが表示されます。

なぜこれが起こるのか、そして解決策を提案することができますか?スクリプト内のコマンドに対する権限はコマンドラインの権限と異なりますか?

答え1

sudoを使ってみましたか?

if sudo -u sysadmin  /bin/ping -c ...

/etc/sudoersをrootとして編集する必要があります。

%g1 ALL=(sysadmin) NOPASSWD:  /bin/ping

複数の人がg1pingコマンドを実行できるようにします。

man sudoman sudoersおよびhttps://askubuntu.com/questions/192050/how-to-run-sudo-command-with-no-passwordもっと学ぶ。

答え2

ping実行ファイルにSUIDビットがありません。走るとき

ls -l $(which ping)

次の内容が表示されます。

-rwsr-xr-x 1 root root 38200 Jul 23  2015 /bin/ping

s行の先頭に4番目の文字に対する権限がない可能性があります。解決策は簡単です。実行コマンド:

chmod u+s `which ping`

ルートとして使用またはsu使用sudo

関連情報