O que você quer dizer exatamente? Você está procurando algo como um "bloco flexível" para impedir que você faça isso acidentalmente?
kos
4
Não sei ao certo qual é o objetivo de fazê-lo, mesmo que fosse possível.
muru
4
qual seria a lógica para isso? Isso não impede que um usuário digite o comando real ... por isso não vejo motivo para alguém precisar bloquear aliases?
Rinzwind 9/01/16
2
Como muru e Rinzwind disseram, qual é o objetivo? Os aliases não podem fazer coisas mais desagradáveis do que as que um usuário já pode fazer, bloquear aliases apenas dificulta a vida do usuário. Além disso, seja qual for a solução (por exemplo, usando um apelido / função para substituir o incorporado), não consigo pensar em uma maneira de torná-lo não contornável pelos próprios usuários, a menos que seja bloqueando o seu ~/.bashrc.
kos
Não bloqueando todos os alias, apenas impeça que ele / ela não use os comandos padrão name como um nome alternativo. Eu sei que podemos escapar de aliases de várias maneiras, como usar \ com o mesmo comando com alias para executar o comando real. Isso é tudo
αғsнιη
Respostas:
24
Não há como impedir que um usuário defina os aliases preferidos. Considerar:
Você desativa os aliases em /etc/bash.bashrc. Eles o habilitam onde quiserem.
Você exclui todas as menções de aliases em /etc/bash.bashrc, e tudo ~/.bashrce ~/.bash_aliasespor meio de um script. Eles colocam seus apelidos em outro arquivo e o originam.
Você executa um comando PROMPT_COMMANDque desativa certos aliases. Eles redefinem ou indefinem PROMPT_COMMAND.
Você intercepta DEBUGe define aliases. Eles removem a armadilha.
Você exibe todos os arquivos originados na chamada para a raiz. Eles usam outro arquivo e o originam manualmente como o primeiro comando executado.
Você desativar as builtins unset, builtine enable; faça aliasuma função ; declare -rf aliasimpedir que os usuários modifiquem a função; e exporte a função. Eles rodam /bin/bashcom --rcfilee --init-fileiniciam um novo shell, onde os ditos componentes internos estão agora ativados.
...
Você pode desativar os aliases no momento da compilação. Depende de você manter o bash atualizado e garantir que não seja afetado pelo próximo Shellshock. Obviamente, os usuários poderiam criar sua própria festança.
Eu tinha um pouco de uma ideia engraçada embora: você pode de alias Alias: =)
Rinzwind
4
E eles unalias alias.
Muru
4
@ certo, mas você também pode usar o pseudônimo unalias: +
Rinzwind
8
@Rinzwind e eles correm \unalias unalias.
muru
10
TL; DR
A única maneira de impedir que um usuário crie aliases é fornecê-los com um shell que não suporta aliases. Geralmente, esse é um problema X / Y, em que X é realmente um modelo de ameaça que deve ser resolvido com controles ou arquiteturas apropriadas, em vez de tentar resolver o problema pós-fato depois que um usuário recebe um shell em um sistema compartilhado.
Abaixo, forneço uma resposta tecnicamente correta, bem como algumas orientações sobre quais problemas isso vai ou não resolver. Também forneço algumas orientações adicionais sobre controles alternativos.
Usando o Shell Restrito do Bash
Você pode usar o shell restrito do Bash atribuindo rbash como o shell de login do usuário. Por exemplo:
Você deve então desativar o alias embutido para o usuário, de preferência sem interromper o shell de todos os outros também. Como exemplo, você pode adicionar o seguinte a um arquivo como /etc/profile.d/rbash.sh :
# Limit effect to users in a specific UID range.if((UID >=2000))&&((UID <3000));then# Check shell options; disable alias builtins when shell is restricted.if[[ $-=~ r ]];then
enable -n alias
enable -n unalias
fifi
Ressalvas
A menos que você tenha colocado o usuário em uma prisão chroot ou fornecido um PATH modificado que não inclui acesso a outros shells, não há nada que impeça o usuário de simplesmente digitar bashno prompt e obter um shell irrestrito.
Além disso, por design, o shell restrito impede muitas atividades comuns, como alterar diretórios:
$ cd /tmp
rbash: cd: restricted
mas não impede que outros scripts ou programas no PATH o façam. Isso significa que você precisa criar cuidadosamente o ambiente do usuário e, especificamente, que você precisa impedir que eles possam modificar o PATH em seus arquivos de inicialização, porque mesmo que o rbash torne o PATH somente leitura, ele o faz após a inicialização.
Melhores escolhas
Mesmo se você usar o rbash, precisará fazê-lo como parte de um conjunto mais amplo de controles. Alguns exemplos podem incluir:
Impedir que os usuários não-técnicos de acidentalmente comandos perigosas invocando, fornecendo aliases padrão, tais como rm -i, mv -ie cp -ina /etc/bash.bashrc arquivo.
Dado o seu exemplo original, esta é provavelmente a solução mais sensata.
Você pode combinar isso com, enable -n aliasse quiser.
Isso não impedirá que usuários qualificados alterem os aliases, mas pode ser suficiente para impedir que usuários não técnicos façam o que quer que seja.
Permissões tradicionais do Unix ou ACLs POSIX para proteger arquivos e diretórios.
Logins que executam um único comando não interativo. Por exemplo:
Use virtualização como Xen, OpenVZ, LXC, VMware, VirtualBox ou outras tecnologias para fornecer um ambiente segregado.
Depois de definir com precisão o seu modelo de ameaça, você poderá identificar os controles mais adequados para o seu caso de uso. Sem uma compreensão mais significativa do motivo pelo qual você deseja impedir o alias (por exemplo, que problema do mundo real ele resolve?), Não é possível selecionar os controles mais adequados.
+1 em geral, mas também especificamente para classificar isso como um problema X / Y.
Joe
5
Esse é um empreendimento sem sentido, como mostra a resposta de muru. Mas existem algumas opções, mas elas não são perfeitas.
De acordo com o bashmanual, as funções sempre têm precedência sobre os aliases, portanto, poderíamos fazer o seguinte:
xieerqi@eagle:~$ function alias { echo "Aliases are no-no";}
xieerqi@eagle:~$ alias TEST='rm'Aliases are no-no
Você pode colocar a definição de função em todo o sistema .bashrc, no entanto, como o muru apontou, os usuários inteligentes encontrarão uma maneira de obter aliases adquirindo um bashrcarquivo diferente, por exemplo.
Outra idéia com a qual eu brinquei é enableincorporada.
aliasé um shell embutido e bashpossui um bom enablecomando que permite ativar ou desativar os embutidos. Por exemplo, aqui estou eu desativando alias.
xieerqi@eagle:~$ enable -n alias
xieerqi@eagle:~$ alias
No command 'alias' found, did you mean:Command'0alias' from package 'zeroinstall-injector'(universe)
alias: command not found
xieerqi@eagle:~$ alias TEST='rm'No command 'alias' found, did you mean:Command'0alias' from package 'zeroinstall-injector'(universe)
alias: command not found
xieerqi@eagle:~$ enable alias
xieerqi@eagle:~$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'
xieerqi@eagle:~$
Novamente, usar todo o sistema bashrcé uma opção aqui.
Não bloquear todos apelido, só construiu-in comandos não de alias em si :)
αғsнιη
@ Afshin.Hamedi Bem, o que é um comando padrão? O que vem com o ubuntu? Isso significa que você precisaria ter uma lista de todos os comandos (arquivos binários) fornecidos com a instalação padrão. Então, toda vez que o usuário carrega o shell ou tenta criar um alias rm, ele verifica a lista. Considerando que as listas seria muito grande, que levaria muito tempo para iniciar, seus usuários vão reclamar com você muito e odeio você, como administrador do sistema :)
Sergiy Kolodyazhnyy
É uma pergunta divertida e incrível que você tem, eu gosto! O aliasing seletivo seria bom. Mas eu duvido que é possível, a menos que os desenvolvedores shell encontrar uma necessidade para que possa ser implementado :)
Sergiy Kolodyazhnyy
A ideia da função foi boa. Chegou mais perto.
muru
0
Você pode definir (in /etc/profile) uma função chamada aliasque realiza a validação que você deseja (provavelmente usando type -p) (afinal todos os "comandos padrão do Ubuntu" são "executáveis em $PATH") antes de chamar o built-in alias, MAS, como outros já indicaram, seus usuários podem obter em torno disso. Por que não obter um conjunto diferente de usuários ou educá-los ("Definir um aliasque substitui um comando é uma maneira muito boa de se dar um tiro no pé e causar confusão (por exemplo, por que lssolicita minha senha?))?
~/.bashrc
.Respostas:
Não há como impedir que um usuário defina os aliases preferidos. Considerar:
/etc/bash.bashrc
. Eles o habilitam onde quiserem./etc/bash.bashrc
, e tudo~/.bashrc
e~/.bash_aliases
por meio de um script. Eles colocam seus apelidos em outro arquivo e o originam.PROMPT_COMMAND
que desativa certos aliases. Eles redefinem ou indefinemPROMPT_COMMAND
.DEBUG
e define aliases. Eles removem a armadilha.unset
,builtin
eenable
; façaalias
uma função ;declare -rf alias
impedir que os usuários modifiquem a função; e exporte a função. Eles rodam/bin/bash
com--rcfile
e--init-file
iniciam um novo shell, onde os ditos componentes internos estão agora ativados.Você pode desativar os aliases no momento da compilação. Depende de você manter o bash atualizado e garantir que não seja afetado pelo próximo Shellshock. Obviamente, os usuários poderiam criar sua própria festança.
fonte
unalias alias
.\unalias unalias
.TL; DR
A única maneira de impedir que um usuário crie aliases é fornecê-los com um shell que não suporta aliases. Geralmente, esse é um problema X / Y, em que X é realmente um modelo de ameaça que deve ser resolvido com controles ou arquiteturas apropriadas, em vez de tentar resolver o problema pós-fato depois que um usuário recebe um shell em um sistema compartilhado.
Abaixo, forneço uma resposta tecnicamente correta, bem como algumas orientações sobre quais problemas isso vai ou não resolver. Também forneço algumas orientações adicionais sobre controles alternativos.
Usando o Shell Restrito do Bash
Você pode usar o shell restrito do Bash atribuindo rbash como o shell de login do usuário. Por exemplo:
Você deve então desativar o alias embutido para o usuário, de preferência sem interromper o shell de todos os outros também. Como exemplo, você pode adicionar o seguinte a um arquivo como /etc/profile.d/rbash.sh :
Ressalvas
A menos que você tenha colocado o usuário em uma prisão chroot ou fornecido um PATH modificado que não inclui acesso a outros shells, não há nada que impeça o usuário de simplesmente digitar
bash
no prompt e obter um shell irrestrito.Além disso, por design, o shell restrito impede muitas atividades comuns, como alterar diretórios:
mas não impede que outros scripts ou programas no PATH o façam. Isso significa que você precisa criar cuidadosamente o ambiente do usuário e, especificamente, que você precisa impedir que eles possam modificar o PATH em seus arquivos de inicialização, porque mesmo que o rbash torne o PATH somente leitura, ele o faz após a inicialização.
Melhores escolhas
Mesmo se você usar o rbash, precisará fazê-lo como parte de um conjunto mais amplo de controles. Alguns exemplos podem incluir:
Impedir que os usuários não-técnicos de acidentalmente comandos perigosas invocando, fornecendo aliases padrão, tais como
rm -i
,mv -i
ecp -i
na /etc/bash.bashrc arquivo.enable -n alias
se quiser.Permissões tradicionais do Unix ou ACLs POSIX para proteger arquivos e diretórios.
Logins que executam um único comando não interativo. Por exemplo:
Use comandos forçados SSH por chave. Por exemplo:
Use a opção OpenSSH ForceCommand com um bloco de correspondência condicional.
Use ferramentas especiais como gitolite ou scponly projetadas para seu caso de uso específico.
Use uma prisão chroot .
Use virtualização como Xen, OpenVZ, LXC, VMware, VirtualBox ou outras tecnologias para fornecer um ambiente segregado.
Depois de definir com precisão o seu modelo de ameaça, você poderá identificar os controles mais adequados para o seu caso de uso. Sem uma compreensão mais significativa do motivo pelo qual você deseja impedir o alias (por exemplo, que problema do mundo real ele resolve?), Não é possível selecionar os controles mais adequados.
fonte
Esse é um empreendimento sem sentido, como mostra a resposta de muru. Mas existem algumas opções, mas elas não são perfeitas.
De acordo com o
bash
manual, as funções sempre têm precedência sobre os aliases, portanto, poderíamos fazer o seguinte:Você pode colocar a definição de função em todo o sistema
.bashrc
, no entanto, como o muru apontou, os usuários inteligentes encontrarão uma maneira de obter aliases adquirindo umbashrc
arquivo diferente, por exemplo.Outra idéia com a qual eu brinquei é
enable
incorporada.alias
é um shell embutido ebash
possui um bomenable
comando que permite ativar ou desativar os embutidos. Por exemplo, aqui estou eu desativandoalias
.Novamente, usar todo o sistema
bashrc
é uma opção aqui.fonte
rm
, ele verifica a lista. Considerando que as listas seria muito grande, que levaria muito tempo para iniciar, seus usuários vão reclamar com você muito e odeio você, como administrador do sistema :)Você pode definir (in
/etc/profile
) uma função chamadaalias
que realiza a validação que você deseja (provavelmente usandotype -p
) (afinal todos os "comandos padrão do Ubuntu" são "executáveis em$PATH
") antes de chamar o built-inalias
, MAS, como outros já indicaram, seus usuários podem obter em torno disso. Por que não obter um conjunto diferente de usuários ou educá-los ("Definir umalias
que substitui um comando é uma maneira muito boa de se dar um tiro no pé e causar confusão (por exemplo, por quels
solicita minha senha?))?fonte