É possível que haja um shell de login que não seja interativo?

8

Ao interpretar este fluxograma

Euacheiquenohomembash:

Whenbashisinvokedasaninteractiveloginshell,orasanon-interactiveshellwiththe--loginoption,itfirstreadsandexecutescommandsfromthefile/etc/profile,ifthatfileexists.

Issoindicaqueosshellsdelogininterativoleem/etc/profile(sem--noprofile)

Alémdisso,osshellsnãointerativoscomaopção--loginread/etc/profile

Issoparecedeixaralgunsshellsloginpossíveis(nosquaiso$0começacom-)sendonão-interativo(executeumscript,talvezsimplescomodate)podenãoler(fonte)/etc/profile.

Paraconfirmarounegarestaideia:

Primeiro,tenteiusarsu-l-,queiniciaumshelldelogincom-comooprimeirocaractere,masnãoconsigotorná-lonãointerativo(epossoapresentarostestesparainvestigá-lo).

Chamandoalgocomo

$bash-c'date'-bash

Nãoreportaserumshelldelogin(mesmoseoprimeirocaractereforum-).

Trythistorevealthedetail:

$bash-c'echo"$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

The $0 has a - as the first character, there is no i (interactive) in the value of $- but it is not reported as a login_shell (the -u). In this case, /etc/profile was not read, but I am not sure this is the right test.

Há também a menção de "invólucros de login raros e não interativos" nesta resposta sem ser específico o suficiente para esta pergunta.

A conclusão desse cara é de que /etc/profile é sempre lido.

Leia a tabela de resumo: as camadas de login interativas e não interativas leem /etc/profile

E, se os exemplos desta página estiverem corretos:

Some examples

$ su bob                   # interactive non-login shell
$ su - bob                 # interactive login shell
$ exec su - bob            # interactive login shell
$ exec su - bob -c 'env'   # non-interactive login shell
$ ssh [email protected]      # interactive login shell, '~/.profile'
$ ssh [email protected] env  # non-interactive non-login shell, '~/.bashrc'

O teste de exec su - bob -c 'env' informa que /etc/profile foi lido.

Resumindo:

É possível ter um shell login não interativo (não chamado com --login ou -l)?

E, se for verdade, está lendo o arquivo /etc/profile ?

Se o acima for verdade, temos que concluir que os ALL login shells [interativos (ou não)] foram lidos / etc / profile (sem a opção --noprofile ).

Nota: para detectar que o / etc / profile está sendo lido, basta adicionar no início do arquivo este comando:

echo "'/etc/profile' is being read"
    
por Community 19.08.2016 / 13:27

4 respostas

2

Um shell de login não interativo é incomum, mas é possível. Se você iniciar o shell com o argumento zeroth (que normalmente é o nome do executável) definido como uma string começando com - , é um shell de login, seja ele interativo ou não.

$ ln -s /bin/bash ./-bash
$ echo 'shopt -p login_shell; echo $-' | HOME=/none PATH=.:$PATH -bash
shopt -s login_shell
hB

Sua tentativa bash -c date -bash não funcionou porque isso não diz ao shell para ser um shell de login: o argumento zeroth é bash , não -bash . Após o bash ter iniciado, ele define a variável $0 to -bash em vez do argumento zeroth, mas o argumento zeroth é o que importa.

Você pode executar um shell de login não interativo com su -l ou su - , mas precisa providenciar que a entrada padrão não seja um terminal e ainda possa ser autorizado (sem precisar digitar uma senha ou organizar sua senha para estar no início da entrada). Pode ser mais fácil com o sudo: execute sudo true para obter uma credencial de presença e, em seguida, enquanto a credencial ainda estiver válida, execute echo 'shopt -p login_shell; echo $-' | sudo -i .

Veja também Diferença entre o Shell de Login e o Shell de Não Login

    
por 20.08.2016 / 03:17
4

Eu já vi ambientes de login gráficos que fazem:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

ou o equivalente de:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

Para que o arquivo de inicialização da sessão (como ~/.profile para shells semelhantes a Bourne (e os correspondentes em /etc para alguns)) seja lido e aplicado.

O primeiro não funciona com todos os shells. -l é suportado por um grande número de shells, mas não todos, e em alguns, como csh / tcsh , não podem ser usados com -c . O primeiro caractere de argv[0] sendo - é entendido por todos os shells, já que é o que login usa para dizer aos shells que eles são shells de login.

No segundo caso, o stdin desse shell é algo diferente de um tty device ( << é implementado por um arquivo regular temporário ou um pipe dependendo do shell), portanto, o shell não é interativo ( a definição de ser interativo quando um humano interage com ele).

    
por 19.08.2016 / 16:00
3

Sim, shells de login não interativos são possíveis

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$
    
por 19.08.2016 / 15:45
0

Is it possible to have a non-interactive login shell (not called with --login or -l)?

SIM.

$ (exec -a '-' bash -c 'shopt -q login_shell && echo login shell')

No entanto, observe que /etc/profile não seria usado para um shell de login sem interação, a menos que o argumento --login seja fornecido.

Um idioma comum que chama um shell de login não interativo é:

$ su - someuser -c somecommand

Mas isso faz com que /etc/profile não seja executado.

É possível alterar esse comportamento, mas envolve personalizar o código-fonte do Bash em tempo de compilação removendo o comentário de uma opção encontrada em config-top.h :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

Quando eu pesquisou essa su de anomalia , descobri que outros shells incluindo zsh e dash não têm essa discrepância.

    
por 14.01.2017 / 13:04