Existem shells de login não interativos?


14

Eu sei qual é a diferença entre shells interativos / não interativos e de login / não login, mas parece que, na prática, nunca haverá um shell de login não interativo, a menos que você tenha algo parecido /bin/bash --login some-script.shem um script (e até isso parece um pouco estranho). Isso está correto ou eles são mais comuns?


7
telnet towel.blinkenlights.nlpara um shell de login que é não-interativo ;-)
Martin Tournoij

1
Esta pergunta é respondida brevemente dentro desta resposta mais longa .
Curinga

@CaptainMan: Olhando para as respostas, temos duas focadas em significados bastante diferentes de "interativo". À luz disso, você pode expandir um pouco sua resposta para explicar qual o significado que estava usando quando fez a pergunta?
Curt J. Sampson

Respostas:


10

Suponho que você esteja falando do conceito do Bash de shells de login vs. não-login e interativos vs. não-interativos, conforme descrito na seção Invocação da página de manual. (Isso é diferente da interpretação na resposta de James Youngman de qualquer comando arbitrário usado como "shell" (ou intérprete de comando do usuário) no passwd(5)arquivo e se esse programa aceita ou não a entrada do usuário; alguns, como /usr/sbin/nologinobviamente não. )

Você está certo ao /bin/bash --login some-script.shproduzir uma chamada Bash de logon não interativa, e esse talvez seja um exemplo patológico. Há um caso, talvez incomum, mas não realmente estranho, que produz um shell de login não-interativo: ssh somehost < some-file. Aqui sshd, o Bash será iniciado com argv[0]set como -bashporque não recebeu um comando para executar, fazendo com que o Bash se considere um shell de login, mas, como o stdin não está conectado a um terminal, o Bash não se configurará no modo interativo ( $-não conterá i) .

(Pessoalmente, esse caso parece muito mais razoável do que o inverso, ssh somehost somecommandque não é considerado um "shell de login", mesmo que seja um novo login, somehostexatamente como acima).

Recentemente, fiz o que deveria ter feito há muito tempo e montei uma tabela dos modos do Bash e quais arquivos init são executados . Se você está achando isso confuso, lembre-se de que pelo menos eu também. Me confunde qual era seu objetivo original com as regras sobre quando .bashrcé executado.


1

A maioria dos shells de logon por contagem em um sistema recém-instalado é não interativa, na verdade:

$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
  5 /bin/bash
 23 /bin/false
  1 /bin/sh
  1 /bin/sync
 17 /usr/sbin/nologin

Claramente /bin/bashe /bin/shsão conchas tradicionais e são interativos. Mas todos os outros itens dessa lista são não interativos. Se você estiver lendo a lista e não souber o que um deles faz, basta procurar sua página de manual (por exemplo man nologinou man sync).

O que o comando realmente faz

Olhando para o histórico de postagens do Capitão Man, vejo que eles são inexperientes com o Unix. Portanto, talvez a pergunta no comentário sobre não seguir esteja relacionada à linha de comando na parte superior da resposta, não simplesmente à saída. Então, explicarei a linha de comando também, mesmo que seja realmente fora de tópico para esta pergunta.

O comando é um pipeline Unix . Um pipeline é uma cadeia de comandos - você lê da esquerda para a direita - na qual a saída do primeiro comando se torna a entrada do segundo, a saída do segundo se torna a entrada do terceiro e assim por diante, até que o final do pipeline. A saída do último processo é mostrada no terminal (a menos que tenha sido redirecionado). Veja a entrada da Wikipedia sobre pipelines de shell para obter mais informações.

Se você não entender o que um pipeline está fazendo, basta executá-lo em segmentos para ver o que está acontecendo. Você também pode ler a página de manual para os comandos que estão sendo usados (aqui, awk, sorte uniq). De fato, você deve fazer isso agora. Eu vou esperar.

Vamos executar os estágios do pipeline de forma incremental (você pode fazer isso com segurança em seu próprio sistema Unix):

~$ awk -F:  '{print $7}' <  /etc/passwd | sed -e 's/^/    /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]

A saída acima é simplesmente o conteúdo do sétimo campo do /etc/passwdarquivo. Esse é o banco de dados (arquivo de texto simples) que informa ao sistema o que é o shell de login de todos. Se você quiser saber mais, /etc/passwdbasta lê-lo (é legível para o mundo) e consulte a página de manual (man 5 passwd).

Portanto, lendo a lista completa, você pode ter uma idéia de quais são os itens populares, mas esse não é um bom formato para uma resposta a essa pergunta, porque a pergunta era realmente sobre o quão comuns são os shells não interativos. Vamos contar eles. A maneira mais simples de fazer isso é classificar os itens primeiro:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]

Podemos usar o programa uniqpara nos mostrar apenas os itens exclusivos:

~ $ awk -F: '{print $ 7}' </ etc / passwd | classificar | uniq / / / / / / bin / bash / sed / bin / false / bin / sh / bin / sync / usr / sbin / nologin

Mas espere, não adianta, quantos de cada um estavam lá? Vamos perguntar uniq(leia a página de manual!):

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c
      5 /bin/bash
     23 /bin/false
      1 /bin/sh
      1 /bin/sync
     17 /usr/sbin/nologin

Essa é a saída que vimos no topo da resposta, é claro. Vamos classificá-lo novamente para ver as entradas em ordem:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort
     17 /usr/sbin/nologin
      1 /bin/sh
      1 /bin/sync
     23 /bin/false
      5 /bin/bash

Espere, isso não pode estar certo, 17 vem antes de 1 e 5 após 23. O problema é que os itens estão sendo classificados lexicograficamente . Vamos pedir sortpara classificá-los numericamente e em ordem inversa:

~$ awk -F:  '{print $7}' <  /etc/passwd | sort | uniq -c | sort -n -r
     23 /bin/false
     17 /usr/sbin/nologin
      5 /bin/bash
      1 /bin/sync
      1 /bin/sh

Eu acho que isso explica tudo na resposta original. Se você ainda não tiver certeza dos detalhes sobre o que esses comandos fazem, poderá ler as páginas do manual. Se você ainda não está claro sobre os princípios do que está acontecendo, pode ser melhor começar lendo um livro (online ou em papel) explicando o Unix e o Linux.


Você pode explicar um pouco mais, por favor? Não sei se sigo o que estou lendo.
Captain Man

é /bin/syncuma concha? qualquer utilidade é um shell?
Eloone

@eloone existem dois (talvez três) significados para "shell". Um é, programas configurados como um shell de login no banco de dados de senhas. Este é o significado da palavra pretendida pela frase "shell de login não interativo". O outro significado é "um REPL adequado para o trabalho interativo do dia-a-dia em um sistema Unix". Esses são interativos. No entanto, a maioria dos programas utilizáveis ​​no contexto REPL também suporta o uso não interativo como intérpretes para algum tipo de linguagem de script (embora "shell script" quase universalmente signifique "script Bourne-family-shell").
James Youngman

2
Você parece estar respondendo a uma pergunta diferente. Você está apenas listando as conchas disponíveis e apontando que algumas nunca serão interativas. Acredito que o OP esteja perguntando se um shell de logon não interativo já foi encontrado na natureza. Portanto, se os shells que podem ser interativos, bash, por exemplo, lançam shells de logon não interativos . Em outras palavras, um "shell de login" aqui, não significa "shell de login padrão de um usuário", significa um shell que foi iniciado como um shell de login . Veja unix.stackexchange.com/a/46856/22222
terdon

1
Ou talvez, dado que o pôster escreva explicitamente bash --logina pergunta, ele está perguntando especificamente sobre bashprocessos que não têm a iopção definida. (Estas surgem a partir de comandos, tais como ssh somehost < script.sh, o que irá ser um "início de sessão, não interactivo" shell nos sentidos indicados no INVOCATION secção da página de manual Bash.)
Curt J. Sampson
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.