Linux / Comando install: copiar arquivos e definir permissões

O comando GNU install copia arquivos e permite definir o modo de permissões, o proprietário, o grupo e a criação de diretórios de destino. Ele é útil para colocar scripts, executáveis e configurações nos caminhos desejados; não resolve dependências nem registra pacotes como um gerenciador de software. Confira o destino e os atributos antes de substituir um arquivo existente.

Os exemplos usam Bash e GNU Coreutils. Confira install --version, install --help e man install no destino: extensões e combinações de opções variam entre implementações e versões. Prepare a área temporária abaixo no mesmo terminal. Ela usa arquivos de demonstração e pastas em que você pode escrever, sem precisar de privilégios administrativos.

O que faz o comando install?

Uma cópia comum com install instala um arquivo; install -d cria ou ajusta diretórios, sem copiar uma árvore de arquivos. Para um arquivo regular novo, o modo padrão dá leitura, escrita e execução ao dono e leitura e execução aos demais, como 0755. Configurações geralmente precisam de outro modo, declarado com -m. Diretórios com bits especiais ou políticas de acesso devem ser inspecionados, em vez de presumir que todos os atributos serão clonados. O manual GNU de install descreve os padrões e as opções.

Sintaxe básica

install [opções] [-T] origem destino
install [opções] origem ... diretório
install -d [opções] diretório ...

origem, destino e diretório são marcadores. Use aspas em caminhos com espaços e -- antes dos nomes no GNU. Se o destino já for uma pasta, o nome da origem pode ser acrescentado dentro dela; -T trata o último argumento como caminho exato. O comando recusa instalar um arquivo sobre ele mesmo e não substitui uma cópia recursiva de diretórios.

Uso básico do install

Instalar um executável

Execute o bloco inteiro: ele guarda a pasta inicial, cria uma área exclusiva, prepara um script Bash completo, uma configuração e dois modelos HTML e instala o script em bin/mytool. Os passos ligados por && só continuam após sucesso; pare se houver erro. O modo 0755 dá execução ao dono, ao grupo e aos demais; não significa que o comando verificou a lógica do programa.

install_start=$PWD
install_demo=$(mktemp -d "${TMPDIR:-/tmp}/install-demo.XXXXXX") &&
cd -- "$install_demo" &&
mkdir -p -- bin etc/mytool share/myapp templates &&
printf '%s\n' '#!/usr/bin/env bash' 'printf "Olá, %s!\n" "${1:-mundo}"' > mytool &&
printf '%s\n' 'enabled=true' > mytool.conf &&
printf '%s\n' '<p>Índice</p>' > templates/index.html &&
printf '%s\n' '<p>Boas-vindas</p>' > templates/welcome.html &&
install -m 0755 -- mytool bin/mytool

Instalar uma configuração

A preparação criou etc/mytool. O comando abaixo instala mytool.conf nessa pasta com modo 0644: dono com leitura e escrita, grupo e demais com leitura, sem execução. Esse modo serve para uma configuração pública de demonstração; para segredos que só o dono deve ler e escrever, avalie 0600 e a política do serviço. install pode substituir o conteúdo existente, sem perguntar.

install -m 0644 -- mytool.conf etc/mytool/mytool.conf

Criar o diretório de instalação

-d cria os pais ausentes e aplica o modo ao diretório indicado, aqui state/app. 0750 dá acesso completo ao dono, leitura e travessia ao grupo e nenhum acesso aos demais. Os bits comuns de acesso dos pais criados pelo GNU são 0755, independentemente de -m e da máscara de criação umask; bits especiais e políticas do sistema ainda exigem conferência. Um diretório que já existe também pode ter atributos ajustados por install -d.

install -d -m 0750 -- state/app

Para definir dono e grupo no Linux, existem -o DONO e -g GRUPO, que aceitam nomes ou identificadores numéricos. Quando usar nomes, confirme que o sistema consegue resolvê-los; identificadores numéricos devem corresponder às identidades pretendidas. O processo precisa das permissões apropriadas, e mudar o dono para outra conta normalmente exige root. O comando não cria usuários. Se uma instalação real em uma pasta do sistema exigir administração, use sudo explicitamente depois de revisar o arquivo e o caminho; não adapte a prática atribuindo privilégios desnecessários.

Conferir modo e funcionamento

Este exemplo cria outro script completo e só consulta o modo e tenta executá-lo se a instalação funcionar. O interpretador Bash precisa estar disponível, e o sistema de arquivos deve permitir a execução nesse local:

printf '%s\n' '#!/usr/bin/env bash' 'printf "%s\n" "Exemplo de instalação."' > demo-tool &&
install -m 0755 -- demo-tool demo-tool-installed &&
stat -c '%a %n' -- demo-tool-installed &&
./demo-tool-installed

Em um Linux com suporte normal aos modos de arquivos e execução permitida, a saída esperada é:

755 demo-tool-installed
Exemplo de instalação.

A primeira linha mostra o modo consultado por stat; a segunda comprova a execução desse pequeno script de demonstração. Uma cópia existente com modo inesperado ou um diagnóstico de atributos não deve ser tratada como instalação concluída. Para um executável real, confira também arquitetura, interpretador, bibliotecas e requisitos da aplicação no ambiente de destino.

Opções principais

Opção Propósito
-m MODO Definir os bits de modo do arquivo ou do diretório indicado.
-o DONO Definir o dono, quando houver privilégios apropriados.
-g GRUPO Definir o grupo, quando permitido.
-d Criar os diretórios pedidos e os pais ausentes.
-D Criar os pais ausentes do caminho final e então copiar o arquivo.
-t PASTA Declarar a pasta receptora antes das origens.
-p Aplicar os horários de acesso e modificação da origem ao destino.
-s Executar strip para remover tabelas de símbolos de binários compatíveis.
-C Comparar conteúdo e atributos relevantes antes de decidir se precisa alterar o destino.

-p preserva atime e mtime, os horários de acesso e de modificação; sem ele, os horários do destino normalmente refletem a instalação. -C considera conteúdo, dono, grupo, permissões e, quando aplicável, contexto SELinux (Security-Enhanced Linux). Isso não é apenas uma comparação de data ou tamanho. Declare os atributos pretendidos e confirme o suporte a combinações de opções; ACLs, listas de controle de acesso, e diretórios com setgid (herança do grupo) podem limitar a inferência dos padrões. -s depende de uma ferramenta strip compatível com o binário e não deve ser usado em scripts ou configurações de texto.

Exemplos práticos

Instalar um arquivo criando os pais

Neste exemplo, nested/etc/mytool ainda não existe. -D cria os pais e instala a configuração no caminho final, com 0644 aplicado ao arquivo. Esse modo não torna os pais 0644; eles precisam de permissão de travessia. Quando os diretórios exigirem uma política própria de dono, grupo ou modo, prepare cada diretório apropriado com install -d antes da cópia.

install -D -m 0644 -- mytool.conf nested/etc/mytool/mytool.conf

Instalar vários arquivos em uma pasta

A preparação criou share/myapp e dois arquivos em templates. O Bash expande templates/*.html antes de chamar install, que coloca os dois modelos na pasta receptora. Confira a expansão e a política de substituição. Para também criar uma pasta receptora ausente, o GNU permite combinar -D com -t.

install -m 0644 -t share/myapp -- templates/*.html

Verificar atributos instalados

Salve o script completo abaixo como verify-install.sh e execute bash verify-install.sh "$install_demo/mytool" "$install_demo/bin/mytool" 755. Ele requer Bash, GNU stat, cmp e file. Recebe origem, destino e o modo esperado no formato de stat %a, sem zero inicial, como 755. Compara os bytes, exige o modo informado e mostra dono, grupo e tipo. Uso incorreto retorna 2; falta de arquivo, diferença ou falha de consulta retorna 1.

#!/usr/bin/env bash
if [ "$#" -ne 3 ]; then
  printf '%s\n' 'Uso: bash verify-install.sh ORIGEM DESTINO MODO_ESPERADO' >&2
  exit 2
fi
if [ ! -f "$1" ] || [ ! -f "$2" ]; then
  printf '%s\n' 'Origem e destino devem ser arquivos regulares acessíveis.' >&2
  exit 1
fi
if ! cmp -s -- "$1" "$2"; then
  printf '%s\n' 'Os bytes não coincidem ou a comparação falhou.' >&2
  exit 1
fi
actual_mode=$(stat -c '%a' -- "$2") || exit 1
if [ "$actual_mode" != "$3" ]; then
  printf 'Modo observado: %s; esperado: %s\n' "$actual_mode" "$3" >&2
  exit 1
fi
stat -c '%A %U:%G %n' -- "$2" || exit 1
file -- "$2" || exit 1
printf '%s\n' 'Bytes e modo esperado conferidos.'

O script apenas lê os arquivos. Compare o dono e o grupo exibidos com os esperados pela implantação: o script não adivinha quais contas deveriam ser usadas. Para o script preparado nesta prática, execute depois "$install_demo/bin/mytool" teste; o resultado esperado é Olá, teste!. A saída de file descreve um tipo reconhecido, mas não comprova segurança, arquitetura compatível ou todas as dependências de qualquer programa.

Comparar install e comandos relacionados

Comando ou método Função principal Quando usar
install Copiar e definir atributos Colocar artefatos e configurações com atributos explícitos
cp Cópia geral de arquivos Copiar arquivos com uma política própria de preservação ou alteração de atributos
mkdir Criar diretórios comuns Preparar pastas de trabalho
apt ou dnf Gerenciar pacotes e dependências Instalar e atualizar software empacotado pela distribuição

Para criar apenas a estrutura de trabalho, o comando mkdir pode ser suficiente. install não preserva atributos estendidos, também chamados de xattrs, e não equivale a uma cópia integral de metadados. Políticas de segurança, rótulos e permissões precisam ser conferidos no sistema de destino.

Cuidados importantes

Não é um gerenciador de pacotes

Arquivos colocados por install não passam automaticamente a fazer parte do banco de dados de pacotes da distribuição. Registre quais caminhos foram criados e como o aplicativo será atualizado ou removido. Copiar um arquivo de unidade de serviço, por exemplo, não executa todas as etapas de registro e ativação do serviço.

Não dependa do modo padrão

Escolha -m conforme o uso, em vez de usar o padrão para toda entrada. Configurações públicas, segredos e executáveis têm necessidades diferentes. Um modo adequado não concede acesso onde o usuário, a pasta pai, o sistema de arquivos ou uma política de segurança o proíbe; examine o diagnóstico de cada etapa.

Planejar a substituição de arquivos ativos

Instalar diretamente sobre uma configuração ativa pode descartar alterações e interromper o serviço. Defina backup, comparação, validação do artefato, ativação e reversão conforme a aplicação. A opção --backup=numbered pode guardar uma versão do destino substituído, mas não cria sozinha uma implantação atômica nem um plano completo de restauração. Ao terminar a prática, volte com cd -- "$install_start"; os arquivos restantes ficam disponíveis para inspeção.

Perguntas frequentes

O comando install instala pacotes de software?

Não. Ele copia arquivos e aplica atributos; não gerencia dependências de pacotes.

Por que usar install em vez de cp?

Ele combina cópia com modos explícitos, propriedade e criação do diretório de destino.

Ele pode criar apenas um diretório?

Sim. Use install -d DIRETÓRIO e adicione -m, -o ou -g conforme necessário.

Como preservar os horários da origem?

Use -p ou --preserve-timestamps para aplicar atime e mtime da origem ao destino. Confira o resultado e as limitações do sistema de arquivos; isso não preserva todos os metadados, nem torna a cópia um backup completo.

Documentação oficial