Como se conectar ao servidor ssh em execução no Linux incorporado sem / etc / passwd?

2

Depois de instalar o servidor ssh em minha máquina remota (que executa o Linux embarcado), tentei me conectar ao servidor ssh da máquina host, mas ele falhou.

Isso ocorre porque não consegui especificar a conta de usuário ao conectar-me ao ssh-server (a conexão ssh requer a inserção da senha de uma conta), pois o meu Linux incorporado de destino não possui /etc/passwd e /etc não gravável. Portanto, não há contas de usuário nesse sistema.

Temos maneiras alternativas de nos conectarmos ao ssh-server na máquina remota da máquina host? Eu quero fazer login como usuário root.

Esta pergunta é uma continuação da minha pergunta anterior Como verificar minha conta no Linux incorporado sem" / etc / passwd "?

    
por kolar 30.07.2014 / 09:38

1 resposta

3

O Dropbear chama a getpwnam função de biblioteca padrão para obter informações sobre contas de usuários. Em sistemas com GNU libc (a biblioteca padrão para sistemas Linux não embarcados), esta função pode consultar vários tipos de bancos de dados através do Mecanismo NSS , incluindo /etc/passwd . Os sistemas embarcados podem executar uma variedade de libc (uClibc, dietlibc,…) e tendem a ter o caminho /etc/passwd cozido.

Falta de correção e recompilação de dropbear (ou sua libc), você terá que fornecer esse arquivo /etc/passwd de alguma forma. Existem maneiras de fazer com que arquivos extras apareçam sobre um sistema de arquivos de somente leitura, não modificando o sistema de arquivos, mas instruindo o kernel a fornecer arquivos de um sistema de arquivos diferente nesses locais. O mecanismo genérico é uma união montada , mas os sistemas Linux incorporados muitas vezes não possuem um bom recurso de união.

Uma maneira relativamente simples de substituir uma localização do sistema de arquivos com conteúdo diferente é mount --bind . Depois de executar o comando mount --bind /else/where / some / onde , any access to a file / algum / onde / somefile actually accesses the file / else / onde / somefile ; any file in the “true” / else / onde is hidden. However, you cannot directly make a file appear this way: both / else / onde and / some / where have to exist (although they don't have to be directories). So you can't make / etc / passwd come into existence, but you can override / etc '.

  1. Crie um diretório que contenha seu substituto para /etc . Digamos que seja /custom/etc .

    mkdir /custom/etc
    
  2. Crie um ponto de montagem onde você irá realocar o original /etc/ .

    mkdir /custom/original-etc
    
  3. Crie links simbólicos na substituição etc para arquivos no original.

    cd /etc
    for x in *; do ln -s "../original-etc/$x" "/custom/etc/$x"; done
    
  4. Crie um arquivo passwd na sua hierarquia etc de substituição.

    echo "root:x:0:0:root:/:/bin/sh" >/custom/etc/passwd
    

No momento da inicialização, primeiro execute uma montagem de ligação para criar uma exibição da hierarquia /etc original em /custom/original-etc e, em seguida, execute uma montagem de ligação para criar uma exibição de sua substituição /etc at /etc . Coloque esses comandos em um script que é executado durante a inicialização (o mesmo script onde você inicia o servidor dropbear, obviamente antes de iniciar o dropbear).

mount --bind /etc /custom/original-etc
mount --bind /custom/etc /etc
    
por 31.07.2014 / 03:26