Por que o MOTD não exibe a saída de um script Python que chama fora do /etc/update-motd.d/ a menos que esteja neste diretório?

1

A situação

Estamos executando um servidor Ubuntu 14.10 sem cabeçote para atender a várias necessidades e testes. Eu estava experimentando alterar o MOTD para sessões SSH via /etc/update-motd.d/ para exibir as informações necessárias dinamicamente.

O problema que estou tendo é que quase qualquer tentativa de invocar um script Python para exibir os dados dinâmicos não funciona, a menos que eu inclua o script neste diretório. Ele reconhecerá que o arquivo "remoto" pode ser executado, mas não exibe nenhuma saída. Eu fiz um pouco de testes para descobrir por conta própria, mas - infelizmente! - sem sucesso. Eu fiquei bastante curioso sobre o porquê de se comportar assim.

Tudo que testei e descobri

Eu criei uma variável global de ambiente persistente que atua como um atalho para o nosso script /srv/hack.chat/WOTD . Digitar $CHAT em um shell irá imprimir a palavra gerada. O conteúdo deste arquivo é apagado e sobrescrito dinamicamente com o novo código a cada dia. Isso ocorre apenas porque estou escolhendo minhas palavras do dicionário american-english , que inclui marcas de aspas, exigindo, assim, um escape ( \ ) para evitar erros.

Eu comecei a mudar o MOTD com um arquivo chamado 00-linuxbox que criou uma mensagem estática estática e uma imagem ASCII "art". Perto do final do arquivo, ele chamou /srv/hack.chat/WOTD . Uma vez que este script fosse chamado, o resto do código em 00-linuxbox seria então ignorado. Eu tentei muitas maneiras diferentes de fazê-lo funcionar:

# Method 1: Use shortcut. Runs but no output to screen unless manually invoked
$CHAT

# Method 2: Exec. Bad practice. Immediately stops and runs command; remaing code is ignored
exec $CHAT

# Method 3: "Use this, not exec." Does not run at SSH MOTD.
#                                 Works when manually invoked afterwards.
if [ -x "$CHAT" ]; then
     $CHAT
fi

# Method 4: Call directly. Always runs but never shows any output, even if manually invoked
if [ -x "/etc/hack.chat/WOTD" ]; then
    /etc/hack.chat/WOTD
fi

Eu tentei chamar o script em um arquivo MOTD separado para ver se ele seria diferente, mas não houve mudança de comportamento. A única vez que tive sucesso foi quando eu clonei o script na pasta /etc/update-motd.d/ . Isso me deixou um pouco confuso.

Para esclarecer minha pergunta:

O MOTD exibirá qualquer saída de um script Python em /etc/update-motd.d/ . Ele não exibirá nenhuma saída de um script Python chamado de um script de shell MOTD. O que causa esse comportamento? Estou muito curioso para saber.

    
por Kamikaze Rusher 25.07.2015 / 03:07

1 resposta

0

É mais provável que a variável CHAT não esteja definida no ambiente em que os scripts motd estão sendo executados; é local para o seu processo de shell, não definido globalmente. Se você iniciar uma nova sessão de shell, você deve observar que a variável não está disponível.

Por padrão, o shell substitui as variáveis indefinidas como vazias, então a linha $CHAT é tratada como vazia, sem operação.

# 4 provavelmente não funciona porque o caminho especificado está incorreto: você está procurando o arquivo em /etc/hack.chat/WOTD, mas o arquivo não está lá, mas em /srv/hack.chat/ WOTD Você nem recebe uma mensagem de erro porque seu script primeiro verifica se o /etc/hack.chat/WOTD é executável, o que não é porque não há um arquivo nesse caminho e não tenta executá-lo .

    
por 12.05.2016 / 10:41