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 .