2016-12-01 16:01:00 weixin_34050519 阅读数 20
  • Linux应用软件服务篇-五剑客

    第一章节讲解主流的 Vsftp服务器如何通过服务端与客户端实现文件资源共享,讲解了Vsftp之间三种用户在不同的配置方法对不同的目录文件资源限制访问,达到更安全高效的资源共享数据传输。 第二章节讲解企业级NTP时间服务器对公司内网所有客户机及服务器批量实现时间同步,多个节点如何去快速同步主服务器时间。  第三章节讲解 NFS服务器实现与客户机磁盘文件的共享,通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,重点讲解了通过客户端远程挂载服务器磁盘共享文件及如何使用指定用户去访问指定的共享文件夹数据。 第四章节讲解samba服务器在企业中,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源,重点介绍了通过 samba配置文件权限配置去对匿名文件夹及指定用户文件夹共享资源服务。 第五章节介绍了去部署 DHCP服务器对批量客户端实现自动获取IP,通过配置文件IP池获取到IP形式,及绑定客户端Mac地址及指定IP给予客户端,从而获得IP方法。

    187 人正在学习 去看看 吴光科

【TOC】

Linux访问权限

Linux用户和用户组

查看当前用户用命令who am i
用命令id username可以显示指定用户的用户id、用户组id(GID)、和所属附加群组的信息。

所有的用户组包含在文件/etc/group

/etc/group详细信息

/etc/group的内容包括用户组名称、用户组口令、GID和该组包含的所用用户,每条记录的格式:
group_name:passwd:GID:userList

用户列表的每个用户之间用“,”号分割

chown user_name:group_name file用于改变指定文件的访问者

参考链接:http://blog.chinaunix.net/uid-20691565-id-3431963.html

用户和群组的权限

文件包含三类操作者,用户、群组和其他用户,可以给对应的用户、群组和其他用户分配对指定文件的操作权限。
分配文件的操作权限可以使用命令chmod 755 file

2012-03-05 09:09:18 rosetta 阅读数 6549
  • Linux应用软件服务篇-五剑客

    第一章节讲解主流的 Vsftp服务器如何通过服务端与客户端实现文件资源共享,讲解了Vsftp之间三种用户在不同的配置方法对不同的目录文件资源限制访问,达到更安全高效的资源共享数据传输。 第二章节讲解企业级NTP时间服务器对公司内网所有客户机及服务器批量实现时间同步,多个节点如何去快速同步主服务器时间。  第三章节讲解 NFS服务器实现与客户机磁盘文件的共享,通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,重点讲解了通过客户端远程挂载服务器磁盘共享文件及如何使用指定用户去访问指定的共享文件夹数据。 第四章节讲解samba服务器在企业中,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源,重点介绍了通过 samba配置文件权限配置去对匿名文件夹及指定用户文件夹共享资源服务。 第五章节介绍了去部署 DHCP服务器对批量客户端实现自动获取IP,通过配置文件IP池获取到IP形式,及绑定客户端Mac地址及指定IP给予客户端,从而获得IP方法。

    187 人正在学习 去看看 吴光科
    一直以root登陆使用linux的人来说很少有权限被拒这种概念,但某些时候又深受权限拒绝困扰。
知道为什么很多程序中需要使用getuid(),setuid()?为什么以普通权限登陆的用户不能进入/root,为什么在/目录下执行ls -l后可以显示root的信息,但ls /root -al却是权限不够?为什么有些文件夹可以继续创建文件,但就是不能ls?等等,相信看了此文就能明白。
主要是学习笔记,不足之处请指正。

[root@xxx/]# lsb_release -a
LSB Version:    :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description:    CentOS release 5.4 (Final)
Release:        5.4
Codename:       Final

一、口令文件
1,格式
  存储文件/etc/passwd,格式如下:
  root:x:0:0:root:/root:/bin/bash
  aaa:x:501:501:bj, bj, 8111111,136000111:/home/aaa:/bin/bash
  用户名:加密密码:用户ID:组ID:注释:工作目录:shell:

  默认情况是第一行的格式;注释字段可以自行修改,用逗号隔开,如第二行格式,这主要是给finger命令使用时可解析。
  可以vi /etc/passwd修改,但为了保证其格式的正确性,请用vipw命令编译此文件。

  sh-3.2# finger aaa
  Login: aaa                              Name: bj
  Directory: /home/aaa                    Shell: /bin/bash
  Office:  bj,  8111111                   Home Phone: 136000111
  Never logged in.
  No mail.
  No Plan.

2,编程实例
 
/*getpwnam_pwuid.c*/
  #include <pwd.h>
  #include <stdlib.h>
  #include <stdio.h>
 
  int main(void)
  {
      //struct passwd *pwd = getpwnam("aaa");
      struct passwd *pwd = getpwuid(501);
      if(pwd == NULL)
      {
          printf("err.\n");
          return 1;
      }
 
      printf("name:%s\n", pwd->pw_name);
      printf("passwd:%s\n", pwd->pw_passwd);
      printf("description:%s\n", pwd->pw_gecos);
      printf("uid:%d\n", pwd->pw_uid);
      printf("gid:%d\n", pwd->pw_gid);
      printf("dir:%s\n", pwd->pw_dir);
      printf("shell:%s\n", pwd->pw_shell);
 
      return 0;
  }

sh-3.2# gcc getpwnam_pwuid.c -o app
  sh-3.2# ./app
  name:aaa
  passwd:x
  description:bj, bj, 8111111,136000111
  uid:501
  gid:501
  dir:/home/aaa
  shell:/bin/bash

二、组文件
1,格式
  存储文件/etc/group,格式如下
  root:x:0:root
  bin:x:1:root,bin,daemon
  aaa:x:501:

  组名:加密密码:组ID:指向的各用户名

2,改变文件uid和gid.

  sh-3.2# pwd
    /root/study
  sh-3.2# ls -al
    -rw-r--r--  1 root root      397 10-11 03:23 test.c

  chgrp 改变所属组ID,当然只有root权限才可以修改。
 
  sh-3.2# chgrp aaa test.c
  sh-3.2# ls -al
    -rw-r--r--  1 root aaa       397 10-11 03:23 test.c

  这个aaa就是新组名,其在/etc/group中,可以通过adduser aaa自行添加
  sh-3.2# cat /etc/group
    root:x:0:root
    bin:x:1:root,bin,daemon
    daemon:x:2:root,bin,daemon
    .
    .
    .
    gdm:x:42:
    sabayon:x:86:
    plmtest:x:500:
    aaa:x:501:

  chown 改变用户ID或组ID
  sh-3.2# chown aaa:aaa test.c
  sh-3.2# ls -al
    -rw-r--r--  1 aaa  aaa       397 10-11 03:23 test.c

3,编程实例
  /*getgrnam.c*/
  #include <grp.h>
  #include <stdio.h>
 
  int main(int argc, char *argv[])
  {
      if(argv[1] == NULL)
      {
          printf("input error.\n");
          return 1;
      }
 
      struct group *gp = getgrnam(argv[1]);
      if(gp == NULL)
      {
          printf("err.\n");
          return 1;
      }
 
      printf("name:%s\n", gp->gr_name);
      printf("psswd:%s\n", gp->gr_passwd);
      printf("gid:%d\n", gp->gr_gid);
 
      int i;
      for(i = 0; gp->gr_mem[i] != NULL; i++)
      {
          printf("group name:%s\n", gp->gr_mem[i]);
      }
 
 
      return 0;
  }
  sh-3.2# gcc getgrnam.c -o app
  sh-3.2# ./app bin
  name:bin
  psswd:x
  gid:1
  group name:root
  group name:bin
  group name:daemon


4,文件权限
  不细讲了
  sh-3.2# ls -al
  总计 483984
  drwxr-x--- 13 root  root       4096 02-22 00:01 .
  drwxr-xr-x 32 root  root       4096 02-21 21:15 ..
  -rw-r--r--  1 root  root  464023491 10-25 22:33 3.3.005-080425.tgz
  -rw-------  1 root  root       9346 02-21 23:16 .bash_history
  -rw-r--r--  1 root  root         24 2007-01-06 .bash_logout
  -rw-r--r--  1 root  root        191 2007-01-06 .bash_profile
  -rw-r--r--  1 root  root        176 2007-01-06 .bashrc
  drwxrwxrwx 10  1000 users      4096 08-23 20:16 cflow-1.3
  -rw-r--r--  1 root  root     759691 08-23 20:13 cflow.tar.gz
  -rw-r--r--  1 root  root        100 2007-01-06 .cshrc
  -rwxr-xr-x  1 root  root        582 11-11 21:48 delete_M.sh
  -rw-r--r--  1 root  root       2518 11-11 20:25 .dir_colors


  主要是最左边一列:drwxr-x---
  10个字符,最左边是文件类型,-默认为普通文件;d:目录文件;l符号链接……
  后面9个,3个一组共三组,分别表示所属用户uid的权限;所属组或者附属组gid的权限;其它权限。
  三个字符分别是读、写、执行权限
  读4,写2, 执行1

  所以chmod 777 test.c,提升到读、写、执行权限。


5,组权限操作实例
  此节演示相同组的成员之间共享资源,即不同uid但相同gid的用户共享同一组的资源。
 
  为了方便起见,我同时开了两个终端。
  "sh-3.2#"以root权限登陆的shell /bin/sh
  "[testa@xxx root]"以testa用户登陆的shell


注:下文提到的“用户”是指/etc/passwd里定义的通过终端登陆的用户(此文即以下增加的三个账号名)。

  sh-3.2# useradd testa
  sh-3.2# useradd testb
  sh-3.2# useradd testc

  sh-3.2# tail -f /etc/passwd -n 4
  sabayon:x:86:86:Sabayon user:/home/sabayon:/sbin/nologin
  testa:x:500:500::/home/testa:/bin/bash
  testb:x:501:501::/home/testb:/bin/bash
  testc:x:502:502::/home/testc:/bin/bash


再开一个终端登陆testa,之前那个终端保持。
 
sh-3.2# su testa
  [testa@xxx root]$ id
  uid=500(testa) gid=500(testa) groups=500(testa)
  [testa@xxx home]$ ls -al
  总计 28
  drwxr-xr-x  5 root  root  4096 02-21 22:52 .
  drwxr-xr-x 32 root  root  4096 02-21 21:15 ..
  drwx------  3 testa testa 4096 02-21 22:56 testa
  drwx------  3 testb testb 4096 02-21 22:48 testb
  drwx------  3 testc testc 4096 02-21 22:52 testc

  [testa@xxx home]$ cd testb
  bash: cd: testb: 权限不够

 
  通过root修改testb目录权限为770,即当前uid或者gid相同的用户均有读写执行权限。
 
sh-3.2# cd /home/
  sh-3.2# chmod 770 testb

  [testa@xxx home]$ ls -al
  总计 28
  drwxr-xr-x  5 root  root  4096 02-21 22:52 .
  drwxr-xr-x 32 root  root  4096 02-21 21:15 ..
  drwx------  3 testa testa 4096 02-21 22:56 testa
  drwxrwx---  3 testb testb 4096 02-21 22:48 testb   (here modify)
  drwx------  3 testc testc 4096 02-21 22:52 testc
 
  [testa@xxx home]$ cd testb
  bash: cd: testb: 权限不够
  [testa@xxx root]$ id

  uid=500(testa) gid=500(testa) groups=500(testa)
  此时虽然开放了testb的所属组权限,但用户testa的gid=500(testa) groups=500(testa),它还不属于testb组。

  下面修改testa的gid为testb(或者增加其附属组groups值为testb)

 
sh-3.2# usermod -G testb testa  (增加用户testa的附属组testb)
  sh-3.2# id testa
  uid=500(testa) gid=500(testa) groups=500(testa),501(testb)
 
  此时testa终端需要重新登下,使刚才更改生效
  [testa@xxx root]$ exit
  exit
  [root@xxx ~]# su testa
  [testa@xxx root]$ id
  uid=500(testa) gid=500(testa) groups=500(testa),501(testb)
  [testa@xxx root]$ cd /home/
  [testa@xxx home]$ ls -al
  总计 28
  drwxr-xr-x  5 root  root  4096 02-21 22:52 .
  drwxr-xr-x 32 root  root  4096 02-21 21:15 ..
  drwx------  3 testa testa 4096 02-21 22:56 testa
  drwxrwx---  3 testb testb 4096 02-21 22:48 testb
  drwx------  3 testc testc 4096 02-21 22:52 testc
  [testa@xxx home]$ cd testb
  [testa@xxx testb]$ pwd
  /home/testb

  以上是增加了用户testa的附属组testb,使其对于属于testb组的资源有了访问权限。

  下面再使用newgrp切换用户testa的gid.
 
[testa@xxx testb]$ id
  uid=500(testa) gid=500(testa) groups=500(testa),501(testb)
  [testa@xxx testb]$ newgrp testb
  [testa@xxx testb]$ id
  uid=500(testa) gid=501(testb) groups=500(testa),501(testb)
 
  此时testa用户的gid已改为501(testb).


组之间的关系在文件/etc/group
  sh-3.2# tail -f /etc/group -n 4      
  sabayon:x:86:
  testa:x:500:
  testb:x:501:testa (最后一列:组内用户列表。即组testb里包含testa,testa属于testb组,大概就这意思吧...)
  testc:x:502:

 
  虽然知道控制组关系的文件,但不能直接修改些文件,否则执行newgrp时会出现"抱歉"错误提示.


当然root用户权限是无限制的,它访问文件时不需要进行权限检查。


三、相关系统调用
  getuid();
  getgid();
  int setuid(uid_t uid);
  int setgid(gid_t gid);

  只有超级用户或者需要设置的uid和当前用户的uid一致才可以设置,否则返回-1,置errno = EPERM, errno可以通过strerror()翻译。


其它:
[testa@xxx home]$ su testa
[testa@xxx home]$ sudo touch aa

testa is not in the sudoers file.  This incident will be reported.
以root权限vim /etc/sudoers
增加testa ALL=(ALL)   ALL


参考:APUE2E,1.8, 4.4, 8.11

  

2018-07-06 14:20:00 a7921216211 阅读数 12
  • Linux应用软件服务篇-五剑客

    第一章节讲解主流的 Vsftp服务器如何通过服务端与客户端实现文件资源共享,讲解了Vsftp之间三种用户在不同的配置方法对不同的目录文件资源限制访问,达到更安全高效的资源共享数据传输。 第二章节讲解企业级NTP时间服务器对公司内网所有客户机及服务器批量实现时间同步,多个节点如何去快速同步主服务器时间。  第三章节讲解 NFS服务器实现与客户机磁盘文件的共享,通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,重点讲解了通过客户端远程挂载服务器磁盘共享文件及如何使用指定用户去访问指定的共享文件夹数据。 第四章节讲解samba服务器在企业中,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源,重点介绍了通过 samba配置文件权限配置去对匿名文件夹及指定用户文件夹共享资源服务。 第五章节介绍了去部署 DHCP服务器对批量客户端实现自动获取IP,通过配置文件IP池获取到IP形式,及绑定客户端Mac地址及指定IP给予客户端,从而获得IP方法。

    187 人正在学习 去看看 吴光科

经常操作Linux服务器,远程访问会遇到403问题,本篇讲述nginx下文件权限的修改。

1、命令修改该文件夹的权限

  chmod -R 755 /usr/local/....   文件夹的路径

 2、修改nginx的执行权限,第一个适用与单个文件夹的不发生动态生成的新的文件夹是有效的,当业务需要不断在nginx下生成文件夹时,修改一下配置

  vi   nginx.conf     找到第一行#user  ****;     改为:user  root;

3、如果是centos,查看下SELinux是否关闭;

  vi /etc/sbin/sestatus       

  SELinux status: enabled

  setenforce 1;

       保存后需要重新启动服务器。

 

转载于:https://www.cnblogs.com/SnakeBoom/p/9273348.html

2019-05-14 08:54:42 o279642707 阅读数 159
  • Linux应用软件服务篇-五剑客

    第一章节讲解主流的 Vsftp服务器如何通过服务端与客户端实现文件资源共享,讲解了Vsftp之间三种用户在不同的配置方法对不同的目录文件资源限制访问,达到更安全高效的资源共享数据传输。 第二章节讲解企业级NTP时间服务器对公司内网所有客户机及服务器批量实现时间同步,多个节点如何去快速同步主服务器时间。  第三章节讲解 NFS服务器实现与客户机磁盘文件的共享,通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,重点讲解了通过客户端远程挂载服务器磁盘共享文件及如何使用指定用户去访问指定的共享文件夹数据。 第四章节讲解samba服务器在企业中,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源,重点介绍了通过 samba配置文件权限配置去对匿名文件夹及指定用户文件夹共享资源服务。 第五章节介绍了去部署 DHCP服务器对批量客户端实现自动获取IP,通过配置文件IP池获取到IP形式,及绑定客户端Mac地址及指定IP给予客户端,从而获得IP方法。

    187 人正在学习 去看看 吴光科

前言

Android系统是基于linux进行开发的,linux的文件系统是否与Android 系统权限或者动态权限申请中权限有关联。

1.Linux文件访问权限介绍

Linux文件权限采用10位数字进行控制一个文件/文件夹的访问权限,x_xxx_xxx_xxx.

1.1 linux权限
第一位代码文件类型 _,文件类型共有7种,除了 _表示常规文件类型外,还有下面的六种

“d”目录
“l”符号链接
“c”字符专门设备文件
“b”块专门设备文件
“p”先进先出
“s”套接字

1.1 文件访问快速查验表

通过这个表可以直观的看到两种权限的表示方法:字符表示、数字表示.
注:数字表示采用3位八进制表示,如果权限为0777,这里先介绍后三位,首位的0稍后介绍。777表示文件所有者,文件所属组,所有其他用户均可读写执行。l例如_444,则表示文件所属组,所有其他用户均可读,表示的意思和_r _ r r 表示的一样。还有其他组合,随意拼接。

图1.2 权限快速查看表

1.2. 常用操作命令
命令 命令解释 其他
whoami 当前“操作用户”的用户标识
su 切换用户身份
groups 看您属于哪一组
groups 用户标识 daemon 查看其他用户在哪一个组
chown 改变文件所有者 都要一个用户名或组名作参数
chgrp 改变文件组 都要一个用户名或组名作参数
1.3 文件访问权限字符表示方式解释

这里只介绍常用的两种 _,d, _代表文件类型,d 代表目录类型。这里均指的是的首位位置。

普通文件即实际保存数据的地方,其并不具备删除自身的权限:
r:可读取文件的实际内容
w:可编辑、新增、修改该文件的实际内容
x:可被执行

目录文件即保存有目录结构和文件权限:
r:可读取目录结构和权限
w:可更改目录结构列表、新建、删除、重命名、转移子文件、目录
x:表示用户可进入到该目录中

1.4 修改文件权限的方式

Linux系统为了保证访问安全,所有新建的文件以 0222 为默认访问权限。可以使用Umask命令来查看。
当我们在linux系统上访问一个文件提示访问权限不足时,通常会采用
chmod系统命令来提升当前用户访问权限。chmod 带有两个或多个参数:“mode”

 $ chmod +x test.sh  对于用户,组,其他所有人均可以执行
 $ chmod -x test.sh       …均不可执行

还可以针对具体的组改变访问权限,对于“用户”三元组使用 u,对于“组”三元组使用 g,对于“其他/每个人”使用 o:

$ chmod go-w test.sh  对群组和其他用户去掉写权限

Chmod 其他修改权限的方式及首位表示意义解释:

2.Android 文件访问权限介绍

6.0之后Android增加了运行时权限申请,在6.0之前的版本只需要在清单文件中声明需要的权限即可。而6.0之后除了提前声明所需要的访问的权限,在用到该权限的地方,还需要动态授予权限。

2.1 Android 权限规则
  1. Android build 出来的apk默认拥有Debug签名,如果apk不进行签名是无法进行安装到设备或者模拟器上的。
    为什么需要签名?直接给出答案,Android 系统有的权限是基于签名的。

  2. 基于UserID的进程级别的安全机制
    Linux 系统拥有进程保护机制,进程之间是无法相互对应进行的独立空间。Android 通过为每个apk分配一个linux userID来标示不同的进程。名称为"app_"加一个数字,比如app_43不同的UserID,运行在不同的进程,所以apk之间默认便不能相互访问。
    Android提供了如下的一种机制,可以使两个apk打破前面讲的这种壁垒。
    在AndroidManifest.xml中利用sharedUserId属性给不同的package分配相同的userID,通过这样做,两个package可以被当做同一个程序,
    系统会分配给两个程序相同的UserID。当然,基于安全考虑,两个apk需要相同的签名,否则没有验证也就没有意义了。

  3. 默认apk生成的数据对外是不可见的
    实现方法是:Android会为程序存储的数据分配该程序的UserID。
    借助于Linux严格的文件系统访问权限,便实现了apk之间不能相互访问似有数据的机制。
    例:我的应用创建的一个文件,默认权限如下,可以看到只有UserID为app_21的程序才能读写该文件。

-rw------- app_21   app_21      87650 2000-01-01 09:48 test.txt

如何对外开放?

<1> 使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE标记。
When creating a new file with getSharedPreferences(String, int), openFileOutput(String, int), or openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory), you can use the MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE flags to allow any other package to read/write the file. When setting these flags, the file is still owned by your application, but its global read and/or write permissions have been set appropriately so any other application can see it.
  1. AndroidManifest.xml中的显式权限声明
    Android默认应用是没有任何权限去操作其他应用或系统相关特性的,应用在进行某些操作时都需要显式地去申请相应的权限。
    一般以下动作时都需要申请相应的权限:

    android A particular permission may be
    enforced    at a number of places during your program's operation:
    At the time of    a call into the system, to prevent an application
    from executing    certain functions.When starting an activity, to
    prevent applications    from launching activities of other
    applications.Both sending and    receiving broadcasts, to control
    who can receive your broadcast or    who can send a broadcast to
    you.When accessing and operating on a    content provider.Binding or
    starting a service. ```
         在应用安装的时候,package installer会检测该应用请求的权限,根据该应用的签名或者提示用户来分配相应的权限。      在程序运行期间是不检测权限的。如果安装时权限获取失败,那执行就会出错,不会提示用户权限不够。 大多数情况下,权限不足导致的失败会引发一个
    SecurityException,会在系统log(system log)中有相关记录。
    
    
  2. 权限继承/UserID继承
    当我们遇到apk权限不足时,我们有时会考虑写一个linux程序,然后由apk调用它去完成某个它没有权限完成的事情,很遗憾,这种方法是行不通的。
    前面讲过,android权限是在进程层面的,也就是说一个apk应用启动的子进程的权限不可能超越其父进程的权限(即apk的权限),
    即使单独运行某个应用有权限做某事,但如果它是由一个apk调用的,那权限就会被限制。
    实际上,android是通过给子进程分配父进程的UserID实现这一机制的。

2.2 Android 系统常见权限不足分析

普通apk运行在非系统,非root层级,也就是说看要访问的文件权限时,看 x_拥有者__用户组_其他用户,查看linux权限组的后三位权限组的权限,另外存放在system/apk 文件夹下的app拥有的权限高于install apk权限。

  1. log中有明确的提示,权限不足

    这种log中直接提示权限不足的,直接查看清单文件中是否进行了声明。而有的时候即使声明了权限,还是报权限不足,这种情况属于
    Android 系统有一些Api及权限是需要apk具有一定的等级才能运行的。 比如
    SystemClock.setCurrentTimeMillis()修改系统时间,WRITE_SECURE_SETTINGS权限好像都是需要有system级的权限才行。也就是说UserID是system.

  2. log日志中没有报权限不足,但是收到Security Exception提示。这种也是的

    比如:我们常会想读/写一个配置文件或其他一些不是自己创建的文件,常会报java.io.FileNotFoundException错误。系统认为比较重要的文件一般权限设置的也会比较严格,特别是一些很重要的(配置)文件或目录。

    -r–r----- bluetooth bluetooth 935 2010-07-09 20:21 dbus.conf drwxrwx–x system system 2010-07-07 02:05 data
    dbus.conf好像是蓝牙的配置文件,从权限上来看,根本就不可能改动,非bluetooth用户连读的权利都没有。 /data目录下存的是所有程序的私有数据,默认情况下android是不允许普通apk访问/data目录下内容的,通过data目录的权限设置可知,其他用户没有读的权限。
    所以adb普通权限下在data目录下敲ls命令,会得到opendir failed, Permission denied的错误,通过代码file.listfiles()也无法获得data目录下的内容。
    上面两种情况,一般都需要提升apk的权限,目前我所知的apk能提升到的权限就是system(具体方法见:如何使Android应用程序获取系统权限)。

2.3 如何使Android应用程序获取系统权限

2.3.1 方案一
第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:
(1) 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId=“android.uid.system"这个属性。
(2) 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
(3) 使用mm命令来编译,生成的apk就有修改系统时间的权限了
2.3.2 方案二
第二个方法是直接把eclipse编出来的apk用系统的签名文件签名
(1) 加入android:sharedUserId=“android.uid.system"这个属性。
(2) 使用eclipse编译出apk文件。
(3) 使用目标系统的platform密钥来重新给apk文件签名。首先找到密钥文件,在我的Android源码目录中的位置是"build/target/product/security”,下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build/tools/signapk"下,编译后在out/host/linux-x86/framework下,用法为java -jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk”。
加入android:sharedUserId=“android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。
只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。
这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package … has no signatures that match those in shared user android.uid.system”,这样也是保护了系统的安全。

3.怎样使Android apk获取root权限。

一般linux 获取root权限是通过执行su命令,那能不能在apk程序中也同样执行一下该命令呢,我们知道在linux编程中,有exec函数族:

1. int execl(cONst char *path, const char *arg, ...);  
2. int execlp(const char *file, const char *arg, ...);  
3. int execle(const char *path, const char *arg, ..., char *const envp[]);  
4. int execv(const char *path, char *const argv[]);  
5. int execvp(const char *file, char *const argv[]);  
6. int execve(const char *path, char *const argv[], char *const envp[]); 

Android 中Runtime 类型提供了可以执行的程序api我们可以借助 Runtime.getRuntime().exec(String command)访问底层Linux下的程序或脚本,这样就能执行su命令,使apk具有root权限,能够访问系统中需要root权限才能执行的程序或脚本了。

具体例子

1. import java.io.DataInputStream;  
2. import java.io.DataOutputStream;  
3. import java.io.IOException;  
4. import android.app.Activity;  
5. import android.os.Bundle;  
6. import android.util.Log;  
7. public class VisitRootfileActivity extends Activity {  
8.     private static final String TAG = "VisitRootfileActivity";  
9.     Process process = null;  
10.     Process process1 = null;     
11.     DataOutputStream os = null;  
12.     DataInputStream is = null;  
13.     /** Called when the activity is first created. */  
14.     @Override  
15.     public void onCreate(Bundle savedInstanceState) {  
16.         super.onCreate(savedInstanceState);  
17.         setContentView(R.layout.main);  
18.         try {  
19.             process = Runtime.getRuntime().exec("/system/xbin/su"); /*这里可能需要修改su 
20.                        的源代码 (注掉  if (myuid != AID_ROOT && myuid != AID_SHELL) {*/  
21.   
22.             os = new DataOutputStream(process.getOutputStream());  
23.             is = new DataInputStream(process.getInputStream());  
24.             os.writeBytes("/system/bin/ls" + " \n");  //这里可以执行具有root 权限的程序了    
25.               os.writeBytes(" exit \n");  
26.             os.flush();  
27.             process.waitFor();  
28.         } catch (Exception e) {              
29.             Log.e(TAG, "Unexpected error - Here is what I know:" + e.getMessage());  
30.         } finally {  
31.             try {  
32.                 if (os != null) {  
33.                     os.close();  
34.                 }  
35.                 if (is != null) {  
36.                     is.close();  
37.                 }  
38.                 process.destroy();  
39.             } catch (Exception e) {  
40.             }  
41.         }// get the root privileges  
42.     }  
43. }


总结:

Android 中的权限是基于Android apk运行在的进程权限。而linux中的权限针对的是文件/文件夹或者linux系统权限组第一位能表示类型文件的权限。Android权限与linux权限不是同一个层级的权限,Android 只有访问底层linux中文件、文件夹或者linux系统权限组第一位能表示类型文件的时候的权限,才能表示同一个权限。

linux权限表示方式有字符表示方式,数字表示方式,采用10位,除第一个字符,其他位三三一组表示读写执行权限。首位用做特殊表示方式,

引用:
https://www.cnblogs.com/gaoxinzhan/p/4344681.html Linux下su与su -命令的区别
https://blog.csdn.net/fan_zhen_hua/article/details/2050009 linux权限详解
https://blog.csdn.net/weixin_39209728/article/details/79729885 Linux中 drwxr-xr-x.的意思和权限
http://blog.csdn.net/myarrow/article/details/8235306 Android系统权限和root权限
https://blog.csdn.net/happylishang/article/details/53813779 Android权限管理原理(含6.0-4.3)

2015-01-22 22:48:32 sanmao0816 阅读数 563
  • Linux应用软件服务篇-五剑客

    第一章节讲解主流的 Vsftp服务器如何通过服务端与客户端实现文件资源共享,讲解了Vsftp之间三种用户在不同的配置方法对不同的目录文件资源限制访问,达到更安全高效的资源共享数据传输。 第二章节讲解企业级NTP时间服务器对公司内网所有客户机及服务器批量实现时间同步,多个节点如何去快速同步主服务器时间。  第三章节讲解 NFS服务器实现与客户机磁盘文件的共享,通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,重点讲解了通过客户端远程挂载服务器磁盘共享文件及如何使用指定用户去访问指定的共享文件夹数据。 第四章节讲解samba服务器在企业中,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源,重点介绍了通过 samba配置文件权限配置去对匿名文件夹及指定用户文件夹共享资源服务。 第五章节介绍了去部署 DHCP服务器对批量客户端实现自动获取IP,通过配置文件IP池获取到IP形式,及绑定客户端Mac地址及指定IP给予客户端,从而获得IP方法。

    187 人正在学习 去看看 吴光科

所有文件类型都有访问权限。对于st_mode值也包含了对文件的访问权限位。

每个文件有9个访问权限,可将它们分为3类。

st_mode屏蔽

含义

S_IRUSR

用户读

S_IWUSR

用户写

S_IXUSR

用户执行

S_IRGRP

组读

S_IWGRP

组写

S_IXGRP

组执行

S_IROTH

其他读

S_IWOTH

其他写

S_IXOTH

其他执行

chmod命令用于修改这9个权限位,该命令允许我们用u表示用户,用g表示组,用o表示其他。

对以上的3中不同权限以各种方式由不同的函数使用。

1. 我们用名字打开任一类的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行权限。这就是为什么对于目录其执行权限位常被称为收索为的原因。

2. 对于一个文件的读权限决定了我们是否能够打开现有文件进行读操作。这与open函数的O_RDONLY和O_RDWR标识有关。

3. 对于一个文件的写权限决定了我们是否能够打开现有文件进行写操作。这又open函数的O_WRONLY和O_RDWR标志有关。

4. 为了在open函数中对一个文件指定O_TRUNC标志,必须对该文件具有写权限。

5. 为了删除一个现有文件,必须对包含该文件的目录具有写权限和执行权限,对该文件本身则不需要有读、写权限。

6. 如果用7个exec函数中的任何一个执行某个文件,都必须对该文件具有执行权限。该文件还必须是一个普通文件。

Jailkit 限制Linux用户访问权限

博文 来自: cjqpker

Linux文件权限

阅读数 231

Linux权限

阅读数 464

没有更多推荐了,返回首页