Erro estranho na sintaxe bash dependendo do uso do sudo

1

Eu fiz esta função bash para detectar se o usuário em execução está realmente logado como usuário root e não está usando o sudo, verificando o diretório home uid + do usuário que está executando o comando:

#!/bin/bash

set -x
function check_root(){
  home='sh -c 'cd ~/ && pwd''
  if [ "$home" != "/root" ] || [ "$(id -u)" != "0" ]; then
    echo -e "This script can only be executed by the root user, not with sudo  elevation"
  exit 1
  fi
}

check_root

Quando eu o executo como usuário comum (uid 1000), ele funciona como esperado:

++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/home/jake
++ '[' /home/jake '!=' /root ']'
++ echo -e 'This script can only be executed by the root user, not with sudo    elevation'
This script can only be executed by the root user, not with sudo elevation
++ exit 1

Quando eu o executo como root, ele também funciona como esperado:

++ check_root
+++ sh -c 'cd ~/ && pwd'
++ home=/root
++ '[' /root '!=' /root ']'
+++ id -u
++ '[' 0 '!=' 0 ']'

Mas quando eu corro como usuário regular (uid 1000) com sudo elevation eu recebo isso:

./check_root.sh: 4: ./check_root.sh: Syntax error: "(" unexpected

Informações do sistema:

Linux jake 3.11.0-26-genérico # 45 ~ precise1-Ubuntu SMP Ter Jul 15 04:02:35 UTC 2014 x86_64 x86_64 x86_64 GNU / Linux

bash --version GNU bash, versão 4.2.25 (1) -release (x86_64-pc-linux-gnu)

    
por Jake 14.11.2014 / 18:40

1 resposta

0

Eu resolvi isso enquanto isso, mas ainda não publiquei a solução - acabou sendo relacionada à sintaxe:

Soluções de trabalho:

function check_root {
 stuff..
}

e

function check_root () {
 stuff..
}

Por exemplo, remover o () da declaração da função ou garantir que ela seja separada por espaços em ambos os lados, corrige-a.

Aqui está o que eu encontrei na manchage bash que me fez identificar o erro:

Shell Function Definitions
       A shell function is an object that is called like a simple command and executes a compound command with a new set of positional parameters.  Shell functions are declared as follows:

       name () compound-command [redirection]
       function name [()] compound-command [redirection]
              This defines a function named name.  The reserved word function is optional.  If the function reserved word is supplied, the parentheses are optional

Mas ... eu não tenho idéia do que exatamente faz o bash se comportar dessa maneira neste caso.

    
por 23.01.2015 / 10:55