Short answer: getconf DARWIN_USER_TEMP_DIR
(command line interface), or for another user, e.g. www
: sudo -u www getconf DARWIN_USER_TEMP_DIR
.
Too long; don't read unless you want a story on how I got to the short answer:
On macOS 10.13.6 High Sierra, I can see the rough equivalences of $TMPDIR
for different users, e.g. current user and www
, in a few ways that I know of, using bash --version
5.1.8
:
Using mktemp
- this is the same as kenorb's answer but oddly with a different result - also doing a cleanup:
(sudo --validate && function inner(){ t=$(mktemp) && dirname "$t" ; command rm "$t" ;} && for u in $USER www ;do sudo -u $u bash -c "$(declare -fp inner|awk 'FNR>3{print _}{_=$0}')" ;done)
Reading Apple's opensource for my macOS version's package "shell_cmds"'s mktemp
, I wrote a short program in C:
(sudo --validate && function outer(){ for u in $USER www;do sudo -u $u $1;done;} ; cleanup(){ command rm $1 $1.c;} ; b=/tmp/$$ && cat >$b.c && clang -o$b $b.c && chmod +x $b && outer $b ; cleanup $b) << END
#include <limits.h>
#include <stdio.h>
#include <unistd.h>
int main() {
char tmpbuf[PATH_MAX];
if (confstr(_CS_DARWIN_USER_TEMP_DIR, tmpbuf, sizeof(tmpbuf)) < 1) {
return 1;
} else {
printf("%s\\n", tmpbuf);
return 0;
}
}
END
Writing this, after having tried getconf _CS_DARWIN_USER_TEMP_DIR
and getconf CS_DARWIN_USER_TEMP_DIR
, still not checking man 1 getconf
as I should've, I at least finally checked my earlier usage of confstr
- actually getconf DARWIN_USER_DIR
- realising the transformation needed for .c
confstr(int name,…)
to .sh
getconf var
, i.e. getconf $(sed s/^_CS_// <<< $name)
, e.g. getconf $(sed s/^_CS_// <<< _CS_DARWIN_USER_TEMP_DIR)
equal to getconf DARWIN_USER_TEMP_DIR
, thus:
(sudo --validate && for u in $USER www ;do sudo -u $u getconf DARWIN_USER_TEMP_DIR ;done)
Too long; note to self: read the f-ing manual - man 1 mktemp
–› man 3 confstr
–› man 1 getconf
Addendum re nohillside's comment:
When user
runs stat -F $TMPDIR
, again in bash
, under a shell - login, interactive, and? - it shows something like drwx------ 410 user staff …
. To be clear, this is user
's incarnation of TMPDIR
.
I don't know who's setting up the TMPDIR
variable, and it is unset both in sudo -u www bash -lic 'declare -p TMPDIR'
and an apache httpd -V
2.4.57
(macports - not MAMP) running the php --version
7.4.33
script below.
So, instead of using TMPDIR
, and still not using /tmp
, we can get the value that TMPDIR
would have.
When I run stat -F $(sudo -u www getconf DARWIN_USER_TEMP_DIR)
it shows drwx------ 3 _www _www …
. Here _www
is aka www
.
This way, httpd
can write to its user www
's incarnation of what would be TMPDIR
, but instead retrieved by getconf DARWIN_USER_TEMP_DIR
; user
can also read/write under the same location, depending on user
's configured group membership of www
(or ACL?), or using sudo
; all the while not having www
use any other locations (like /tmp
).
<pre>
posix_getuid : <?=var_dump($uid = posix_getuid ( ) )?>
posix_getpwuid … name : <?=var_dump( posix_getpwuid ($uid )['name'] )?>
getenv keys : <?php foreach(getenv() as $k=>$v){ ?><?="\n"?>
<?=$k?>
<?php } ?><?="\n"?>
shell_exec TMPDIR : <?=var_dump( trim( shell_exec(" echo \$TMPDIR " ) ) )?>
exec TMPDIR : <?=var_dump( exec(" echo \$TMPDIR " ) )?>
shell_exec TMPDIR : <?=var_dump( trim( shell_exec("bash -lic 'echo \$TMPDIR'" ) ) )?>
exec TMPDIR : <?=var_dump( exec("bash -lic 'echo \$TMPDIR'" ) )?>
Using getconf DARWIN_USER_TEMP_DIR:
shell_exec stat -F getconf …: <?=var_dump( trim( shell_exec("stat -F $(getconf DARWIN_USER_TEMP_DIR)" ) ) )?>
I happen to have some file there, so it's clear that "drwx------@ 3 _www" works as usual:
shell_exec ls -l getconf …: <?= shell_exec("ls -l $(getconf DARWIN_USER_TEMP_DIR)" )?>
</pre>
Outputs:
posix_getuid : int(70)
posix_getpwuid … name : string(4) "_www"
getenv keys :
PATH
XPC_SERVICE_NAME
XPC_FLAGS
XML_CATALOG_FILES
shell_exec TMPDIR : string(0) ""
exec TMPDIR : string(0) ""
shell_exec TMPDIR : string(0) ""
exec TMPDIR : string(0) ""
Using getconf DARWIN_USER_TEMP_DIR:
shell_exec stat -F getconf …: string(98) "drwx------ 3 _www _www 102 Aug 9 12:56:01 2023 /var/folders/…/T//"
I happen to have some file there, so it's clear that "drwx------@ 3 _www" works as usual:
shell_exec ls -l getconf …: total 0
-rw------- 1 _www _www 0 Aug 9 12:35 tmp.L1WG1XuJ
Bonus: Some (re)search for this answer yielded an answer on unix.stackexchange with some other details on macOS mktemp
, and saying the alpha numerics in TMPDIR
comes from a base32 encoding of the equivalent of dscl . -read /Users/$name GeneratedUID
and a "concatenation" w/ the "(BSD) user ID", so there is another way to calculate TMPDIR
, but my light jab at that encoding failed, so that's left for the reader.