A saída do comando Cat varia de maneira incomum em relação a * caractere

2

Estou executando o seguinte comando em uma instalação do Ubuntu 11.04 razoavelmente padrão em execução no vSphere:

sudo cat /home/*/.ssh/authorized_keys

Basicamente, estou usando o fantoche para gerenciamento de chaves ssh e queria garantir que as chaves estivessem presentes. O que é incomum sobre esse comando simples é que as chaves são mostradas apenas para dois usuários (o primeiro e o terceiro usuário criados no usuário, se isso for relevante) quando o * deve capturar algo como 7 ou 8 casas dos usuários.

A parte intrigante é que, se eu correr

sudo cat /home/user.name/.ssh/authorized_keys

onde user.name é o nome de um usuário aleatório (não um dos dois que já aparecem), não só obtenho a saída correta do cat, mas da próxima vez que executar

sudo cat /home/*/.ssh/authorized_keys

a saída mostra 3 arquivos chave! Dois arquivos para os dois usuários mostrados anteriormente e um terceiro arquivo que é o usuário cujo arquivo de chave eu olhei apenas manualmente.

Eu posso continuar a jogar esse "jogo", e cada vez que eu especificar manualmente um usuário e depois executar o comando *, esse usuário visualizado anteriormente aparecerá na saída globbed. Para mim, isso é um comportamento incomum, especialmente para uma imagem padrão do Ubuntu. Há algo que estou perdendo? Propriedades especiais de * expansão ou gato?

Editar: Esqueci de mencionar que esse comportamento "redefine" se eu deixar a sessão ssh para o servidor. Com isso, quero dizer que posso efetuar logout e login novamente via SSH, e estou de volta às condições iniciais (apenas duas contas de usuário são mostradas com *).

    
por Richard Martinez 13.07.2012 / 03:49

2 respostas

3

Lembre-se de que a linha de comando é analisada e os curingas são substituídos ANTES de serem executados.

Se você especificar o nome de usuário, o comando sudo ... poderá ver o arquivo porque está acessando-o como root.

Quando você digita '*', seu shell USER expande para os caminhos que ele pode ver , bem ... os caminhos que permitem ao usuário atual pesquisar os subdiretórios.

Você pode tentar colocar a string de caminho nas citações SINGLE para evitar a expansão, não tenho certeza se funcionará, pois a maioria dos programas unix espera que o shell expanda curingas e, portanto, não realize a ação globbing.

EDIT: Um pensamento sobre como realizar seu objetivo de ler os arquivos de chaves autorizados para todos os usuários:

sudo find /home -name "authorized_keys" -exec cat "{}" \; > all_the_data

Talvez bruto, mas funcionará já que você está executando a pesquisa de arquivos como raiz, não como usuário.

Eu suponho outra maneira:

sudo 'find /home -name "authorized_keys" -print0 | xargs -0 cat' > all_the_data

O que é melhor no processo conta, já que ele acumula todos os nomes de arquivo e depois 'gato deles ... mas eu gosto do primeiro, nenhuma citação especial é necessária.

As aspas (simples ou não) em todo o comando são necessárias devido ao comando pipe. Tanto o comando find como o comando xargs DEVEM ser executados como root. Sim, mais complicado que o primeiro.

    
por 13.07.2012 / 03:58
0

Eu não tenho uma explicação direta sobre por que a globbing está fazendo o que está fazendo, mas sei como você pode reescrever seu script para realizar o que deseja:

for i in /home/*; do if [ -d "/home/${i}" ]; then sudo cat "/home/${i}/.ssh/authorized_keys"; fi; done

Eu não conheço nenhum recurso do bash que faça com que ele seja diferente dependendo dos comandos anteriores, então pode ser um bug ou um recurso (não documentado) muito profundamente enterrado. Eu nunca uso globs para diretórios; Eu sempre uso o comando find para um loop for. Não confio em globs para fazer a coisa certa com qualquer padrão que contenha /*/ .

    
por 13.07.2012 / 04:08