我有一个用户/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
。对于任意长的路径,如何确定由于用户无法访问中间路径而无法访问给定路径的原因?
答案 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程序。以下是步骤
假设您的路径为/ 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