使用 sudo ulimit 时找不到命令[已关闭]

问题描述 投票:0回答:2

我使用的是 ubuntu 12.04,我在上面运行 ulimit -n ,它显示 1024, 我想将打开文件限制从 1024 增加到 65535,所以我尝试了以下命令:

sudo ulimit -n 65535

但我收到以下错误:

sudo: ulimit: command not found

如何将文件限制从1024增加到65535?任何帮助将不胜感激。

linux shell ubuntu-12.04
2个回答
122
投票

ulimit
是一个像
cd
一样的内置 shell,而不是一个单独的程序。
sudo
查找要运行的二进制文件,但没有
ulimit
二进制文件,这就是您收到错误消息的原因。

您有几个选择:

  1. 在较新的 Linux 版本上,通常有一个

    prlimit
    命令 一个二进制文件,这意味着您可以在需要时
    sudo
    它。

    奔跑

    prlimit --pid=$$ --nofile=65000:
    

    增加当前shell的软限制。

    $$
    就是这么神奇 被解释为“当前 shell 的进程 ID。”

    如果该命令抱怨“不允许操作”,

    sudo prlimit
    在大多数情况下都可以工作。

    sudo prlimit --pid=$$ --nofile=65000
    

    如果您仍然收到“不允许操作”的信息

    sudo
    ,您可能会 遇到其他一些内核限制,例如超出允许的最大值 限制。

  2. 以前你只能靠跑步

    sudo sh -c "ulimit -n 65535 && exec su $LOGNAME"
    

    这可能仍然适用于较旧的 Linux 安装。它会给你一个新的 shell,没有 root 权限,但具有提高的限制。

    exec
    导致新的 shell 用
    sudo
    权限替换进程,所以 退出该 shell 后,您不会意外地再次以 root 身份结束。

    然而,这在较新的(2022+?)发行版上似乎无法可靠地工作, 其中

    su
    重新应用默认限制。

    prlimit
    方法要好得多,因为你没有 运行 root shell 或分叉进程的安全问题 来自根外壳。如果你绝望了,一个危险的变体似乎 在新发行版上工作是可怕的事情
    sudo -E sh -c "ulimit -n 65000 && exec setpriv --reuid=$(id -u) --regid=$(id -g) --inh-caps=-all --groups=$(groups|tr ' ' ,) -- env USER=\"$USER\" LOGNAME=\"$LOGNAME\" \"$SHELL\" --login"

    然而,选项#1要简单得多,安全风险也小得多 观点,如果有的话你绝对应该使用它。


0
投票

我过去不得不处理类似的问题。由于 shell 脚本没有 setuid 机制(因为它不安全),我发现用 setuid 编写一个简单的 C 包装器就足够了,然后在删除权限并执行 shell 之前使用系统调用来修改正在运行的进程的 ulimit脚本。

© www.soinside.com 2019 - 2024. All rights reserved.