Não recomendo me tornar o proprietário /usr/local
; para a maioria das situações, é provavelmente menos seguro do que usar sudo
.
Sua pergunta sugere dois motivos pelos quais você pode querer chown
/usr/local
.
O primeiro é evitar ter que usar sudo
para instalar o software. Para alguns (como o autor desta resposta ), isso pode indicar que você deseja trabalhar com eficiência ou salvar as teclas necessárias para digitar sudo
e digitar sua senha. Mas provavelmente quando você diz "desnecessário", você está se referindo ao princípio do menor privilégio :
Por padrão, root
possui o diretório Isso significa que para instalar lá, você precisa usar sudo
. Para uma máquina de usuário único ou desenvolvedor, isso parece um uso extra desnecessário do comando
Frequentemente ouço / leio pessoas opinando / reclamando ao longo das linhas de "Eu sou o único que usa esse sistema, então não preciso usar sudo
e digitar uma senha". Para os leitores que têm essa visão, e por ser relevante aqui, vamos nos lembrar de um motivo básico de segurança para que o root possua coisas.
A maioria dos arquivos de programa instalados em um sistema Ubuntu possui o modo de arquivo 755, ou em notação simbólica rwxr-xr-x
, o que significa que qualquer usuário ou programa pode executá-los , mas apenas o proprietário dos arquivos, raiz, pode modificá-los. (Tecnicamente, isso também exige que ninguém, exceto o root, tenha w
permissão no diretório que os contém, para que outros usuários não possam excluí-los ou movê-los.)
Isso significa que você, o humilde usuário, pode executar qualquer programa. Se você tentar usar um programa para fazer algo que não tem permissão, como executar uma operação de gravação em um arquivo pertencente ao root, ocorrerá um erro. Isso gera erros de digitação em alguns comandos, aplicativos de bugs ou códigos maliciosos, menos propensos a atrapalhar o sistema - a menos que esteja sendo executado como root, ele não terá permissão para fazê-lo. Isso é especialmente útil ao executar programas que interagem com a Internet.
Se você chown
/usr/local
, qualquer programa em execução com seus privilégios poderá gravar arquivos lá, que mais tarde podem ser executados como root por algum motivo, como substituindo outro comando com o mesmo nome. /usr/local/bin
está no padrão $PATH
e em sudo
's' secure_path
e vem antes de outros locais nos dois. Então, se eu tenho dois executáveis
/usr/local/bin/chown
/bin/chown
quando executo sudo chown ...
, o chown
in /usr/local/bin
será executado .
Mas você provavelmente já sabia tudo isso, já que seu segundo motivo é sobre segurança:
Além disso, se você possui um software compilado localmente instalado /usr/local
, o software atualmente precisa de raiz para se modificar ou instalar plug-ins. Isso parece inseguro - quero usar apenas sudo
quando souber EXATAMENTE o que acontecerá.
Caso seja necessário mencionar isso aqui, é absolutamente correto (de acordo com a FHS de qualquer maneira) instalar o software compilado localmente /usr/local
, mas a compilação em si deve ser feita em algum lugar do seu $HOME
, sem sudo
, até a última etapa quando você digita sudo make install
ou equivalente.
Eu acho que você está sugerindo que, executando um programa instalado /usr/local
como seu proprietário sem privilégios, você poderia usar erros de permissão específicos lançados ao tentar se atualizar para ver se está tentando modificar algum outro local do sistema de arquivos que não seja de sua propriedade. não quero, para que você possa impedir isso.
Isso pode ser útil. A implicação é que você confia no programa para fazer o que quiser dentro /usr/local
, mas não em outro lugar. Se ele solicitar permissões elevadas, você poderá recusar a atualização ou desinstalação. Isso faz algum sentido para mim. Mas acho que tentar usar /usr/local
como um tipo de sandbox dessa maneira provavelmente não é uma boa ideia, ou pelo menos é improvável que seja a solução mais segura. Não é um local adequadamente isolado ( /opt
é um pouco mais isolado, pois não está no padrão $PATH
). O programa pode gravar ou excluir algo /usr/local
para causar danos. Outros programas (potencialmente mal escritos) que você executa podem escrever e executar códigos que você não conhece.
Se você está preocupado em permitir que um programa se atualize com segurança, provavelmente você deve procurar alternativas (talvez específicas do programa, como no python, por exemplo, ou você pode procurar uma implementação rápida ou semelhante que atenda às suas necessidades ou usar contêineres ou uma VM para testar software potencialmente inseguro) antes de expor um local do sistema (mesmo que relativamente relativo ao usuário) para ser gravado por programas executados por um usuário normal. Isso me parece tão provável que tenha efeitos imprevisíveis quanto permitir que os programas tenham permissões temporariamente elevadas sudo
.
/usr/local/bin
nessa raiz (e também em outros usuários) podem ser executados? Eles não precisariam pertencer à raiz? Além disso, os comandos que o root usa - incluindo comandos em -/usr/local/sbin
podem depender das bibliotecas compartilhadas em/usr/local/lib
. A alteração dessas bibliotecas pode introduzir alterações arbitrárias no comportamento dos comandos que as utilizam. Insistir que apenas/usr/local/sbin
permaneça pertencente à raiz parece completamente arbitrário.Somente para o software que você precisa, use seu diretório pessoal em vez de
/usr/local
.Em vez de alterar a propriedade
/usr/local
ou ter que executar comandos como root quando não quiser, basta configurar suas construções para que sejam instaladas no diretório inicial em vez de/usr/local
. Isso aborda todos os possíveis problemas com a alteração da propriedade/usr/local
, incluindo como seus subdiretóriosbin
esbin
estão noroot
caminho.Se você precisar permitir que outros usuários executem seu software, poderá conceder acesso a eles. De fato, eles provavelmente já poderão, porque, por padrão, seu diretório pessoal tem acesso permissivo de leitura e execução . (Se você não quer isso, pode alterá-lo facilmente, apenas usando os
chmod
arquivos ou diretórios que deseja tornar privados e, possivelmente, também alterando o seuumask
.)Com o software instalado em seu diretório pessoal, os binários que seriam inseridos
/usr/local/bin
serão inseridos . Você receberá outros subdiretórios do diretório inicial correspondentes aos subdiretórios dos quais o software que você instala precisa. Isso normalmente acontece automaticamente quando você instala o software a partir do código fonte./home/username/bin
/usr/local
Configurando suas compilações
A maioria dos softwares que você cria a partir do código fonte possui uma etapa em que você executa:
Para a grande maioria dos softwares fornecidos com um
configure
script que pode ser executado dessa maneira, o padrão é configurar a compilação para instalação interna/usr/local
quando você eventualmente executarsudo make install
a instalação. O motivo é que é implicitamente equivalente à execução:Para configurar uma compilação para instalação em seu diretório pessoal, use isto:
Na prática, no Ubuntu, os caminhos do diretório inicial não contêm espaços, outros espaços em branco ou outros caracteres que serão tratados especialmente pelo shell
*
, portanto, a menos que você configure sua conta de usuário de maneira bastante estranha, basta digitar:( Porém, não recomendo o hábito de escrever scripts . Além disso, em alguns outros sistemas operacionais - como o macOS - é menos incomum que os caminhos para os diretórios pessoais dos usuários contenham espaços.)
Ou, se preferir, digite o caminho completo do diretório inicial:
(Substitua
username
pelo seu nome de usuário real, é claro. Se, por algum motivo, seu diretório pessoal não estiver,/home
então você precisará ajustar em conformidade.)Instalando suas compilações
Depois de executar
make
, você pode estar acostumado a executarsudo make install
, mas quando instala em seu próprio diretório inicial, não é necessário executá-lo como root, para que você possa - e deva - omitirsudo
. Apenas corra:Da mesma forma, para software que suporta um
uninstall
destino:Isto é exatamente o que você estava pedindo ... apenas no seu diretório pessoal, não
/usr/local
.Executando seus programas
Provavelmente, o
bin
subdiretório do diretório inicial é:$PATH
, ou$PATH
se você simplesmente sair e entrar novamente.O motivo é que o
.profile
arquivo no diretório inicial, que contém comandos executados quando você faz login, contém isso por padrão para contas de usuário criadas na maioria das versões do Ubuntu (incluindo a conta de administrador inicial criada quando você instala o sistema operacional):Esse código é executado quando você faz login (porque está dentro
.profile
) e coloca seubin
diretório pessoal$PATH
somente se ele existir naquele momento. É por isso que você pode precisar sair e entrar novamente.Versões mais antigas como o Ubuntu 14.04, assim como versões mais recentes como o Ubuntu 17.10, vêm com isso. No entanto, o Ubuntu 16.04, que é provavelmente o lançamento mais popular até agora, tem o seguinte:
Isso simplesmente adiciona o
bin
subdiretório do seu diretório pessoal - assim como o.local/bin
subdiretório - ao seu$PATH
, sem verificar se esses diretórios realmente existem. Portanto, se você usa o 16.04, ou se atualizou de um sistema que era 16.04 quando a sua conta de usuário foi criada, obin
subdiretório do diretório inicial provavelmente já está no seu$PATH
.Seu
.profile
arquivo é copiado do/etc/skel
diretório quando sua conta de usuário é criada. Se sua conta de usuário foi criada em uma versão mais antiga do Ubuntu, ela recebeu essa versão.profile
e não foi alterada - para sua conta de usuário - atualizando para uma versão mais recente.Uma vez que o
bin
subdiretório do seu diretório pessoal esteja no seu$PATH
, você poderá executar programas cujos arquivos executáveis estão instalados lá apenas digitando seus nomes, assim como você faria com os programas instalados pelo gerenciador de pacotes do Ubuntu ou instalados dentro dele/usr/local
.A
.local
OpçãoVocê deve ter notado que o
.profile
arquivo padrão para contas de usuário criadas em algumas versões do Ubuntu, incluindo no 16.04, conforme descrito acima, não apenas adiciona$HOME/bin
ao seu caminho, mas também$HOME/.local/bin
. Se você.profile
não adicionar isso, mas quiser , basta editá-lo.Embora geralmente seja usado para armazenar configurações e dados em cache , você também pode instalar o software dentro do
.local
subdiretório do diretório inicial. Você deve se sentir desinibido ao fazê-lo, pois, do ponto de vista da usabilidade e segurança,--prefix="$HOME/.local"
é semelhante a--prefix="$HOME"
.Lembre-se de que os arquivos e diretórios iniciados com
.
não são mostrados por padrão nos navegadores gráficos (use Ctrl+ Hpara mostrar e reexibir) ou pelols
comando (passe o sinalizador-A
ou-a
para mostrá-los). Pode não ser o que você deseja ou pode ser exatamente o que você deseja. Esta é uma questão de preferência pessoal.No entanto, observei que alguns gerenciadores de pacotes automatizados baseados em fontes que criam e instalam software no diretório pessoal de alguém usam
$HOME/.local
. Na verdade, eu não sei o quão comum isso é - espero investigar melhor e atualizar esta resposta - mas você pode preferir usar apenas as$HOME
coisas que compila manualmente. Dessa forma, ficará claro de onde as coisas vieram. E se houver uma colisão, é provável que o software coexista de forma aceitável.Você também pode instalar deliberadamente algum software dentro
$HOME/.local
e outro software dentro$HOME
. Você decide. Obin
diretório que aparecer primeiro na$PATH
variável de ambiente é aquele a partir do qual um comando será executado, caso existam comandos com o mesmo nome em ambos.Os créditos são atribuídos a Zanna e Videonauth por apontar erros em uma versão anterior desta resposta, sobre quais versões do Ubuntu possuem qual código padrão
.profile
e me ajudar a corrigi- los (veja também aqui ).fonte
Se o sudo for um inconveniente, basta atualizar o / etc / sudoers para que você não precise digitar sua senha ao executar o sudo. Acredito que é uma solução melhor do que mudar o proprietário de / usr / local.
fonte
/usr/local
você precisa usar o sudo, o que é potencialmente perigoso.