Diferenciar logon interativo e shell não interativo de não logon


25

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

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

Pelo que entendi
shell interativo - sem login : Inicie o sistema, faça login no sistema e abra o terminal e abra o terminal e
não interativo - login : telnet para o sistema e entre

Mas e um shell de logon interativo?
Ele efetua login no sistema, abre o terminal virtual e efetua login? e
shell não interativo - sem login, ele está executando scripts automatizados no crontab?

Respostas:


38

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

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

  • shell de login interativo: você faz login em um computador remoto via, por exemplo ssh. Como alternativa, você cai para um tty na sua máquina local ( Ctrl+ Alt+ F1) e efetua login nela.

  • shell interativo sem logon: abra um novo terminal.

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

  • shell de login não interativo: isso é extremamente raro e é improvável que você o encontre. Uma maneira de lançar uma é echo command | ssh server. Quando sshé iniciado sem um comando (portanto, em sshvez de ssh commandser executado commandno shell remoto), ele inicia um shell de login. Se o stdinde sshnão for um tty, ele inicia um shell não interativo. É por isso echo command | ssh serverque lançará um shell de logon não interativo. Você também pode começar um com bash -l -c command.

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

  • Esse 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 há uma maneira portátil de verificar isso, mas, para o bash, você pode verificar se a login_shellopção 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

Juntando tudo isso, 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
$ bash -c '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

Quero esclarecer que 1) Para mim, o login no gui significa iniciar o sistema, o login no sistema e o terminal aberto 2) fazer telnet ou ssh é o shell de logon interativo significa que o exemplo que eu forneci non-interactive login shellestá errado.
— 21417 margarida

@daisy obrigado pelo esclarecimento; resposta editada.
— terdon

bem e gui é shell non-login irrelevante, interativo: basta abrir um novo terminal local ou remotamente via telnet ou ssh
— daisy

@ Daisy sim, parece certo. Mas, por favor, leia atentamente a resposta de Muru, pois isso explica que, essencialmente, isso é uma questão de semântica e afeta apenas quais arquivos de inicialização são lidos pelo shell. Veja também aqui uma visão geral ainda mais abrangente dos diferentes tipos de shell.
— Terdon

Os shells de login não interativos não são incomuns, por exemplo, o git os usa, IIRC.
— quazgar

6

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

Os arquivos de inicialização e as opções padrão definidas dependem se um shell é logon ou não e interativo ou não.

Do mesmo modo, se um shell faz login ou não, ou é interativo ou não, depende apenas da chamada usada - o nome exato do comando e as opções.

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

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

  • argv[0], o nome do comando no qual foi chamado, começa com um -
  • a -lopção está especificada

Da mesma forma, 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 era 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 -iopção foi especificada

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

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

bash -lic true

O fato de que 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 efeitos são descritos em detalhes no manual do bash, seção Arquivos de inicialização .


Uma fonte importante de confusão é que existe outro significado comum para o shell "login":

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

O loginprograma, SSH, etc. inicia esse shell como um shell de login , no sentido indicado no restante da resposta - -geralmente com um líder no nome do comando. Se você quer ser particularmente confuso, pode dizer:

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

Observe que o login da GUI inicia um shell de login apenas 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). Porém, não dependa do gerenciador de exibição iniciar um shell de login - nem todos eles o fazem, e no Wayland e no GNOME, o processo de login não usa scripts de shell.


3

Shell de login:

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

Shell interativo:

Lê comandos da entrada do usuário em um tty. Entre outras coisas, esse shell lê os arquivos de inicialização na ativação, exibe um prompt e ativa o controle do trabalho 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 exige entradas do usuário.


Portanto, os exemplos que são dados corretos.
— margarida

Sim, você está no lugar certo.
— George Udosen

1
@daisy no! A GUI não tem absolutamente nada a ver com isso. Trata-se de shells de linha de comando, não shells gráficos (que também existem, mas são um animal diferente).
— terdon 3/02

1
@ George não, existem dois erros: efetuar login através da GUI não inicia um shell de login (ou qualquer outro tipo de shell relevante) e fazer login em um sistema remoto via telnet inicia um shell telnet, mas via ssh inicia um login interativo Concha.
— terdon

1
@ George, na verdade, estou corrigido. Alguns gerenciadores de login da GUI podem iniciar um shell de login para ler .profile(eu pensei que eles apenas originavam .profilemanualmente, mas posso estar errado ).
— terdon 3/02

0

Gostaria de mencionar que você pode iniciar um shell de logon interativo:

  1. executando sudo /bin/logine digitando suas credenciais
  2. executando exec -l /bin/bash
  3. executando su -
  4. e como as respostas acima mencionadas, usando ssh e faça login em uma máquina remota

Além disso, você pode verificar (no bash) se o shell está conectado digitando echo $0e se a saída começa com um traço -, então é um shell de login.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.