Linux: O interpretador Shebang reclama de codificação quando executado como root

0

Fenômeno estranho: Um script Python é executado como um usuário sem privilégios, mas se recusa a usar como root:

doprea@mlll2584:~$ python /opt/updatednsfix.py
Please retry with super-user privileges

$ sudo su
# /opt/updatednsfix.py 
bash: /opt/updatednsfix.py: /usr/bin/python^M: bad interpreter: No such file or directory

dos2unix consertou (rodando como root, abaixo). Por que isso seria apenas um problema sob a raiz?

# dos2unix /opt/updatednsfix.py 
dos2unix: converting file /opt/updatednsfix.py to Unix format ...

# /opt/updatednsfix.py 
A record successfully updated in DNS
IPV4 PTR records successfully updated in DNS
    
por Dustin Oprea 23.03.2017 / 23:13

1 resposta

1

Havia um personagem adicional no final do seu shebang. ^M significa CR ou (outra notação) \r . Foi uma parte da sequência \r\n que é uma sequência final de linha no DOS e no Windows. dos2unix converteu a sequência para o único \n , o que está correto no Linux.

O shebang é tratado como um comentário quando você corre

python /opt/updatednsfix.py

, então o personagem adicional não importa. Meu teste indica que python não se importa com \r\n e faz o trabalho certo. Mas como root você escolheu uma maneira diferente de executar o script:

/opt/updatednsfix.py

e neste caso o shebang está sendo interpretado. O arquivo /usr/bin/python^M não foi encontrado - daí o erro.

Why would this only be a problem under root?

Não é sobre root . A diferença real estava em um método em que você executa o script: python /opt/updatednsfix.py vs. /opt/updatednsfix.py .

    
por 23.03.2017 / 23:29