我有一个通过 SMB/CIFS 和 AFP 提供服务的 Mac OS X 文件服务器。服务器是通过金三角方法的域客户端,但这会导致用户的 UID 非常大。这对我当前的设置很好,但我想让 NFS 也能正常工作。显然我需要做一些 UID 映射,但我不知道如何去做。有什么建议吗?
我正在使用自定义的 Redmine 安装来管理项目。我设法挂钩了新用户的添加并将登录信息发送到我拥有的 bash 脚本。下面是我的脚本:
#!/bin/sh
UNAME=$1
UPASS=$2
wall "$UNAME $UPASS"
useradd "$UNAME"
echo "$UPASS" | passwd "$UNAME" --stdin
usermod -g restricted "$UNAME"
Run Code Online (Sandbox Code Playgroud)
Echo 是一个内置的 bash,所以当它输入密码时它不会显示在进程表中。 问题是我收到了 Redmine 的许可投诉:
/opt/rms/redmine/new-user: line 5: /usr/sbin/useradd: Permission denied
Only root can do that.
/opt/rms/redmine/new-user: line 7: /usr/sbin/usermod: Permission denied
Run Code Online (Sandbox Code Playgroud)
这显然表明我需要 root 权限或执行此操作的其他方法。因此,我尝试在文件上设置具有权限 4755 的 UID 位,以便它以 root 身份运行,但出现与上述相同的错误。知道这里发生了什么吗?
我的一般情况是我的目标是将新用户作为 linux 用户自动添加到项目管理系统中,然后当他们被添加到某个组时,我计划将其挂钩,以便他们获得扩展权限,使他们能够通过 SSH 访问 Mercurial 存储库- 所以用户管理完全通过前端处理。
我在 .c 中将以下程序设置为 setuid chmod 仅由所有者读取/执行,并将其设置为不可变的,就像它调用的 php 脚本一样。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[] )
{
setuid( 0 );
execv( "/var/tools/control.php", argv );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这本身是否存在安全风险?是否可以通过 argv 或其他一些我没有想到的东西来推送其他命令?我不只是询问这个代理程序的 php 脚本。
我有一个标记为 setuid 的 Perl 脚本,但是当我运行它时,它说我没有这样做的权限。我正在运行 Solaris 10。这适用于另一个系统,但我不知道有什么不同。我究竟做错了什么?
$ ls -l
total 16
-r-sr-x--- 1 root root 7354 Apr 19 2008 myscript
$ ./myscript
./myscript: Permission denied.
Run Code Online (Sandbox Code Playgroud) 看看这个c程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
printf("UID: %d\n", getuid());
printf("EUID: %d\n", geteuid());
system("id");
printf("res=%d\n", setuid(1001));
printf("UID: %d\n", getuid());
printf("EUID: %d\n", geteuid());
system("id");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的用户帐户是“test”(id 1000)。我有第二个用户帐户:“test2”(id 1001)。
这是我所做的:
gcc test.c -o ./a.out
sudo chown test2 ./a.out
sudo chmod u+s ./a.out
Run Code Online (Sandbox Code Playgroud)
现在,如果我启动 ./a.out 会发生以下情况:
UID: 1000
EUID: 1001
uid=1000(test) gid=1000(test) groups=1000(test),...
res=0
UID: 1000
EUID: 1001
uid=1000(test) gid=1000(test) groups=1000(test),...
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我在第二部分看不到 uid=1001...
我已经尝试过这个:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
printf("UID: %d\n", getuid());
printf("EUID: %d\n", …Run Code Online (Sandbox Code Playgroud)