AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 410759
Accepted
terdon
terdon
Asked: 2017-12-14 14:47:00 +0800 CST2017-12-14 14:47:00 +0800 CST 2017-12-14 14:47:00 +0800 CST

Desde quando o POSIX e o GNU rm não excluem /?

  • 772

Por vários anos, o rmutilitário GNU não será excluído /, a menos que seja chamado com a --no-preserve-rootopção. No entanto, o comando rm -rf /foi alojado no subconsciente coletivo como perigoso por muito tempo e as pessoas ainda o citam como um comando "assustador".

Eu queria saber quando essa regra que rmnão pode excluir /apareceu pela primeira vez. Eu verifiquei as especificações do POSIX e posso ver que, embora o POSIX:2008 inclua esse recurso de segurança, o POSIX:2001 não. Como as versões online das especificações do POSIX são atualizadas de tempos em tempos, a cada novo sub-lançamento, também verifiquei a máquina de retorno e encontrei a página relevante do POSIX:2008 de 2010 e pude confirmar que a regra que rmnão pode remover /já estava listado então.

Então, minhas perguntas são:

  • Quando a regra que rmnão pode ser removida foi /adicionada às especificações POSIX? Ele estava na edição original de 2008 da Single UNIX Specification versão 4 ou foi adicionado em uma revisão?
  • Quando essa limitação foi adicionada ao GNU rm? Tenho certeza de que foi antes de ser adicionado ao POSIX, mas quando isso aconteceu?
posix rm
  • 1 1 respostas
  • 3083 Views

1 respostas

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2017-12-14T15:19:55+08:002017-12-14T15:19:55+08:00

    Você pode encontrar a versão HTML de todas as edições do POSIX 2008 online:

    • original: http://pubs.opengroup.org/onlinepubs/9699919799.2008edition/utilities/rm.html
    • TC1 (edição de 2013) http://pubs.opengroup.org/onlinepubs/9699919799.2013edition/utilities/rm.html
    • TC2 (edição de 2016) http://pubs.opengroup.org/onlinepubs/9699919799.2016edition/utilities/rm.html

    Isso foi adicionado na edição de 2008.

    As correções técnicas geralmente não adicionam novos recursos.

    Você pode ver que a versão anterior ( http://pubs.opengroup.org/onlinepubs/009695399/utilities/rm.html ) (POSIX 2004) não tinha esse texto.

    O novo texto foi aceito na conferência do grupo de austin em 2003-05-09 para inclusão em uma revisão posterior do padrão.

    Foi solicitado por John Beck, da Sun Microsystems, em março do mesmo ano (o link requer registro em opengroup, veja também Solicitação de Aprimoramento Número 5 aqui ).

    John Beck escreveu, em 11 de março de 2003:

    @ page 820 line 31681-31683 section rm comment {JTB-1}
    
    Problem:
    
    Defect code :  3. Clarification required
    
    An occasional user mistake, with devastating consequences, is to
    write a shell script with a line such as:
          rm -rf $VARIABLE1/$VARIABLE2
    or
          rm -rf /$VARIABLE1
    without verifying that either variable is set, which can lead to
          rm -rf /
    being the resulting command.  Since there is no plausible
    circumstance under which this is the desired behavior, it seems
    reasonable to disallow this.  Such a safeguard would, however,
    violate the current specification.
    
    Action:
    
    Either extend the exceptions for . and .. on the noted lines
    to list / as well, or specify that the behavior of rm if an
    operand resolves to / is undefined.
    

    GNU rmadicionou --preserve-roote --no-preserve-rootopções neste commit de 2003-11-09 , mas --preserve-rootsó se tornou o padrão neste commit de 2006-09-03 , então no coreutils 6.2

    O FreeBSD tem preservado o slash desde o commit de 2004-10-04 (com um log de commit "Descubra como minha cueca realmente é à prova de chamas" ), mas inicialmente não quando sobPOSIXLY_CORRECT , até que eles se lembraram de verificar uma década depois que o POSIX era agora obrigando-o em que ponto foi feito também no modo POSIX .

    O commit inicial do FreeBSD menciona que o Solaris já estava fazendo isso naquela época.

    @JdePB (no comentário abaixo) encontrou esse link para uma história interna da Sun corroborando e dando mais detalhes sobre a origem do Solaris e sugerindo que o Solaris já tinha a proteção em vigor antes de fazer o pedido ao grupo de Austin.

    Ele explica a justificativa para adicionar essa exclusão. Embora alguém só possa se culpar se o fizer rm -rf /, há um caso em que um script poderia fazê-lo rm -rf -- "$1/$2"sem verificar se $1/ $2foram fornecidos, o que atingiu alguns clientes da Sun ao aplicar incorretamente um patch do Solaris (de acordo com esse link).

    A proibição de exclusão de .e ..foi adicionada muito antes disso e novamente para proteger contra possíveis contratempos. rmainda é um comando perigoso. Ele faz o que deve fazer: remove o que você manda.

    rm -rf /*
    cd /tmp &&  rm -rf .*/   # on some systems where rm -rf ../ still removes
                             # the content of ../ and shells that still
                             # may include . and .. in glob expansions.
    rm -rf -- "$diretcory"/* # note the misspelled variable name
    dir='foo '; rm -rf $dir/*
    

    Também removeria tudo. A conclusão do nome do arquivo Shell é conhecida por causar tais problemas quando você faz

    rm -rf someth<Tab>/*
    

    Expandido para:

    rm -rf something /*
    

    Porque somethingaconteceu de não ser um diretório.

    Os shells gostam tcshou zshadicionam um prompt extra ao tentar chamar rmcom um *curinga ( tcshnão por padrão).

    • 32

relate perguntas

  • Como posso criar um loop aritmético em um script de shell POSIX?

  • Qual é a maneira correta de lidar com o código de saída do último comando?

  • Os subdiretórios não vazios de outro usuário estão protegidos contra exclusão no meu diretório?

  • O que acontece com uma sessão unix quando o líder da sessão sai?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Matriz JSON para bash variáveis ​​usando jq

    • 4 respostas
  • Marko Smith

    A data pode formatar a hora atual para o fuso horário GMT? [duplicado]

    • 2 respostas
  • Marko Smith

    bash + lê variáveis ​​e valores do arquivo pelo script bash

    • 4 respostas
  • Marko Smith

    Como posso copiar um diretório e renomeá-lo no mesmo comando?

    • 4 respostas
  • Marko Smith

    conexão ssh. Conexão X11 rejeitada devido a autenticação incorreta

    • 3 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Marko Smith

    comando systemctl não funciona no RHEL 6

    • 3 respostas
  • Marko Smith

    rsync porta 22 e 873 uso

    • 2 respostas
  • Marko Smith

    snap /dev/loop em 100% de utilização -- sem espaço livre

    • 1 respostas
  • Marko Smith

    chave de impressão jq e valor para todos no subobjeto

    • 2 respostas
  • Martin Hope
    EHerman Matriz JSON para bash variáveis ​​usando jq 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux A data pode formatar a hora atual para o fuso horário GMT? [duplicado] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC Como posso copiar um diretório e renomeá-lo no mesmo comando? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve Como as permissões de arquivo funcionam para o usuário "root"? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe Altere o editor padrão para vim para _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey Como baixar o pacote não instalá-lo com o comando apt-get? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao Por que os diretórios /home, /usr, /var, etc. têm o mesmo número de inode (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg — o comando list-keys gera uid [ desconhecido ] depois de importar a chave privada para uma instalação limpa 2017-11-26 18:26:02 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve