Is there a file that always exists and a 'normal' user can't lstat it?Make all files under a directory...
Why did Ylvis use "go" instead of "say" in phrases like "Dog goes 'woof'"?
Why are samba client and NFS client used differently?
Is there any advantage in specifying './' in a for loop using a glob?
What is a good reason for every spaceship to carry gun on board?
Why do neural networks need so many examples to perform?
A fantasy book with seven white haired women on the cover
Plausible reason for gold-digging ant
Website seeing my Facebook data?
Are all power cords made equal?
Concatenating two int[]
hrule into tikz circle node
Does the US government have any planning in place to ensure there's no shortages of food, fuel, steel and other commodities?
Why didn't Tom Riddle take the presence of Fawkes and the Sorting Hat as more of a threat?
Is it possible to detect 100% of SQLi with a simple regex?
Lightning Data Table inline edit
How IPsec tunnel mode work without GRE
Does the ditching switch allow an A320 to float indefinitely?
Word for something that's always reliable, but never the best?
How to completely remove a package in Ubuntu (like it never existed)
What species should be used for storage of human minds?
Prevent Nautilus / Nemo from creating .Trash-1000 folder in mounted devices
Why did Mr. Elliot have to decide whose boots were thickest in "Persuasion"?
SQL Server 2014 AOAG + Replication?
How can I give a Ranger advantage on a check due to Favored Enemy without spoiling the story for the player?
Is there a file that always exists and a 'normal' user can't lstat it?
Make all files under a directory read-only without changing permissions?Setting up a shared folder with group: ACL and file creationMonitor file access count by userChanging user to root when connected to a linux server and copying filesHow to remount as read-write a specific mount of device?Linux user groups and file system permissionsSyslog config syntaxAccess to the internet from a firewalled serverhwclock can't open rtc fileGive read permission to non-root user for root owned file?
I need this for a unit test. There's a function, which does lstat on the file path passed in its parameter. I have to trigger the code path when the lstat fails. (Because the code coverage has to reach 90%)
The test can run only under a single user, therefore I was thinking if there's a file in Ubuntu, which always exists but normal users have no read access to it, or its folder. (So lstat would fail on it unless executed as root.)
Non-existing file is not a solution, because there's a separate code path for that, which I'm already triggering.
EDIT: Lack of read access to the file only is not enough. With that lstat can still be executed. I was able to trigger it (on my local machine, where I have root access), by creating a folder in /root, and a file in it. And setting permission 700 on the folder. So I'm searching for a file, which is in a folder that is only accessible by root.
linux ubuntu
add a comment |
I need this for a unit test. There's a function, which does lstat on the file path passed in its parameter. I have to trigger the code path when the lstat fails. (Because the code coverage has to reach 90%)
The test can run only under a single user, therefore I was thinking if there's a file in Ubuntu, which always exists but normal users have no read access to it, or its folder. (So lstat would fail on it unless executed as root.)
Non-existing file is not a solution, because there's a separate code path for that, which I'm already triggering.
EDIT: Lack of read access to the file only is not enough. With that lstat can still be executed. I was able to trigger it (on my local machine, where I have root access), by creating a folder in /root, and a file in it. And setting permission 700 on the folder. So I'm searching for a file, which is in a folder that is only accessible by root.
linux ubuntu
2
IMHO/etc/shadow
– Romeo Ninov
4 hours ago
@RomeoNinov thanks. Maybe my question is wrong. That file is readable, but I can lstat it. Then its directory has to be non-readable?
– Crouching Kitten
4 hours ago
1
You cannot assume the existence of any file, because your program may run in a chroot or separate namespace. If assuming that /proc is mounted is OK and init is nothing special, then/proc/1/fd/0
should do.
– mosvy
4 hours ago
1
@mosvy Thanks that works on my local machine. Hmm then I'll try it on the QA and Staging pool too.
– Crouching Kitten
4 hours ago
Why are you tying your test code to a particular flavor of OS when you could just create a throwaway file and remove your own read access to it?
– Kilian Foth
25 mins ago
add a comment |
I need this for a unit test. There's a function, which does lstat on the file path passed in its parameter. I have to trigger the code path when the lstat fails. (Because the code coverage has to reach 90%)
The test can run only under a single user, therefore I was thinking if there's a file in Ubuntu, which always exists but normal users have no read access to it, or its folder. (So lstat would fail on it unless executed as root.)
Non-existing file is not a solution, because there's a separate code path for that, which I'm already triggering.
EDIT: Lack of read access to the file only is not enough. With that lstat can still be executed. I was able to trigger it (on my local machine, where I have root access), by creating a folder in /root, and a file in it. And setting permission 700 on the folder. So I'm searching for a file, which is in a folder that is only accessible by root.
linux ubuntu
I need this for a unit test. There's a function, which does lstat on the file path passed in its parameter. I have to trigger the code path when the lstat fails. (Because the code coverage has to reach 90%)
The test can run only under a single user, therefore I was thinking if there's a file in Ubuntu, which always exists but normal users have no read access to it, or its folder. (So lstat would fail on it unless executed as root.)
Non-existing file is not a solution, because there's a separate code path for that, which I'm already triggering.
EDIT: Lack of read access to the file only is not enough. With that lstat can still be executed. I was able to trigger it (on my local machine, where I have root access), by creating a folder in /root, and a file in it. And setting permission 700 on the folder. So I'm searching for a file, which is in a folder that is only accessible by root.
linux ubuntu
linux ubuntu
edited 4 hours ago
Crouching Kitten
asked 4 hours ago
Crouching KittenCrouching Kitten
283310
283310
2
IMHO/etc/shadow
– Romeo Ninov
4 hours ago
@RomeoNinov thanks. Maybe my question is wrong. That file is readable, but I can lstat it. Then its directory has to be non-readable?
– Crouching Kitten
4 hours ago
1
You cannot assume the existence of any file, because your program may run in a chroot or separate namespace. If assuming that /proc is mounted is OK and init is nothing special, then/proc/1/fd/0
should do.
– mosvy
4 hours ago
1
@mosvy Thanks that works on my local machine. Hmm then I'll try it on the QA and Staging pool too.
– Crouching Kitten
4 hours ago
Why are you tying your test code to a particular flavor of OS when you could just create a throwaway file and remove your own read access to it?
– Kilian Foth
25 mins ago
add a comment |
2
IMHO/etc/shadow
– Romeo Ninov
4 hours ago
@RomeoNinov thanks. Maybe my question is wrong. That file is readable, but I can lstat it. Then its directory has to be non-readable?
– Crouching Kitten
4 hours ago
1
You cannot assume the existence of any file, because your program may run in a chroot or separate namespace. If assuming that /proc is mounted is OK and init is nothing special, then/proc/1/fd/0
should do.
– mosvy
4 hours ago
1
@mosvy Thanks that works on my local machine. Hmm then I'll try it on the QA and Staging pool too.
– Crouching Kitten
4 hours ago
Why are you tying your test code to a particular flavor of OS when you could just create a throwaway file and remove your own read access to it?
– Kilian Foth
25 mins ago
2
2
IMHO
/etc/shadow
– Romeo Ninov
4 hours ago
IMHO
/etc/shadow
– Romeo Ninov
4 hours ago
@RomeoNinov thanks. Maybe my question is wrong. That file is readable, but I can lstat it. Then its directory has to be non-readable?
– Crouching Kitten
4 hours ago
@RomeoNinov thanks. Maybe my question is wrong. That file is readable, but I can lstat it. Then its directory has to be non-readable?
– Crouching Kitten
4 hours ago
1
1
You cannot assume the existence of any file, because your program may run in a chroot or separate namespace. If assuming that /proc is mounted is OK and init is nothing special, then
/proc/1/fd/0
should do.– mosvy
4 hours ago
You cannot assume the existence of any file, because your program may run in a chroot or separate namespace. If assuming that /proc is mounted is OK and init is nothing special, then
/proc/1/fd/0
should do.– mosvy
4 hours ago
1
1
@mosvy Thanks that works on my local machine. Hmm then I'll try it on the QA and Staging pool too.
– Crouching Kitten
4 hours ago
@mosvy Thanks that works on my local machine. Hmm then I'll try it on the QA and Staging pool too.
– Crouching Kitten
4 hours ago
Why are you tying your test code to a particular flavor of OS when you could just create a throwaway file and remove your own read access to it?
– Kilian Foth
25 mins ago
Why are you tying your test code to a particular flavor of OS when you could just create a throwaway file and remove your own read access to it?
– Kilian Foth
25 mins ago
add a comment |
3 Answers
3
active
oldest
votes
On modern Linux systems, you should be able to use /proc/1/fdinfo/0
(information for the file descriptor 1 (stdout) of the process of id 1 (init
in the root pid namespace which should be running as root
)).
You can find a list with:
sudo find /etc /dev /sys /proc -type f -print0 |
perl -l -0ne 'print unless lstat'
(remove -type f
if you don't want to restrict to regular files).
/var/cache/ldconfig/aux-cache
is another potential candidate if you only need to consider Ubuntu systems. I should work on most GNU systems as /var/cache/ldconfig
is created read+writable to root only by the ldconfig
command that comes with the GNU libc.
1
Thanks! If/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.
– Crouching Kitten
4 hours ago
add a comment |
You can find
it yourself.
Using /etc
-- the configuration files directory as a starting point:
sudo find /etc -type f -perm 0400 -user root
On my system, this does not return anything.
You can be a less restrictive and allow group root
(only user root
should be a member of group root
), and a look out for a permission of 440
:
sudo find /etc -perm 0440 -user root -group root
On my system this returns:
/etc/sudoers.d/README
/etc/sudoers
Edit:
Based on your edit, you're looking for a directory that does not have sufficient permission for the invoking user to prevent directory listing:
sudo find / -perm o-rwx -type d -user root -group root
here I'm looking for directories (-type d
) that lack the read-write-execute perm bits for others (o-rwx
) and is owned by root:root
.
Technically, just the absense of execute (x
) bit would prevent a directory listing (lstat(2)
) on directory.
In the output I've found /run/systemd/inaccessible/
on my Systemd init based system.
Regarding files in /proc
, /sys
, /dev
:
These filesystems are virtual FS i.e. they reside on memory, not on disk
If you plan to rely on
/proc
, use/proc/1/
i.e. rely on something under PID 1, not any later PIDs to have reliability/consistency as the later PIDs (processes) are not guaranteed to exist.
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks. Withfind / -type d -perm 0400 -user root
I have found the directory/proc/20/map_files/
, if I refer to a made-up file name inside that folder, like/proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?
– Crouching Kitten
4 hours ago
@CrouchingKitten, the directories in/proc/1/
might be safer, since init always exists. But that'sproc
, not a regular filesystem, in case it matters.
– ilkkachu
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that/proc/1/fdinfo/0
works on modern Ubuntus.
– Crouching Kitten
4 hours ago
-perm o-rwx
is like-perm 0
, bits are all off to start with. Here, you'd want! -perm -1
.
– Stéphane Chazelas
3 hours ago
add a comment |
Looking at the lstat(2) man page you can get some inspiration on cases that might make it fail with errors other than ENOENT (file does not exist.)
The most obvious one is:
EACCES
Search permission is denied for one of the directories in the path prefix of path.
So you need a directory you can't search from.
Yes, you can look for one that's already in your system (perhaps /var/lib/private
if it exists?) But you might as well create one yourself, with the equivalent of:
$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile
The lstat(2) operation will fail with EACCES here. (Removing all permissions from the directory ensures that. Maybe you don't even need that much and chmod -x
removing execute permissions would be enough, since execute permissions on a directory are needed to access files under it.)
There's another creative way to make lstat(2) fail, looking at its man page:
ENOTDIR
A component of the path prefix of path is not a directory.
So, trying to access a file such as /etc/passwd/nonexistent
should trigger this error, which again is different from ENOENT ("No such file or directory") and might suit your needs.
Another one is:
ENAMETOOLONG
path is too long.
But you might need a really long name for this one (I believe 4,096 bytes is the typical limit, but your system/filesystem might have a longer one.)
Finally, it's hard to tell whether any of these will be actually useful for you. You say you want something that doesn't trigger the "file doesn't exist" scenario. While typically that means an ENOENT error, in practice many higher-level checks will simply interpret any errors from lstat(2) as "does not exist". For example test -e
or the equivalent [ -e ...]
from the shell might simply just interpret all of the above as "does not exist", especially since it doesn't have a good way to return a different error message and not returning an error would imply the file exists, which is most certainly not the case.
2
It's not directories you can't read from, but directories you can't search (for which you don't have the search (x
) permission, or to one of its parents).
– Stéphane Chazelas
3 hours ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f502857%2fis-there-a-file-that-always-exists-and-a-normal-user-cant-lstat-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
On modern Linux systems, you should be able to use /proc/1/fdinfo/0
(information for the file descriptor 1 (stdout) of the process of id 1 (init
in the root pid namespace which should be running as root
)).
You can find a list with:
sudo find /etc /dev /sys /proc -type f -print0 |
perl -l -0ne 'print unless lstat'
(remove -type f
if you don't want to restrict to regular files).
/var/cache/ldconfig/aux-cache
is another potential candidate if you only need to consider Ubuntu systems. I should work on most GNU systems as /var/cache/ldconfig
is created read+writable to root only by the ldconfig
command that comes with the GNU libc.
1
Thanks! If/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.
– Crouching Kitten
4 hours ago
add a comment |
On modern Linux systems, you should be able to use /proc/1/fdinfo/0
(information for the file descriptor 1 (stdout) of the process of id 1 (init
in the root pid namespace which should be running as root
)).
You can find a list with:
sudo find /etc /dev /sys /proc -type f -print0 |
perl -l -0ne 'print unless lstat'
(remove -type f
if you don't want to restrict to regular files).
/var/cache/ldconfig/aux-cache
is another potential candidate if you only need to consider Ubuntu systems. I should work on most GNU systems as /var/cache/ldconfig
is created read+writable to root only by the ldconfig
command that comes with the GNU libc.
1
Thanks! If/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.
– Crouching Kitten
4 hours ago
add a comment |
On modern Linux systems, you should be able to use /proc/1/fdinfo/0
(information for the file descriptor 1 (stdout) of the process of id 1 (init
in the root pid namespace which should be running as root
)).
You can find a list with:
sudo find /etc /dev /sys /proc -type f -print0 |
perl -l -0ne 'print unless lstat'
(remove -type f
if you don't want to restrict to regular files).
/var/cache/ldconfig/aux-cache
is another potential candidate if you only need to consider Ubuntu systems. I should work on most GNU systems as /var/cache/ldconfig
is created read+writable to root only by the ldconfig
command that comes with the GNU libc.
On modern Linux systems, you should be able to use /proc/1/fdinfo/0
(information for the file descriptor 1 (stdout) of the process of id 1 (init
in the root pid namespace which should be running as root
)).
You can find a list with:
sudo find /etc /dev /sys /proc -type f -print0 |
perl -l -0ne 'print unless lstat'
(remove -type f
if you don't want to restrict to regular files).
/var/cache/ldconfig/aux-cache
is another potential candidate if you only need to consider Ubuntu systems. I should work on most GNU systems as /var/cache/ldconfig
is created read+writable to root only by the ldconfig
command that comes with the GNU libc.
edited 31 mins ago
answered 4 hours ago
Stéphane ChazelasStéphane Chazelas
307k57581936
307k57581936
1
Thanks! If/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.
– Crouching Kitten
4 hours ago
add a comment |
1
Thanks! If/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.
– Crouching Kitten
4 hours ago
1
1
Thanks! If
/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.– Crouching Kitten
4 hours ago
Thanks! If
/proc/1/fdinfo/0
works on Ubuntu 16.04 and 18.04, that's more than enough.– Crouching Kitten
4 hours ago
add a comment |
You can find
it yourself.
Using /etc
-- the configuration files directory as a starting point:
sudo find /etc -type f -perm 0400 -user root
On my system, this does not return anything.
You can be a less restrictive and allow group root
(only user root
should be a member of group root
), and a look out for a permission of 440
:
sudo find /etc -perm 0440 -user root -group root
On my system this returns:
/etc/sudoers.d/README
/etc/sudoers
Edit:
Based on your edit, you're looking for a directory that does not have sufficient permission for the invoking user to prevent directory listing:
sudo find / -perm o-rwx -type d -user root -group root
here I'm looking for directories (-type d
) that lack the read-write-execute perm bits for others (o-rwx
) and is owned by root:root
.
Technically, just the absense of execute (x
) bit would prevent a directory listing (lstat(2)
) on directory.
In the output I've found /run/systemd/inaccessible/
on my Systemd init based system.
Regarding files in /proc
, /sys
, /dev
:
These filesystems are virtual FS i.e. they reside on memory, not on disk
If you plan to rely on
/proc
, use/proc/1/
i.e. rely on something under PID 1, not any later PIDs to have reliability/consistency as the later PIDs (processes) are not guaranteed to exist.
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks. Withfind / -type d -perm 0400 -user root
I have found the directory/proc/20/map_files/
, if I refer to a made-up file name inside that folder, like/proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?
– Crouching Kitten
4 hours ago
@CrouchingKitten, the directories in/proc/1/
might be safer, since init always exists. But that'sproc
, not a regular filesystem, in case it matters.
– ilkkachu
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that/proc/1/fdinfo/0
works on modern Ubuntus.
– Crouching Kitten
4 hours ago
-perm o-rwx
is like-perm 0
, bits are all off to start with. Here, you'd want! -perm -1
.
– Stéphane Chazelas
3 hours ago
add a comment |
You can find
it yourself.
Using /etc
-- the configuration files directory as a starting point:
sudo find /etc -type f -perm 0400 -user root
On my system, this does not return anything.
You can be a less restrictive and allow group root
(only user root
should be a member of group root
), and a look out for a permission of 440
:
sudo find /etc -perm 0440 -user root -group root
On my system this returns:
/etc/sudoers.d/README
/etc/sudoers
Edit:
Based on your edit, you're looking for a directory that does not have sufficient permission for the invoking user to prevent directory listing:
sudo find / -perm o-rwx -type d -user root -group root
here I'm looking for directories (-type d
) that lack the read-write-execute perm bits for others (o-rwx
) and is owned by root:root
.
Technically, just the absense of execute (x
) bit would prevent a directory listing (lstat(2)
) on directory.
In the output I've found /run/systemd/inaccessible/
on my Systemd init based system.
Regarding files in /proc
, /sys
, /dev
:
These filesystems are virtual FS i.e. they reside on memory, not on disk
If you plan to rely on
/proc
, use/proc/1/
i.e. rely on something under PID 1, not any later PIDs to have reliability/consistency as the later PIDs (processes) are not guaranteed to exist.
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks. Withfind / -type d -perm 0400 -user root
I have found the directory/proc/20/map_files/
, if I refer to a made-up file name inside that folder, like/proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?
– Crouching Kitten
4 hours ago
@CrouchingKitten, the directories in/proc/1/
might be safer, since init always exists. But that'sproc
, not a regular filesystem, in case it matters.
– ilkkachu
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that/proc/1/fdinfo/0
works on modern Ubuntus.
– Crouching Kitten
4 hours ago
-perm o-rwx
is like-perm 0
, bits are all off to start with. Here, you'd want! -perm -1
.
– Stéphane Chazelas
3 hours ago
add a comment |
You can find
it yourself.
Using /etc
-- the configuration files directory as a starting point:
sudo find /etc -type f -perm 0400 -user root
On my system, this does not return anything.
You can be a less restrictive and allow group root
(only user root
should be a member of group root
), and a look out for a permission of 440
:
sudo find /etc -perm 0440 -user root -group root
On my system this returns:
/etc/sudoers.d/README
/etc/sudoers
Edit:
Based on your edit, you're looking for a directory that does not have sufficient permission for the invoking user to prevent directory listing:
sudo find / -perm o-rwx -type d -user root -group root
here I'm looking for directories (-type d
) that lack the read-write-execute perm bits for others (o-rwx
) and is owned by root:root
.
Technically, just the absense of execute (x
) bit would prevent a directory listing (lstat(2)
) on directory.
In the output I've found /run/systemd/inaccessible/
on my Systemd init based system.
Regarding files in /proc
, /sys
, /dev
:
These filesystems are virtual FS i.e. they reside on memory, not on disk
If you plan to rely on
/proc
, use/proc/1/
i.e. rely on something under PID 1, not any later PIDs to have reliability/consistency as the later PIDs (processes) are not guaranteed to exist.
You can find
it yourself.
Using /etc
-- the configuration files directory as a starting point:
sudo find /etc -type f -perm 0400 -user root
On my system, this does not return anything.
You can be a less restrictive and allow group root
(only user root
should be a member of group root
), and a look out for a permission of 440
:
sudo find /etc -perm 0440 -user root -group root
On my system this returns:
/etc/sudoers.d/README
/etc/sudoers
Edit:
Based on your edit, you're looking for a directory that does not have sufficient permission for the invoking user to prevent directory listing:
sudo find / -perm o-rwx -type d -user root -group root
here I'm looking for directories (-type d
) that lack the read-write-execute perm bits for others (o-rwx
) and is owned by root:root
.
Technically, just the absense of execute (x
) bit would prevent a directory listing (lstat(2)
) on directory.
In the output I've found /run/systemd/inaccessible/
on my Systemd init based system.
Regarding files in /proc
, /sys
, /dev
:
These filesystems are virtual FS i.e. they reside on memory, not on disk
If you plan to rely on
/proc
, use/proc/1/
i.e. rely on something under PID 1, not any later PIDs to have reliability/consistency as the later PIDs (processes) are not guaranteed to exist.
edited 3 hours ago
Stéphane Chazelas
307k57581936
307k57581936
answered 4 hours ago
heemaylheemayl
35.6k376105
35.6k376105
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks. Withfind / -type d -perm 0400 -user root
I have found the directory/proc/20/map_files/
, if I refer to a made-up file name inside that folder, like/proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?
– Crouching Kitten
4 hours ago
@CrouchingKitten, the directories in/proc/1/
might be safer, since init always exists. But that'sproc
, not a regular filesystem, in case it matters.
– ilkkachu
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that/proc/1/fdinfo/0
works on modern Ubuntus.
– Crouching Kitten
4 hours ago
-perm o-rwx
is like-perm 0
, bits are all off to start with. Here, you'd want! -perm -1
.
– Stéphane Chazelas
3 hours ago
add a comment |
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks. Withfind / -type d -perm 0400 -user root
I have found the directory/proc/20/map_files/
, if I refer to a made-up file name inside that folder, like/proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?
– Crouching Kitten
4 hours ago
@CrouchingKitten, the directories in/proc/1/
might be safer, since init always exists. But that'sproc
, not a regular filesystem, in case it matters.
– ilkkachu
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that/proc/1/fdinfo/0
works on modern Ubuntus.
– Crouching Kitten
4 hours ago
-perm o-rwx
is like-perm 0
, bits are all off to start with. Here, you'd want! -perm -1
.
– Stéphane Chazelas
3 hours ago
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks, I think my question is wrong. I can still lstat files without read access to them. Maybe the access to the folder has to be limited? (I modified the title)
– Crouching Kitten
4 hours ago
Thanks. With
find / -type d -perm 0400 -user root
I have found the directory /proc/20/map_files/
, if I refer to a made-up file name inside that folder, like /proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?– Crouching Kitten
4 hours ago
Thanks. With
find / -type d -perm 0400 -user root
I have found the directory /proc/20/map_files/
, if I refer to a made-up file name inside that folder, like /proc/20/map_files/asdasd
, then it always fails. Does that folder always exist on Ubuntu?– Crouching Kitten
4 hours ago
@CrouchingKitten, the directories in
/proc/1/
might be safer, since init always exists. But that's proc
, not a regular filesystem, in case it matters.– ilkkachu
4 hours ago
@CrouchingKitten, the directories in
/proc/1/
might be safer, since init always exists. But that's proc
, not a regular filesystem, in case it matters.– ilkkachu
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that
/proc/1/fdinfo/0
works on modern Ubuntus.– Crouching Kitten
4 hours ago
Thanks I gave an upvote, but accepted the other answer, because he said it is guaranteed that
/proc/1/fdinfo/0
works on modern Ubuntus.– Crouching Kitten
4 hours ago
-perm o-rwx
is like -perm 0
, bits are all off to start with. Here, you'd want ! -perm -1
.– Stéphane Chazelas
3 hours ago
-perm o-rwx
is like -perm 0
, bits are all off to start with. Here, you'd want ! -perm -1
.– Stéphane Chazelas
3 hours ago
add a comment |
Looking at the lstat(2) man page you can get some inspiration on cases that might make it fail with errors other than ENOENT (file does not exist.)
The most obvious one is:
EACCES
Search permission is denied for one of the directories in the path prefix of path.
So you need a directory you can't search from.
Yes, you can look for one that's already in your system (perhaps /var/lib/private
if it exists?) But you might as well create one yourself, with the equivalent of:
$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile
The lstat(2) operation will fail with EACCES here. (Removing all permissions from the directory ensures that. Maybe you don't even need that much and chmod -x
removing execute permissions would be enough, since execute permissions on a directory are needed to access files under it.)
There's another creative way to make lstat(2) fail, looking at its man page:
ENOTDIR
A component of the path prefix of path is not a directory.
So, trying to access a file such as /etc/passwd/nonexistent
should trigger this error, which again is different from ENOENT ("No such file or directory") and might suit your needs.
Another one is:
ENAMETOOLONG
path is too long.
But you might need a really long name for this one (I believe 4,096 bytes is the typical limit, but your system/filesystem might have a longer one.)
Finally, it's hard to tell whether any of these will be actually useful for you. You say you want something that doesn't trigger the "file doesn't exist" scenario. While typically that means an ENOENT error, in practice many higher-level checks will simply interpret any errors from lstat(2) as "does not exist". For example test -e
or the equivalent [ -e ...]
from the shell might simply just interpret all of the above as "does not exist", especially since it doesn't have a good way to return a different error message and not returning an error would imply the file exists, which is most certainly not the case.
2
It's not directories you can't read from, but directories you can't search (for which you don't have the search (x
) permission, or to one of its parents).
– Stéphane Chazelas
3 hours ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
add a comment |
Looking at the lstat(2) man page you can get some inspiration on cases that might make it fail with errors other than ENOENT (file does not exist.)
The most obvious one is:
EACCES
Search permission is denied for one of the directories in the path prefix of path.
So you need a directory you can't search from.
Yes, you can look for one that's already in your system (perhaps /var/lib/private
if it exists?) But you might as well create one yourself, with the equivalent of:
$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile
The lstat(2) operation will fail with EACCES here. (Removing all permissions from the directory ensures that. Maybe you don't even need that much and chmod -x
removing execute permissions would be enough, since execute permissions on a directory are needed to access files under it.)
There's another creative way to make lstat(2) fail, looking at its man page:
ENOTDIR
A component of the path prefix of path is not a directory.
So, trying to access a file such as /etc/passwd/nonexistent
should trigger this error, which again is different from ENOENT ("No such file or directory") and might suit your needs.
Another one is:
ENAMETOOLONG
path is too long.
But you might need a really long name for this one (I believe 4,096 bytes is the typical limit, but your system/filesystem might have a longer one.)
Finally, it's hard to tell whether any of these will be actually useful for you. You say you want something that doesn't trigger the "file doesn't exist" scenario. While typically that means an ENOENT error, in practice many higher-level checks will simply interpret any errors from lstat(2) as "does not exist". For example test -e
or the equivalent [ -e ...]
from the shell might simply just interpret all of the above as "does not exist", especially since it doesn't have a good way to return a different error message and not returning an error would imply the file exists, which is most certainly not the case.
2
It's not directories you can't read from, but directories you can't search (for which you don't have the search (x
) permission, or to one of its parents).
– Stéphane Chazelas
3 hours ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
add a comment |
Looking at the lstat(2) man page you can get some inspiration on cases that might make it fail with errors other than ENOENT (file does not exist.)
The most obvious one is:
EACCES
Search permission is denied for one of the directories in the path prefix of path.
So you need a directory you can't search from.
Yes, you can look for one that's already in your system (perhaps /var/lib/private
if it exists?) But you might as well create one yourself, with the equivalent of:
$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile
The lstat(2) operation will fail with EACCES here. (Removing all permissions from the directory ensures that. Maybe you don't even need that much and chmod -x
removing execute permissions would be enough, since execute permissions on a directory are needed to access files under it.)
There's another creative way to make lstat(2) fail, looking at its man page:
ENOTDIR
A component of the path prefix of path is not a directory.
So, trying to access a file such as /etc/passwd/nonexistent
should trigger this error, which again is different from ENOENT ("No such file or directory") and might suit your needs.
Another one is:
ENAMETOOLONG
path is too long.
But you might need a really long name for this one (I believe 4,096 bytes is the typical limit, but your system/filesystem might have a longer one.)
Finally, it's hard to tell whether any of these will be actually useful for you. You say you want something that doesn't trigger the "file doesn't exist" scenario. While typically that means an ENOENT error, in practice many higher-level checks will simply interpret any errors from lstat(2) as "does not exist". For example test -e
or the equivalent [ -e ...]
from the shell might simply just interpret all of the above as "does not exist", especially since it doesn't have a good way to return a different error message and not returning an error would imply the file exists, which is most certainly not the case.
Looking at the lstat(2) man page you can get some inspiration on cases that might make it fail with errors other than ENOENT (file does not exist.)
The most obvious one is:
EACCES
Search permission is denied for one of the directories in the path prefix of path.
So you need a directory you can't search from.
Yes, you can look for one that's already in your system (perhaps /var/lib/private
if it exists?) But you might as well create one yourself, with the equivalent of:
$ mkdir myprivatedir
$ touch myprivatedir/myunreachablefile
$ chmod 0 myprivatedir
$ ls -l myprivatedir/myunreachablefile
The lstat(2) operation will fail with EACCES here. (Removing all permissions from the directory ensures that. Maybe you don't even need that much and chmod -x
removing execute permissions would be enough, since execute permissions on a directory are needed to access files under it.)
There's another creative way to make lstat(2) fail, looking at its man page:
ENOTDIR
A component of the path prefix of path is not a directory.
So, trying to access a file such as /etc/passwd/nonexistent
should trigger this error, which again is different from ENOENT ("No such file or directory") and might suit your needs.
Another one is:
ENAMETOOLONG
path is too long.
But you might need a really long name for this one (I believe 4,096 bytes is the typical limit, but your system/filesystem might have a longer one.)
Finally, it's hard to tell whether any of these will be actually useful for you. You say you want something that doesn't trigger the "file doesn't exist" scenario. While typically that means an ENOENT error, in practice many higher-level checks will simply interpret any errors from lstat(2) as "does not exist". For example test -e
or the equivalent [ -e ...]
from the shell might simply just interpret all of the above as "does not exist", especially since it doesn't have a good way to return a different error message and not returning an error would imply the file exists, which is most certainly not the case.
edited 1 hour ago
answered 4 hours ago
filbrandenfilbranden
9,25621342
9,25621342
2
It's not directories you can't read from, but directories you can't search (for which you don't have the search (x
) permission, or to one of its parents).
– Stéphane Chazelas
3 hours ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
add a comment |
2
It's not directories you can't read from, but directories you can't search (for which you don't have the search (x
) permission, or to one of its parents).
– Stéphane Chazelas
3 hours ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
2
2
It's not directories you can't read from, but directories you can't search (for which you don't have the search (
x
) permission, or to one of its parents).– Stéphane Chazelas
3 hours ago
It's not directories you can't read from, but directories you can't search (for which you don't have the search (
x
) permission, or to one of its parents).– Stéphane Chazelas
3 hours ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
@StephaneChazelas Great point! Updated.
– filbranden
1 hour ago
add a comment |
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f502857%2fis-there-a-file-that-always-exists-and-a-normal-user-cant-lstat-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
IMHO
/etc/shadow
– Romeo Ninov
4 hours ago
@RomeoNinov thanks. Maybe my question is wrong. That file is readable, but I can lstat it. Then its directory has to be non-readable?
– Crouching Kitten
4 hours ago
1
You cannot assume the existence of any file, because your program may run in a chroot or separate namespace. If assuming that /proc is mounted is OK and init is nothing special, then
/proc/1/fd/0
should do.– mosvy
4 hours ago
1
@mosvy Thanks that works on my local machine. Hmm then I'll try it on the QA and Staging pool too.
– Crouching Kitten
4 hours ago
Why are you tying your test code to a particular flavor of OS when you could just create a throwaway file and remove your own read access to it?
– Kilian Foth
25 mins ago