Como o bash sabe como está sendo invocado?

6

Instalei jailkit em Ubuntu 12.04 e configurei o shell de um usuário para /bin/bash , mas quando ele é chamado, ele executa /etc/bash.bashrc em vez de /etc/profile

Se você não usou jailkit , aqui está a essência:

  1. Uma versão "presa" da raiz do sistema é criada em algum lugar, como / home / jail
  2. Diretórios iniciais de usuários presos são movidos para dentro dessa pasta como / home / jail / home / testuser
  3. Arquivos de configuração relevantes são copiados para / home / jail / etc / - incluindo um / etc / passwd limitado
  4. Os programas aos quais você deseja permitir acesso são copiados para os diretórios correspondentes, como / bin / bash
  5. Quando um usuário preso faz o login, ele é chrooted para / etc / jail / e não pode ver nenhum arquivo acima desse

Então eu tenho um testuser que tem uma entrada em /etc/passwd assim:

testuser:x:1002:1003::/home/jail/./home/testuser:/usr/sbin/jk_chrootsh

No arquivo /home/jail/etc/passwd , há uma entrada como:

testuser:1001:1003::/home/testuser:/bin/bash

Eu li o bash(1) e então acho que o problema é que o bash acha que ele não está sendo invocado como um shell de login:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists.

Eu entendo que bash está realmente sendo invocado por /usr/sbin/jk_chrootsh , mas não entendo como bash está determinando que tipo de shell ele é e que conjunto de arquivos de inicialização ele deve executar.

Gostaria de ver se consigo solucionar isso, mas não entendo:

Como o bash sabe como está sendo invocado?

ps: Eu também procurei login(1) sem muita sorte.

    
por cwd 03.06.2013 / 06:46

3 respostas

7

Normalmente, o bash sabe que é um shell de login, porque quando o programa de login o invoca, diz ao bash que seu nome é -bash . Esse nome está no argv[0] , o argumento da linha de comando do zeroth, que é convencionalmente o modo como o usuário invocou o programa. O hífen inicial é uma convenção para dizer ao shell que ele é um shell de login. O Bash também se comporta como um shell de login se você passar a opção --login ou -l . Consulte Diferença entre o Shell de Login e o Shell de Não Login para mais detalhes.

A partir do Jailkit 2.16, jk_chrootsh lê o caminho absoluto para o shell a ser chamado de várias origens e passa esse caminho como argv[0] e passa seus próprios argumentos de linha de comando para esse shell. No caso de uso normal, em que jk_chrootsh é usado em /etc/passwd , não há como passar um argumento como -l . Como o caminho absoluto não começa com - , não há como fazer com que jk_chrootsh invoque um shell de login, mesmo usando um minúsculo programa intermediário.

#include <unistd.h>
int main () {
    execl("/bin/bash", "-bash", NULL);
    return 127;
}

Eu esperava que jk_chrootsh tivesse uma maneira fácil de invocar um shell de login. Sugiro fazer uma solicitação de recurso.

    
por 04.06.2013 / 01:25
6

login chama o comando de login / shell do usuário com seu argv[0] começando com - . Os shells verificam seu argv[0] para determinar se estão sendo chamados como um shell de login.

Como diz o @slm, está claramente especificado na seção "Invocação" do manual bash .

Além disso, alguns shells como csh , tcsh , ksh , zsh , yash , bash e algumas variantes do shell Almquist suportam a opção -l para ativar o modo login sem ter que se misturar com o primeiro argumento. Isso não é usado por login , mas você pode usá-lo se quiser simular um shell de login de algo (como a maioria dos shells), onde é difícil executar um comando com um argv[0] arbitrário. Eu vi isso usado por gerentes de login gráficos.

    
por 03.06.2013 / 15:37
2

Dê uma olhada na página man do bash . Eles discutem as diferenças em como isso pode ser invocado lá. A seção é chamada INVOCATION . As duas maneiras principais que ele é chamado são como um shell de login ( bash -l ) e como um shell interativo ( bash -i ).

Veja este outro Q & de Unix e Linux intitulado: Diferença entre o Shell de Login e o Shell de Não Login? . Isso cobre exatamente o que você está perguntando.

    
por 03.06.2013 / 07:24