comando sudo com sinal de igual (=) fica confuso para a variável de ambiente

1

Estou tentando executar vários comandos através do sudo , onde o sinal de igual ( = ) é uma parte do comando. Em certos casos, parece que sudo confunde esse sinal para configuração e variável de ambiente.

Eu vejo isso no sudo (8) man:

Environment variables to be set for the command may also be passed on the command line in the form of VAR=value...

Este é um problema para mim, por exemplo, se eu tentar executar um comando como:

sudo -i "cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls"

Na verdade, ele entra em um shell raiz em vez de executar o comando, pois o comando é mal interpretado. Eu vejo isso em sudo.log :

Apr 29 16:11:40 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; ENV=cd /tmp; /usr/bin/hadoop fs -D dfs.replication=2 -ls ; COMMAND=/bin/bash

Como você pode ver, o comando é mal interpretado como tentativa de configurar o ENV.

Se eu remover ocd /tmp; anterior, ele funcionará. No entanto, para algumas das minhas coisas, eu tenho que executar um comando cd ou algo similar primeiro.

Isto parece ser devido ao sinal de igualdade que faz com que sudo pense que estou configurando o ENV. Se eu remover o sinal de igual (ou seja, remover -D dfs.replication=2 ), ele funcionará e será registrado corretamente:

Apr 29 16:08:46 : my_user : TTY=pts/7 ; PWD=/home/my_user ; USER=root ; COMMAND=/bin/tcsh -c cd /tmp; /usr/bin/hadoop fs -ls

Portanto, minha pergunta é: Como faço para escapar desse caractere = e / ou faço o sudo ler o comando como um comando inteiro, em vez de pensar que um sinal de igualdade está configurando uma variável de ambiente?

Muito obrigado!

    
por redood 30.04.2014 / 01:18

1 resposta

0

Tente executar um comando shell via sudo em vez de passar um diretamente. Por exemplo, faça algo como:

sudo bash -c "cd /root; ls -al"

Naturalmente, este é um exemplo bobo, já que é possível executar sudo ls -al /root , mas esperamos que o ponto seja atingido.

Executar um comando shell é muito mais explícito do que passar um para sudo usando o -i flag, pois ele executará o shell atribuído ao usuário root em um determinado sistema. Além disso, quaisquer possíveis problemas com os arquivos de recurso de login do usuário root são evitados.

Bash (ou seu shell preferido) deve analisar o caractere = corretamente. Eu fui em frente e testei isso no meu fim para a integridade e não encontrei nenhum problema. Se não, no entanto, apenas escape do = , prefazendo-o com um caractere \ .

    
por 30.04.2014 / 07:39