Link simbólico e sudo

10

Eu criei um link simbólico:

ln -s /tmp/folder1 /tmp/folder2

Então eu vou para / tmp / folder2 e corro pwd :

$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part

Por que pwd com sudo fornece o diretório original? Estou escrevendo um script bash e preciso do caminho absoluto do diretório atual. Com o sudo, parece que não consigo obter o diretório original.

    
por iDev247 08.05.2014 / 13:17

2 respostas

14

O comando pwd é um shell interno e / bin / pwd. Em circunstâncias normais, o builtin será executado em preferência a / bin / pwd. O comando pwd pode ser chamado como pwd -L ou pwd -P Tanto o padrão incorporado como / bin / pwd para pwd -L da página man

-L, --logical use PWD from environment, even if it contains symlinks

então, quando você executa o pwd, você executa pwd -L, que na verdade imprime $ PWD (se existir). Quando você executa sudo pwd , o sudo fornece apenas as variáveis de ambiente que foram instruídas a passar através das diretivas env_keep . Normalmente, o PWD não está nessa lista, portanto, o sudo pwd precisa descobrir onde está e, na verdade, é executado como pwd -P

-P, --physical avoid all symlinks

A maneira de resolver o problema é usar pwd -P se você deseja consistentemente o caminho do diretório físico ou (como @Felix diz) adicionar o PWD à lista de variáveis de ambiente para manter por meio de uma diretiva env_keep em sudoers

env_keep += "PWD"  
    
por 08.05.2014 / 14:01
6

No bash, pwd é incorporado. /bin/pwd produz o mesmo comportamento que sudo pwd .

Você vai querer

  1. use sudo pwd -L , que só funciona se você
  2. inclua Defaults env_keep=PWD no seu arquivo sudoers
por 08.05.2014 / 13:38