获取由于遍历目录不可执行而拒绝权限的原因

时间:2016-04-02 04:30:45

标签: linux permissions file-permissions directory-traversal

我有一个用户/a/b可读的文件A。但/a A未提供/a/b的可执行权限,因此路径/a无法遍历java.lang.NullPointerException: Attempt to invoke virtual method 'void com.mapbox.mapboxsdk.maps.MapView.onResume()' on a null object reference。对于任意长的路径,如何确定由于用户无法访问中间路径而无法访问给定路径的原因?

4 个答案:

答案 0 :(得分:2)

手动解析树并将错误精确定位到单行的替代答案将是使用namei工具。

namei -mo a/b/c/d
f: a/b/c/d
 drwxrw-rw- rasjani rasjani a
 drw-rwxr-x rasjani rasjani b
                        c - No such file or directory

这将显示整个树结构和权限,直到拒绝权限的条目。

答案 1 :(得分:1)

像这样:

#!/bin/bash
PAR=${1}
PAR=${PAR:="."}
if ! [[ "${PAR:0:1}" == / || "${PAR:0:2}" == ~[/a-z] ]]
then
  TMP=`pwd`
  PAR=$(dirname ${TMP}/${PAR})
fi

cd $PAR 2> /dev/null
if [ $? -eq 1 ]; then
  while [ ! -z "$PAR" ]; do
    PREV=$(readlink -f ${PAR})
    TMP=$(echo ${PAR}|awk -F\/ '{$NF=""}'1|tr ' ' \/)
    PAR=${TMP%/}
    cd ${PAR} 2>/dev/null
    if [ $? -eq 0 ]; then
      if [ -e ${PREV} ]; then
        ls -ld ${PREV}
      fi
      exit
    fi
  done
fi

丑陋但它会完成工作..

所以这个想法基本上是一个参数$ 1,如果它不是绝对目录,将它扩展为这样,然后删除路径的最后一个元素并尝试cd进去,如果它失败,rince并重复..如果它工作,PREV将保留用户无法进入的最后一个目录,所以打印出来..

答案 2 :(得分:1)

这是我扔在一起的东西。在写这篇文章之前,我实际上没有看过rasjani的答案,但它使用相同的概念来获取命令的退出状态。基本上它遍历所有目录(从链中开始最远)并尝试它们。如果退出状态为0,则ls成功,并打印出它无法ls的最后一个目录(我不确定某些内容会发生什么边缘情况,例如你无法访问任何东西):

ls

我喜欢把这样的东西放在一条线上,只是为了好玩:

LAST=/a/b
while [ ! -z "$LAST" ] ; do
    NEXT=`echo "$LAST" | sed 's/[^\/]*$//' | sed 's/\/$//'`
    ls "$NEXT" 2> /dev/null > /dev/null
    if [ $? -eq 0 ] ; then 
        echo "Can't access: $LAST"
        break
    fi
    LAST="$NEXT"
done

答案 3 :(得分:1)

我为你做了以下的C程序。以下是步骤

  1. 将程序复制并保存为file.c。
  2. 使用gcc file.c -o file
  3. 编译程序
  4. 以./file PATH
  5. 执行

    假设您的路径为/ a / b / c / d且您没有“c'”的权限。然后输出

      Given Path = /a/b/c/d
    
      No permission on = /a/b/c
    

    我是否依赖" EACCES"错误。路径长度假定为1024.

    如果您有任何疑问,请分享。

      #include <stdio.h>
      #include <string.h>
      #include <errno.h>
    
      #define MAX_LEN 1024
    
      int main(int argc, char *argv[])
      {
        char path[MAX_LEN] = "/home/sudhansu/Test";
        int i = 0;
        char parse[MAX_LEN] = "";
    
        if(argc == 2)
        {
          strcpy(path, argv[1]);
          printf("\n\t\t Given Path = %s\n", path);
        }
        else
        {
          printf("\n\t\t Usage : ./file PATH\n\n");
          return 0;
        }
    
        if(path[strlen(path)-1] != '/')
          strcat(path, "/");
    
        path[strlen(path)] = '\0';
    
        while(path[i])
        {
          if(path[i] == '/')
          {
            strncpy(parse, path, i+1);
            if(chdir(parse) < 0)
            {
              if(errno == EACCES)
              {
                printf("\t\t No permission on = [%s]\n", parse);
                break;
              }
            }
          }
    
          parse[i] = path[i];
          i++;
        }
    
        printf("\n");
        return 0;
      }
    

    此致 Sudhansu