ホストの状態を確認するには、単純なスクリプトを実行する必要があります。
次のスクリプトがあります。
#!/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
複数の人がg1
pingコマンドを実行できるようにします。
man sudo
、man 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