0

是否有一种编程方式来限制持续时间、内存使用并以 C/C++ 或 Ruby 中 Linux 程序执行的特权用户身份运行?

因为系统或``不能这样做。

sprintf(cmd_str,"/tmp/pro-%d < /tmp/in.txt > /tmp-%d.txt",id,id);
system(cmd_str); // in C

`/tmp/pro-#{id} < /tmp/in.txt > /tmp/out-#{id}.txt` // in Ruby

这两个语句都使该命令以与执行者相同的用户身份运行,根据需要使用整个处理能力和内存。

4

3 回答 3

2

使用seteuid(2)系统调用;设置调用进程的有效用户ID。

以下是 Ruby 示例(请参阅Process::Sys.seteuid

Process.uid    # => 0
Process.euid   # => 0
Process::Sys.seteuid(1000)  # Etc::getpwnam('falsetru').uid == 1000
Process.uid    # => 0
Process.euid   # => 1000
于 2014-02-09T13:16:46.240 回答
1

您需要使用setrlimit系统调用来限制内存 ( Process::RLIMIT_AS)。要限制程序的运行时间,您只能控制进程获得 CPU 时间的总秒数(因此这不考虑睡眠或等待 I/O 所花费的时间)。这已经完成了Process::CPU

设置这些 rlimits 之后,但在Process::Sys.setgid使用.Process::Sys.setuid Process::exec

示例目标程序:

#include <stdio.h>
#include <stdlib.h>

#include <unistd.h>

#define ALLOC_SIZE_1  1024
#define ALLOC_SIZE_2  (1024 * 1024 * 5)

int
main(int argc, char *argv[])
{
  char *buf;

  fprintf(stderr, "[+] uid: %d, gid: %d\n", getuid(), getgid());

  fprintf(stderr, "[+] trying to allocate %d bytes (should succeed)...\n", ALLOC_SIZE_1);
  if (NULL == (buf = malloc(ALLOC_SIZE_1))) {
    fprintf(stderr, "[!] failed!\n");
    return -1;
  }

  fprintf(stderr, "[+] success.\n");
  free(buf);

  fprintf(stderr, "[+] trying to allocate %d bytes (should fail)...\n", ALLOC_SIZE_2);
  if (NULL != (buf = malloc(ALLOC_SIZE_2))) {
    fprintf(stderr, "[!] succeeded!  (should have failed.)\n");
    return -1;
  }

  fprintf(stderr, "[+] ok.  now doing infinite loop (should get killed pretty soon)...\n");
  for (;;);

  return 0;
}

并附带 Ruby 脚本来调用它(以 root 身份运行此脚本,例如sudo /tmp/foo.rb):

#!/usr/bin/env ruby

TARGET_GID = 99
TARGET_UID = 99

Process::setrlimit(Process::RLIMIT_AS, 1024 * 1024 * 5)
Process::setrlimit(Process::RLIMIT_CPU, 3)

Process::Sys.setgid(TARGET_GID)
Process::Sys.setuid(TARGET_UID)

Process::exec('/tmp/test')

最后,在我的机器上运行的输出:

$ sudo ./run.rb
[+] uid: 99, gid: 99
[+] trying to allocate 1024 bytes (should succeed)...
[+] success.
[+] trying to allocate 5242880 bytes (should fail)...
[+] ok.  now doing infinite loop (should get killed pretty soon)...
$
于 2014-02-09T14:23:52.550 回答
1

正如@falsetru 所指出的,您要以其他用户身份运行的系统调用是setrlimit或来自命令行susudo.

如果你想限制资源,你想使用setrlimit系统调用或ulimit从shell。这将限制内存使用等,但不会限制总运行持续时间 - 如果需要,您必须跟踪进程和kill它。

你也可以考虑nice设置它的优先级。

于 2014-02-09T13:20:34.680 回答