我正在试验Java应用程序的Linux功能.我不想为解释器(JVM)添加功能,所以我尝试编写一个简单的包装器(将调试信息打印到stdout):
#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
#include <unistd.h>
int main(int argc, char *argv[]){
cap_t cap = cap_get_proc();
if (!cap) {
perror("cap_get_proc");
exit(1);
}
printf("%s: running with caps %s\n", argv[0], cap_to_text(cap, NULL));
return execlp("/usr/bin/java", "-server", "-jar", "project.jar", (char *)NULL);
}
Run Code Online (Sandbox Code Playgroud)
这样,我可以看到为此可执行文件设置了功能:
./runner: running with caps = cap_net_bind_service+p
Run Code Online (Sandbox Code Playgroud)
和getcap
节目
runner = cap_net_bind_service+ip
Run Code Online (Sandbox Code Playgroud)
我有能力设置为可继承,所以应该没有问题.但是,java仍然不想绑定到特权端口.
我收到此错误:
sun/nio/ch/Net.java:-2:in `bind': java.net.SocketException: Permission denied (NativeException)
Run Code Online (Sandbox Code Playgroud)
有人可以帮我解决这个问题吗?
我正在尝试在ubuntu 10.10上编译以下最小C代码:
#include <sys/capability.h>
void main(void)
{
cap_t cap;
cap = cap_get_proc();
}
Run Code Online (Sandbox Code Playgroud)
用gcc -lcap test.c
它给我以下错误:
/tmp/ccCQFyXS.o: In function `main':
test.c:(.text+0x9): undefined reference to `cap_get_proc'
collect2: ld a retourné 1 code d'état d'exécution
Run Code Online (Sandbox Code Playgroud)
我安装了libcap2-dev和libcap2-bin,版本2.21
ls /lib/libcap.*
/lib/libcap.a /lib/libcap.so /lib/libcap.so.2 /lib/libcap.so.2.21
Run Code Online (Sandbox Code Playgroud)
具有相同gcc命令的相同代码在arch和gentoo上成功构建
我该怎么做才能让它在ubuntu上构建?
__shared__
CUDA中的内存似乎在编译时需要已知的大小.但是,在我的问题中,__shared__
内存大小只在运行时知道,即
int size=get_size();
__shared__ mem[size];
Run Code Online (Sandbox Code Playgroud)
这将最终导致"错误:常数值未知",我不知道如何解决这个问题.
我想让系统在没有setuid
文件“+p”功能的情况下可用,并且通常没有在我设置PR_SET_NO_NEW_PRIVS时禁用的东西。
使用这种方法(init
集合PR_SET_NO_NEW_PRIVS
和基于文件系统的能力提升不再可能),您无法“重新填充”您的能力,只需要小心不要“泼洒”它们。
如何在execve
不“飞溅”任何授予的功能的情况下进行其他处理(例如新程序的文件是否为setcap =ei
)?只是“我相信这个新过程就像我相信自己一样”。例如,赋予用户一项能力(并且用户想在他启动的任何程序中行使它)......
我可以永久制作整个文件系统=ei
吗?我想让文件系统不干扰该方案,不能授予或撤销功能;通过父->子事物控制一切。
我正在尝试将我的 uid 更改为 0 作为具有该CAP_SETUID
功能的非 root 用户。我有以下程序:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/capability.h>
#include <sys/prctl.h>
int main(int argc, char *argv[])
{
printf("cap setuid in bset: %d\n", prctl(PR_CAPBSET_READ, CAP_SETUID, 0, 0, 0));
printf("%s\n", cap_to_text(cap_get_file(argv[0]), NULL));
printf("%s\n", cap_to_text(cap_get_proc(), NULL));
printf("uid: %d\n", (int) getuid());
setresuid(0, 0, 0);
printf("uid: %d\n", (int) getuid());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我将 setuid 功能分配如下:
sudo /sbin/setcap cap_setuid=ep ./capsetuid
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
cap setuid in bset: 1
= cap_setuid+ep
=
uid: 1000
uid: 1000
Run Code Online (Sandbox Code Playgroud)
我希望第二个 printf() 也能显示出这种CAP_SETUID
能力。不知何故,我的进程没有获得 …
试图设置cap_setgid
,cap_setuid
,cap_setpcap
.
#include <sys/types.h>
#include <sys/capability.h>
int main()
{
cap_t caps;
caps = cap_get_proc();
cap_value_t cap_list[2];
cap_list[0] = CAP_SETUID;
cap_list[1] = CAP_SETGID;
cap_set_flag(caps, CAP_EFFECTIVE, 2, cap_list, CAP_SET);
cap_set_flag(caps, CAP_INHERITABLE, 2, cap_list, CAP_SET);
cap_set_proc(caps);
cap_free(caps);
setgid(65534);
setuid(65534);
cap_get_proc();
setgid(0);
setuid(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
执行是在root用户下进行的.跟踪程序显示了这一点
capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, 0}) = 0
capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_CHOWN|CAP_DAC_OVERRIDE|CAP_DAC_READ_SEARCH|CAP_FOWNER|CAP_FSETID|CAP_KILL|CAP_SETGID|CAP_SETUID|CAP_SETPCAP|CAP_LINUX_IMMUTABLE|CAP_NET_BIND_SERVICE|CAP_NET_BROADCAST|CAP_NET_ADMIN|CAP_NET_RAW|CAP_IPC_LOCK|CAP_IPC_OWNER|CAP_SYS_MODULE|CAP_SYS_RAWIO|CAP_SYS_CHROOT|CAP_SYS_PTRACE|CAP_SYS_PACCT|CAP_SYS_ADMIN|CAP_SYS_BOOT|CAP_SYS_NICE|CAP_SYS_RESOURCE|CAP_SYS_TIME|CAP_SYS_TTY_CONFIG|CAP_MKNOD|CAP_LEASE|CAP_AUDIT_WRITE|CAP_AUDIT_CONTROL|CAP_SETFCAP, CAP_SETGID|CAP_SETUID|CAP_SETPCAP}) = 0
setgid(65534) = 0
setuid(65534) = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, NULL) = 0
capget({_LINUX_CAPABILITY_VERSION_3, 0}, …
Run Code Online (Sandbox Code Playgroud) CUDA是否支持CUDA内核的JIT编译?
我知道OpenCL提供此功能。
我有一些在运行时不会更改的变量(即仅取决于输入文件),因此我想在内核编译时(即在运行时)使用宏定义这些值。
如果我在编译时手动定义这些值,我的寄存器使用率将从53下降到46,这将大大提高性能。
我对IOCP有所了解,但我对APM有些困惑.
static FileStream fs;
static void Main(string[] args)
{
fs = new FileStream(@"c:\bigfile.txt", FileMode.Open);
var buffer = new byte[10000000];
IAsyncResult asyncResult = fs.BeginRead(buffer, 0, 10000000, OnCompletedRead, null);
Console.WriteLine("async...");
int bytesRead = fs.EndRead(asyncResult);
Console.WriteLine("async... over");
}
static void OnCompletedRead(IAsyncResult ar)
{
Console.WriteLine("finished");
}
Run Code Online (Sandbox Code Playgroud)
我想知道,IO线程异步执行的读取操作是什么?还是线程池中的工作线程?
和回调函数一样OnCompletedRead
,它是否也由CLR线程池中的IO线程执行?
这两个线程是同一个吗?如果没有,则生成两个线程,一个执行读取操作,另一个执行回调.
较新版本的 docker(我认为 1.2 及更高版本)有一个 --cap-add
功能。
这提供了对功能功能的细粒度控制,而无需打开所有内容 --privileged=true
.
我用谷歌搜索过,但找不到功能列表及其含义。任何人都可以帮忙吗?
我正在尝试制作一个程序,该程序使用原始套接字正确运行,具有Linux功能的非root用户.该计划如下:
#include <netinet/ip.h>
int main()
{
int sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
if(sd < 0)
{
perror("socket() error");
return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我编译它并以非root身份运行它,我会收到错误,如预期的那样:
[user@localhost ~]$ make socket
cc socket.c -o socket
[user@localhost ~]$ ./socket
socket() error: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
如果我添加该cap_net_raw
功能,作为一种有效且允许的功能,它可以工作.
[user@localhost ~]$ sudo setcap cap_net_raw+ep socket
[sudo] password for user:
[user@localhost ~]$ ./socket
[user@localhost ~]$
Run Code Online (Sandbox Code Playgroud)
现在,我想用pam_cap.so
它来制作它,以便只有特定的用户才能运行这个程序cap_net_raw
,而不是每个人.我/etc/security/capability.conf
是:
cap_net_raw user
Run Code Online (Sandbox Code Playgroud)
我/etc/pam.d/login
是(注意我也尝试过,/etc/pam.d/sshd
但似乎也没有用):
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so …
Run Code Online (Sandbox Code Playgroud)