Como o sudo -E trabalha aqui?

2

Eu executei o seguinte comando para adicionar um repositório ppa no Ubuntu:

sudo add-apt-repository ppa:ppaname/ppa

Este comando retornou um erro que o formato do nome do ppa não está correto. Então eu olhei aqui e assim, executei o seguinte comando:

sudo -E add-apt-repository ppa:ppaname/ppa

O comando acima funcionou como mágica. Então eu li a man page para sudo que dizia que sudo -E preserva as variáveis de ambiente. O que eu não entendo é como preservar as variáveis do ambiente me ajudou aqui?

Observação: estou trabalhando por trás de um proxy.

    
por crisron 09.01.2015 / 08:00

1 resposta

4

Se você usar proxy para fazer conexão com a Internet, talvez o seu sistema defina uma variável de ambiente para o usuário definir o IP do servidor proxy. Quando você usa o sudo sem a opção -E , suas variáveis de ambiente não são preservadas, portanto, você não pode se conectar à Internet, fazendo com que add-apt-repository mostre esse erro. Verificando o código-fonte de add-apt-repository , você pode ver:

try:
    ppa_info = get_ppa_info_from_lp(user, ppa_name)
except HTTPError:
    print _("Cannot add PPA: '%s'.") % line
    if user.startswith("~"):
        print _("Did you mean 'ppa:%s/%s' ?" %(user[1:], ppa_name))
        sys.exit(1) # Exit because the user cannot be correct
    # If the PPA does not exist, then try to find if the user/team 
    # exists. If it exists, list down the PPAs
    _maybe_suggest_ppa_name_based_on_user(user)
    sys.exit(1)

Portanto, se você não conseguir se conectar à Internet, _maybe_suggest_ppa_name_based_on_user() será chamado. E aqui está sua implementação:

def _maybe_suggest_ppa_name_based_on_user(user):
    try:
        from launchpadlib.launchpad import Launchpad
        lp = Launchpad.login_anonymously(lp_application_name, "production")
        try:
            user_inst = lp.people[user]
            entity_name = "team" if user_inst.is_team else "user"
            if len(user_inst.ppas) > 0:
                print _("The %s named '%s' has no PPA named '%s'" 
                        %(entity_name, user, ppa_name))
                print _("Please choose from the following available PPAs:")
                for ppa in user_inst.ppas:
                    print _(" * '%s':  %s" %(ppa.name, ppa.displayname))
            else:
                print _("The %s named '%s' does not have any PPA"
                        %(entity_name, user))
        except KeyError:
            pass
    except ImportError:
        print _("Please check that the PPA name or format is correct.")

Você pode ver, ele mostrará a mensagem Please check that the PPA name or format is correct se não puder importar Launchpad . Você precisa instalar o python-launchpadlib para tornar a importação bem-sucedida.

Nota

Acho que é ambíguo relatar essa mensagem, desde quando o launchpadlib também precisa de conexão com a internet para funcionar. Nesse caso, o script deve verificar se a conexão com a Internet está inativa ou não informar com mais clareza.

    
por 09.01.2015 / 08:40