プレイヤーズ・ハイ

 雑多な日記

あるディレクトリー配下にあるすべてのシンボリックリンクとそのリンク先の所有者を比較する

以下のシェルスクリプトでサクっと調べることができます。

使い方

$ sh check_owner_symlink_and_entity.sh ターゲットディレクトリー

$ sh check_owner_symlink_and_entity.sh /var/www/html

check_owner_symlink_and_entity.sh

#!/bin/sh

set -u

TARGET_DIR=$1

find ${TARGET_DIR} -type l > list

while read LINE
do
  TMP_ENTITY=`ls -l ${LINE} | cut -d '>' -f2 | sed 's/ //g'`

  ls -l ${TMP_ENTITY} > /dev/null 2>&1
  if [ ${?} != 0 ]; then
    ENTITY_PREFIX=${LINE%/*}
    ENTITY=${ENTITY_PREFIX}/${TMP_ENTITY}
  else
    ENTITY=${TMP_ENTITY}
  fi

  SYMLINK_OWNER=`ls -l ${LINE} | cut -d ' ' -f3,4`
  if [ -d ${ENTITY} ]; then
    ENTITY_OWNER=`ls -ld ${ENTITY} | cut -d ' ' -f3,4`
    if [ "${SYMLINK_OWNER}" = "${ENTITY_OWNER}" ]; then
      echo 'OK'
    else
      echo "NG  シンボリックリンク ${LINE} とリンク先の所有者が異なります"
    fi
  else
    ENTITY_OWNER=`ls -l ${ENTITY} | cut -d ' ' -f3,4`
    if [ "${SYMLINK_OWNER}" = "${ENTITY_OWNER}" ]; then
      echo 'OK'
    else
      echo "NG  シンボリックリンク ${LINE} とリンク先の所有者が異なります"
    fi
  fi
done < list

rm -f list

exit 0