ssh因Operation not permitted致使没法登陆系统

之前碰到过,可好记性不如笨笔头,并且此次属于"严重事故",必须记录下来。linux

为何会出现这个错误提示?shell

1. root用户执行或设置了ulimit -n unlimitedbash

nofile它不识别unlimited,它是一个有限的值。若是你在/etc/security/limits.conf设置了nofile的unlimited,OK,你要跪了,不能登陆操做系统啦。session

2.root用户执行或设置了一个超出容许范围的值,如ulimit -n 1122334455并发

永久修改:  /etc/security/limits.conf 的 nofile参数(或/etc/security/limits.d/目录下添加nofile参数)ssh

3.非root用户设置了比他分配到(/etc/security/limits.conf决定)的nofile还大(非root用户只能是越调越小,root不限制)阿里云

当你没法登陆操做系统,连阿里云管理控制台都进不去,阿里云又不能单用户模式,只能发工单让阿里云的挂盘修改,是否是很可怕,更可怕是跟阿里云技术沟通!我的用户不受重视啊(派个小兵,走下流程,要是发生在线上就是事故了)。操作系统

咱们知道,ulimit命令是用来shell启动进程所占用的资源限制的。.net

而nofile(max number of open file descriptors)是有一个上限的,由内核参数nr_open定义的。日志

nr_open是一个进程最多同时打开的文件句柄数量。

在2.6.25内核以前有个宏定义,定义了这个值的最大值,为1024*1024,正好是100万,而在2.6.25内核及其以后,这个值是能够经过/proc/sys/fs/nr_open来设置。

sysctl  -a |grep nr_open

fs.nr_open = 1048576  

咱们能够看下系统用了多少文件描述符,上限是多少

cat /proc/sys/fs/file-nr
3552    0       65535

第一个表示已经分配了的文件描述符数量, 第二个表示空闲的文件句柄数量, 第三个表示可以打开文件句柄的最大值(跟file-max一致)

那么,一旦这个max超过nr_open的值,就会出现咱们标题的-bash: ulimit: open files: cannot modify limit: Operation not permitted 错误了.

那为何是ssh服务异常,其余服务,如WEB是没有问题的呢?

带着问题我看了一下系统日志,原来,个人/etc/ssh/sshd_config配置里面开启了pam(关闭后即便Operation not permitted也能登陆SSH)

SSH服务中有一个pam_limits认证模块

所属类型:session

功能描述:该模块限制用户会话过程当中系统资源的使用率。缺省的,该模块的配置文件是/etc/security/limits.conf,可使用conf参数指定自定义的配置文件。

因此咯,ssh并无权限突破系统的限制,咱们也就登陆不了系统了。

总结:

hard nofile 要小于 nr_open

咱们使用ulimit或limits.conf来设置时,若是要超过默认的1048576值时须要先增大nr_open值(sysctl -w fs.nr_open=2097152或者直接写入sysctl.conf文件)。

说官方点,就是先修改系统级别的参数,再去修改用户级别的参数,这个才是调整参数的正确姿式-。-

错误信息:

 error: PAM: pam_open_session(): Permission denied

 pam_limits(crond:session): Could not set limit for 'nofile': Operation not permitted

问题:

1.ssh配置文件中开启pam和不开启pam有什么区别?

利用 PAM 管理使用者认证有不少好处,能够记录与管理。

2.咱们必定要加那么大的nofile?

咱们必定要加那么大的文件描述符吗?不须要,除非你单台要跑上百万的并发,通常咱们65535就足够了。

参考:

linux 最大文件打开数nofile及nr_open、file-max说明

PAM认证

相关文章
相关标签/搜索