Existem shells de login não interativos?

10

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

    
por Captain Man 03.02.2016 / 16:26

2 respostas

5

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

Você está correto em dizer que /bin/bash --login some-script.sh produzirá uma invocação de Bash de login não interativa, e esse talvez seja um exemplo patológico. Há um caso, talvez incomum, mas não verdadeiramente estranho, que produz um shell de login não interativo: ssh somehost < some-file . Aqui sshd iniciará Bash com argv[0] definido como -bash porque não foi dado um comando para executar, fazendo com que o Bash se considere um shell de login, mas, como stdin não está conectado a um terminal, o Bash não definirá para o modo interativo ( $- não conterá i ).

(Pessoalmente, esse caso parece muito mais razoável do que o inverso, ssh somehost somecommand , que não é considerado um "shell de login", embora seja um login recente para somehost , assim como o acima é.)

Recentemente, fiz o que deveria ter feito há muito tempo e criei uma tabela de Modos do Bash e quais arquivos init são executados . Se você está achando confuso, tenha coragem nisso, pelo menos eu também. Me deixa perplexo qual era o objetivo original deles com as regras sobre quando .bashrc é executado.

    
por 14.10.2017 / 15:40
1

A maioria dos shells de login 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/bash e /bin/sh são shells 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 uma delas faz, basta procurar a página de manual (por exemplo, man nologin ou man sync ).

O que o comando realmente faz

Olhando para o histórico de postagens do Capitão Man, vejo que eles são bastante inexperientes com o Unix. Então, talvez a pergunta no comentário sobre não seguir relacionado à linha de comando no topo da resposta, não simplesmente a saída. Então eu vou explicar a linha de comando também, mesmo que seja fora do tópico para essa pergunta.

O comando é um pipeline Unix . Um pipeline é uma cadeia de comandos - você o lê da esquerda para a direita - no 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 fim do pipeline. A saída do último processo é mostrada no terminal (a menos que tenha sido redirecionada). Veja a entrada da Wikipedia nos oleodutos da shell para 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 dos comandos que estão sendo usados (aqui, awk , sort e uniq ). Na verdade, você deveria fazer isso agora. Vou esperar.

Vamos executar os estágios do pipeline incrementalmente (você pode fazer isso com segurança no 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 arquivo /etc/passwd . Esse é o banco de dados (flat-text-file) que informa ao sistema o que é o shell de login de todo mundo. Se você quiser saber mais sobre /etc/passwd apenas leia (é legível por todos) e veja a página de manual para isso (man 5 passwd) .

Então, lendo toda a lista, você pode ter uma idéia do que são os itens populares, mas não é um bom formato para uma resposta a essa pergunta, porque a questão era realmente sobre como os shells não interativos são comuns. Vamos contá-los. 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 uniq para nos mostrar somente os itens exclusivos:

~ $ awk -F: '{print $ 7}' < / etc / passwd | classificar | uniq | sed-e '/ ^ / /'     / bin / bash     / 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 man page!):

~$ 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 na 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 depois de 23. O problema é que os itens estão sendo classificados lexicograficamente . Vamos pedir ao sort para ordená-los numericamente e na 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

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

    
por 07.02.2016 / 00:00

Tags