Eu preciso disso para um teste de unidade. Há uma função que lstat no caminho do arquivo passado como parâmetro. Eu tenho que acionar o caminho do código em que a lstat
falha (porque a cobertura do código deve atingir 90%)
O teste pode ser executado apenas em um único usuário, portanto, eu queria saber se sempre existe um arquivo no Ubuntu, mas os usuários normais não têm acesso de leitura a ele ou a sua pasta. (Portanto lstat
, falharia com ele, a menos que seja executado como root.)
Um arquivo inexistente não é uma solução, porque existe um caminho de código separado para isso, que eu já estou acionando.
EDIT: A falta de acesso de leitura apenas ao arquivo não é suficiente. Com isso lstat
ainda pode ser executado. Consegui acioná-lo (na minha máquina local, onde tenho acesso root), criando uma pasta em / root e um arquivo nela. E definindo a permissão 700 na pasta. Então, eu estou procurando por um arquivo que está em uma pasta que só é acessível pela raiz.
fonte
/etc/shadow
/proc/1/fd/0
deve fazer.Respostas:
Nos sistemas Linux modernos, você deve poder usar
/proc/1/fdinfo/0
(informações para o descritor de arquivo 1 (stdout) do processo do id 1 (init
no espaço para nome raiz pid que deve estar sendo executado comoroot
)).Você pode encontrar uma lista com (como usuário normal):
(remova
-type f
se você não deseja restringir a arquivos regulares)./var/cache/ldconfig/aux-cache
é outro candidato em potencial se você precisar apenas considerar os sistemas Ubuntu. Ele deve funcionar na maioria dos sistemas GNU, pois/var/cache/ldconfig
é criado como read + write + searchable para root somente peloldconfig
comando que acompanha a GNU libc.fonte
/proc/1/fdinfo/0
funcionar no Ubuntu 16.04 e 18.04, é mais do que suficiente./proc/1/fdinfo/0
não necessariamente funciona em um contêiner (por exemplo, um contêiner do Docker) e, geralmente, são executados testes de unidade nesses contêineres no IC.Olhando a página de manual lstat (2) , você pode obter alguma inspiração sobre casos que podem causar falhas com erros diferentes de ENOENT (o arquivo não existe).
O mais óbvio é:
Então você precisa de um diretório do qual não possa pesquisar.
Sim, você pode procurar por um que já esteja em seu sistema (talvez
/var/lib/private
se ele existir?) Mas é melhor criar um você mesmo, com o equivalente a:A operação lstat (2) falhará com o EACCES aqui. (A remoção de todas as permissões do diretório garante isso. Talvez você nem precise muito disso e a
chmod -x
remoção de permissões de execução seria suficiente, pois são necessárias permissões de execução em um diretório para acessar arquivos nele.)Existe outra maneira criativa de fazer com que o lstat (2) falhe, olhando para a página de manual:
Portanto, tentar acessar um arquivo como
/etc/passwd/nonexistent
deve acionar esse erro, que novamente é diferente de ENOENT ("Não existe esse arquivo ou diretório") e pode atender às suas necessidades.Outro é:
Mas você pode precisar de um nome realmente longo para este (acredito que 4.096 bytes é o limite típico, mas seu sistema / sistema de arquivos pode ter um mais longo.)
Finalmente, é difícil dizer se algum deles será realmente útil para você. Você diz que deseja algo que não aciona o cenário "o arquivo não existe". Embora normalmente isso signifique um erro ENOENT, na prática muitas verificações de nível superior simplesmente interpretam quaisquer erros do lstat (2) como "não existe". Por exemplo,
test -e
ou o equivalente[ -e ...]
do shell pode simplesmente interpretar todos os itens acima como "não existe", especialmente porque ele não tem uma boa maneira de retornar uma mensagem de erro diferente e não retornar um erro implicaria a existência do arquivo, o que certamente não é o caso.fonte
Você pode fazer
find
isso sozinho.Usando
/etc
- o diretório dos arquivos de configuração como ponto de partida:No meu sistema, isso não retorna nada.
Você pode ser um grupo menos restritivo e permitir
root
(apenas o usuárioroot
deve ser um membro do gruporoot
) e procurar uma permissão para440
:No meu sistema, isso retorna:
Editar:
Com base na sua edição, você está procurando um diretório que não tenha permissão suficiente para o usuário que está invocando para impedir a listagem de diretórios:
aqui estou procurando diretórios (
-type d
) que não possuem os bits de permissão de leitura-gravação-execução para outros (o-rwx
) e pertencem aroot:root
.Tecnicamente, apenas a ausência do
x
bit execute ( ) impediria uma listagem de diretório (lstat(2)
) no diretório.Na saída que encontrei
/run/systemd/inaccessible/
no meu sistema baseado em init do Systemd.Em relação a arquivos em
/proc
,/sys
,/dev
:Esses sistemas de arquivos são FS virtuais, ou seja, residem na memória, não no disco
Se você planeja confiar
/proc
, use,/proc/1/
ou seja, conte com algo sob o PID 1, e nenhum PID posterior tenha confiabilidade / consistência, pois não é garantido que os PIDs (processos) posteriores existam.fonte
find / -type d -perm 0400 -user root
eu encontrei o diretório/proc/20/map_files/
, se eu me referir a um nome de arquivo inventado dentro dessa pasta, como/proc/20/map_files/asdasd
, então ele sempre falha. Essa pasta sempre existe no Ubuntu?/proc/1/
podem ser mais seguros, pois o init sempre existe. Mas issoproc
não é um sistema de arquivos comum, caso isso importe./proc/1/fdinfo/0
funciona no Ubuntus moderno.-perm o-rwx
é como-perm 0
, todos os bits estão desativados para começar. Aqui você gostaria! -perm -1
.