Diferencie login interativo e shell não-interativo não-interativo

17

Estou tentando diferenciar esses quatro termos login, não-login, interativo e não interativo :

  • interativo - shell de login
  • interativo - shell de não login
  • não interativo - shell de login
  • não interativo - shell de não login

Como eu entendo que o interactive - non login shell : Inicie o sistema, faça o login no sistema e abra o terminal e o não interativo - login shell : telnet para o sistema e log in

Mas e um shell de login interativo?
Ele faz o login no sistema, abre o terminal virtual e faz o login? e
não interativo - shell sem login, ele está executando script automatizado no crontab?

    
por d a i s y 03.02.2017 / 11:06

3 respostas

26

O único verdadeiro equívoco que você parece ter é sobre o que constitui um shell de login não interativo.

Resumidamente (veja aqui para mais detalhes), com exemplos:

  • shell de login interativo: você faz login em um computador remoto por meio de, por exemplo, ssh . Alternativamente, você coloca um tty em sua máquina local ( Ctrl + Alt + F1 ) e efetua login lá.

  • shell interativo de não-login: abra um novo terminal.

  • shell não-interativo não interativo: execute um script. Todos os scripts são executados em seu próprio subshell e esse shell não é interativo. Ele só abre para executar o script e fecha imediatamente quando o script é concluído.

  • shell de login não interativo: isso é extremamente raro, e você não consegue encontrá-lo. Uma maneira de iniciar um é echo command | ssh server . Quando ssh é iniciado sem um comando (portanto, ssh em vez de ssh command , que executará command no shell remoto), ele inicia um shell de login. Se o stdin do ssh não for um tty, ele iniciará um shell não interativo. É por isso que echo command | ssh server lançará um shell de login não interativo. Você também pode iniciar um com bash -l -c command .

Se você quiser brincar com isso, você pode testar os vários tipos de shell da seguinte forma:

  • Este shell é interativo?

    Verifique o conteúdo da variável $- . Para shells interativos, incluirá i :

    ## Normal shell, just running a command in a terminal: interacive
    $ echo $-
    himBHs
    ## Non interactive shell
    $ bash -c 'echo $-'
    hBc
    
  • Este é um shell de login?

    não maneira portátil de verificar isso, mas, para o bash, você pode verificar se a opção login_shell está definida:

    ## Normal shell, just running a command in a terminal: interacive
    $ shopt login_shell 
    login_shell     off
    ## Login shell; 
    $ ssh localhost
    $ shopt login_shell 
    login_shell     on
    

Colocando tudo isso junto, aqui está um de cada tipo possível de shell:

## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell     off

## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell     on

## Non-interactive, non-login shell
$ ssh localhost 'echo $-; shopt login_shell'
hBc
login_shell     off

## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell     on
    
por terdon 03.02.2017 / 12:47
5

Essencialmente, se um shell é um login ou não, interativo ou não importa por exatamente um motivo:

Os arquivos de inicialização e o conjunto de opções padrão dependem de o shell ser ou não um login e interativo ou não.

De forma correspondente, se um shell é login ou não, ou interativo, ou não, depende somente da chamada usada - o nome e as opções exatas do comando.

As duas propriedades são de outra forma ortogonais - se um shell é um login ou não, não tem influência em determinar se é interativo ou não.

O Bash inicia um shell de login se algum deles for verdadeiro:

  • argv[0] , o nome do comando para o qual foi invocado, começa com -
  • a opção -l está especificada

Similar, o bash inicia um shell interativo se algum deles for verdadeiro:

  • não foi especificado um arquivo para executar (ou seja, o comando não foi bash some/file ) ou uma sequência de comandos para executar ( bash -c 'foo' ) (a condição real é um pouco mais complexa, consulte o manual)
  • a opção -i foi especificada

Notadamente (e paradoxalmente), o último implica que bash -ic 'foo' inicia um shell interativo.

Então, o seguinte inicia um login, um shell interativo, mesmo que não tenha nada interativo sobre ele e a invocação não tenha nada a ver com o login:

bash -lic true

O login via console ou GUI inicia um shell de login (ou talvez não) é inteiramente um efeito do processo de login usando a chamada apropriada.

As condições e os efeitos são descritos em detalhes em o manual bash, seção sobre os arquivos de inicialização .

Uma das principais fontes de confusão é que há outro significado comum para o shell "login":

O shell de login de um usuário é o shell definido na entrada passwd do usuário (que pode vir de /etc/passwd , LDAP ou alguma outra fonte).

O programa login , SSH, etc. inicia este shell como um shell login no sentido previsto no resto da resposta - com um - no nome do comando, geralmente . Se você quisesse ser particularmente confuso, poderia dizer:

Alguns processos de login iniciam o shell de login do usuário como um shell de login.

Note que o login da GUI inicia um shell de login puramente porque os desenvolvedores acharam conveniente - o LightDM executa um script no login que obviamente não é interativo e certamente não depende do shell de login do usuário (no segundo sentido). No entanto, não dependa do gerenciador de exibição para iniciar um shell de login - nem todos eles fazem isso, e no Wayland e no GNOME, o processo de login não usa scripts de shell.

    
por muru 03.02.2017 / 14:45
3

Shell de login:

  

O primeiro processo que é executado sob nosso ID de usuário quando efetuamos login em uma sessão. O processo de login diz ao shell para se comportar como um shell de login com uma convenção: passar o argumento 0, que normalmente é o nome do executável do shell, com um caractere “-” prefixado

Shell interativo:

  

Lê os comandos da entrada do usuário em um tty. Entre outras coisas, esse shell lê arquivos de inicialização na ativação, exibe um prompt e ativa o controle de tarefas por padrão. O usuário pode interagir com o shell. Um shell executando um script é sempre um shell não interativo.

Simplificando: o shell interativo requer entrada do usuário, enquanto o shell não interativo é executado por scripts e não requer entradas do usuário.

    
por George Udosen 03.02.2017 / 11:20

Tags