sudo source: comando não encontrado

4

Eu quero rodar este programa como root. Ele ativa um ambiente virtual e executa um programa python nesse ambiente virtual.

O programa se parece com isso

$cat myfile.sh
source /pathto/venv/bin/activate
python /pathto/rsseater.py

Se eu apenas executar como root, obtenho

$ sudo ./myfile.sh 
./myfile.sh: 2: ./myfile.sh: source: not found

Eu encontrei isso mas se eu tentar adicionar sudo -s ao topo do arquivo parece alterar o prompt para um # - mas o python não é executado como esperado. Eu não tenho certeza do que o programa está fazendo quando eu tenho o sudo -s no topo do arquivo assim.

Como posso fazer com que este programa seja executado como root?

    
por bernie2436 10.07.2014 / 20:53

1 resposta

6

Você geralmente deseja adicionar uma chamada a um intérprete no topo de seus scripts, da seguinte forma:

$cat myfile.sh
#!/bin/bash

source /pathto/venv/bin/activate
python /pathto/rsseater.py

Isto pode parecer muito semelhante ao que você tem, mas é de fato muito diferente. Em seu cenário, você está tentando executar os comandos dentro do shell que são chamados quando você executa sudo . Com o exemplo acima, você está obtendo um shell Bash separado, que terá os vários comandos após a linha #!/bin/bash ser invocada dentro dele. #!/bin/bash resulta em um novo Bash shell sendo bifurcado.

Intérpretes e shebang

A nomenclatura de #! é chamada de shebang. Você pode ler mais sobre isso por meio dos vários Q & A neste site e também em Wikipedia . Mas é suficiente dizer, ele diz ao sistema que quando um determinado arquivo é "executado" (também conhecido como run) para carregar um programa do disco primeiro (um interpretador), que então recebe a tarefa de analisar o conteúdo do arquivo apenas executado.

NOTA: Essencialmente tudo depois da linha shebang.

Intérpretes

Um interpretador é qualquer programa que pode processar comandos, um de cada vez, a partir de um arquivo. Neste caso, estamos usando o shell Bash como o interpretador. Mas existem outros shells que você pode usar aqui também, como shell C ou shell Korne, entre outros.

Você também pode usar intérpretes de nível superior, como Perl, Ruby ou Python, da mesma maneira.

Por que o erro usando 'sudo -s'

Se você der uma olhada na página do manual de sudo , isso tem a dizer sobre -s :

 -s [command]
            The -s (shell) option runs the shell specified by the SHELL 
            environment variable if it is set or the shell as specified in 
            the password database.  If a command is specified, it is passed
            to the shell for execution via the shell's -c option.  If no 
            command is specified, an interactive shell is executed.

Então, quando você executar este comando:

$ sudo -s ./myfile.sh

O seguinte acontece:

$ /bin/sh
sh-4.2$ source somesource.bash 
sh: source: somesource.bash: file not found

O shell, /bin/sh não suporta o comando source .

    
por 10.07.2014 / 20:57

Tags