SSH远程命令执行和ulimit

7
我有以下脚本:

cat > /tmp/script.sh <<EndOfScript
#!/bin/sh
ulimit -n 8192
run_app
EndOfScript

该程序在本地运行顺畅,一切正常。但是如果我尝试通过ssh远程运行它:

scp /tmp/script.sh user@host:/tmp/script.sh
ssh user@host "chmod 755 /tmp/script.sh; /tmp/script.sh"

我得到了一个错误:
ulimit: open files: cannot modify limit: Operation not permitted

我也尝试了以下命令:

ssh user@host "ulimit -n 8192"

同样的错误。

看起来ssh远程命令执行正在强制实施1024个nofile限制的硬限制,但我找不到如何修改此默认值。我尝试修改/etc/security/limits.conf并重新启动sshd,但仍然出现相同的错误。


1
终于找到正确的答案了:将以下内容添加到/etc/initscript中: ulimit -c unlimited ulimit -HSn 65535

执行程序。

eval exec "$4"
- Long Cheng
4个回答

14

如果你想让sshd遵循/etc/security/limits.conf中的设置,而不是使用/etc/initscript的解决方法(请不要在该文件中出现拼写错误.. :)),你需要在/etc/ssh/sshd_config中确保有UsePAM yes,并且/etc/pam.d/sshd列出了session required pam_limits.so(或者包含另一个包含该信息的文件)。

以上就是全部内容。

在旧版本的OpenSSH(<3.6)中,还存在一个问题,即UsePrivilegeSeparation会阻止限制生效,但在新版本中已修复。


1
检查了这两个文件的这些行,它们是存在的。在 OpenSSH_5.8p1 Debian-7ubuntu1、OpenSSL 1.0.0e 6 Sep 2011 上运行。仍然和 OP 一样的问题 :| - kellogs
我已经寻找这一信息很久了 - 谢谢! - Leagsaidh Gordon
我已经搜索并尝试了不同的修复方法好几天了,而“/etc/ssh/sshd_config”中的“UsePAM yes”正是我所缺少的。非常感谢! - Kevin M

4
最终找到了答案:将以下内容添加到/etc/initscript。
ulimit -c unlimited
ulimit -HSn 65535
# Execute the program.
eval exec "$4"

谢谢。奇怪的是我在ulimit手册页上找不到-H和-S选项。 - smartnut007

2
“ulimit”需要超级用户权限才能运行。
我建议您向服务器管理员请求,在您尝试运行脚本的服务器上为您修改该值。
他/她可以通过修改Linux上的/etc/security/limits.conf来完成这个操作。以下是一个可能有帮助的示例:
*               soft    nofile          8192
*               hard    nofile          8192

之后,您无需重新启动sshd。只需注销并再次登录即可。
我建议您在ServerFault上询问相同的问题。那里会得到更好的与服务器相关的答案。

1
我修改了 /etc/security/limits.conf 文件,重启了sshd,甚至重启了机器。但是仍然无法获得比1024更大的nofile限制。 - Long Cheng
你能在limits.conf中发布相关行吗?它可能包含错误。请记住,sshd进程需要应用ulimit,因此请检查其启动脚本中是否没有设置ulimit等。 - wds
我已经将你想要的内容添加到答案中。 - Pablo Santa Cruz

1

检查启动脚本(/etc/profile~/.??*)是否调用了ulimit。据我所知,一旦限制被施加,就无法再扩大限制。


重启会重置限制吗? - mcandre
只有在启动期间未执行ulimit命令时才能生效。如果您创建了一个新的shell窗口,则ulimit仅对该shell和所有子进程有效。在这种情况下,启动新的shell窗口已经再次创建了一个没有限制的会话。如果ulimit在启动脚本中,则在您可以执行任何操作之前,所有shell都会受到影响,因此重新启动无济于事。您必须首先禁用该命令。 - Aaron Digulla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接