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?

margarida
fonte

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
Terdon
fonte
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.

muru
fonte
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.

George Udosen
fonte
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.

SantaXL
fonte