Sim, cada aplicativo normalmente possui suas próprias permissões configuradas por meio de "bits de permissão" no aplicativo real. Você pode vê-los se usar o comando ls -l
nos vários executáveis que você está tentando executar.
$ ls -l /sbin/ | grep autrace
-rwxr-x---. 1 root root 15792 Aug 24 14:40 autrace
03:03:22-slm~ $ autrace
bash: /usr/sbin/autrace: Permission denied
Mas há alguns comandos em que os "dados" que eles tentarão tocar / acessar são restritos, portanto, olhar para as permissões não é suficiente:
$ ls -l /sbin/ | grep "\bfdisk"
-rwxr-xr-x. 1 root root 230512 Apr 25 05:19 fdisk
$ fdisk -l
$
Aqui o comando é executado como meu ID de usuário, mas esse usuário não tem permissões para acessar as informações sobre os discos físicos em meu sistema e, portanto, fdisk
não mostra nenhuma saída. Se eu me elevar para root usando sudo
, posso ver a saída como pretendi:
$ sudo fdisk -l | head -10
Disk /dev/sda: 238.5 GiB, 256060514304 bytes, 500118192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5D1229E8-1234-1234-1234-ABCDEFG128790
Device Start End Size Type
/dev/sda1 2048 411647 200M EFI System
Mecanismos que controlam isso
Não há controle centralizado, todo o controle é descentralizado e armazenado com os arquivos como permissões nos aplicativos / executáveis (como mostrei acima), ou nos arquivos de dados que essas ferramentas usarão, ou nos diretórios onde os arquivos estão contidos.
shell de comando
Sua descrição não está correta no que diz respeito ao Bash ser um shell, e o terminal ser uma interface de usuário que passa por ele. Em vez disso, o terminal é um aplicativo que é executado e, dentro dele, há um shell em execução, normalmente Bash, mas pode ser qualquer número de shells.
Por exemplo Aqui está a saída do comando ps
que mostra como os processos do meu shell atual estão estruturados:
$ ps axf | less
...
8549 ? Sl 0:08 /usr/libexec/gnome-terminal-server
8552 ? S 0:00 \_ gnome-pty-helper
10286 pts/13 Ss 0:00 \_ bash
12783 pts/13 Sl+ 5:49 | \_ vinagre
12868 pts/14 Ss 0:00 \_ bash
15742 pts/14 R+ 0:00 \_ ps axf
15743 pts/14 S+ 0:00 \_ less -r
Aqui você pode ver que o meu terminal, gnome-terminal
, está sendo executado na parte superior e tem processos secundários abaixo dele. Esses processos filhos são 2 bash
shells, onde um deles está executando um aplicativo chamado vinagre
e outro está executando este comando ps
que estou mostrando aqui.
Restrições adicionais
O que descrevi acima é a base de como os executáveis podem ser usados pelos usuários no sistema. Mas estes são apenas o básico. Além destes, existem tecnologias adicionais, como ACL (Access Control Lists) e políticas de controle de acesso para os vários executivos.
As ACLs são bem diretas, oferecendo aos usuários fora do modelo tradicional de proprietário, grupo e outros, um controle mais granular.
Ferramentas como o SELinux e o AppArmor usam essa mesma abordagem, mas introduzem no nível do Kernel do Linux a capacidade de implementar regras que restrinjam como o aplicativo X pode interagir com o sistema como um todo. Por exemplo, se você estiver executando um servidor Samba, este aplicativo precisaria ter acesso ao seu sistema de arquivos fora das áreas normais que normalmente operariam. Você teria que adicionar políticas extras para permitir isso.
trecho da página man do SELinuxNSA Security-Enhanced Linux (SELinux) is an implementation of a flexible mandatory access control architecture in the Linux operating system. The SELinux architecture provides general support for the enforcement of many kinds of mandatory access control policies, including those based on the concepts of Type Enforcement®, Role- Based Access Control, and Multi-Level Security. Background information and technical documentation about SELinux can be found at http://www.nsa.gov/research/selinux.
Comando faz parte de quê?
Se você está confuso se um aplicativo é um arquivo real no sistema, ou se é algo mais, você pode usar o comando type
para determinar isso.
$ type pwd
pwd is a shell builtin
$ type fdisk
fdisk is /usr/sbin/fdisk
Portanto, nos exemplos acima, pwd
está embutido no Bash, enquanto fdisk
é um arquivo real que reside em /usr/sbin/fdisk
.
OBSERVAÇÃO: Para qualquer coisa que esteja incorporada, eles são governados pelas permissões do shell Bash do qual eles estão sendo invocados!