当前位置: 首页 > news >正文

广州网站建设比较wordpress手册 chm

广州网站建设比较,wordpress手册 chm,wordpress api文档,看设计比较好的网站在维护实习单位服务器的过程中#xff0c;偶然发现一个有350万文件的文件夹需要清理#xff0c;于是我习惯性执行了rm -rf ./*#xff0c;却在数秒后被告知“参数列表过长”。在一番折腾过后#xff0c;我终于通过取巧的办法完成了这一任务#xff0c;也随着相关内核源码的…在维护实习单位服务器的过程中偶然发现一个有350万文件的文件夹需要清理于是我习惯性执行了rm -rf ./*却在数秒后被告知“参数列表过长”。在一番折腾过后我终于通过取巧的办法完成了这一任务也随着相关内核源码的阅读了解到了关于Linux Shell的一些有趣特性。本文原载于未命名小站由作者本人同步至知乎转载请注明原作者博客地址或本链接谢谢0x01最初我以为是rm命令对文件数量存在限制但当我尝试ls ./*、touch ./*等命令都遇到这一问题之后我开始将注意力放在Bash本身上。也许是通配符的限制。突然我想起来rm命令支持管道送入参数也许可以通过这样的办法变相完成任务。于是我在另一个目录做了个测试$ touch 123-1 $ touch 123-2 $ echo 123-1 123-2 | xargs rm这两个文件果然消失。于是我尝试使用find将目录下面所有文件列出find . -name * | more # 使用more避免350多万个文件把终端挤崩溃 find . -name * | wc -l # 大致了解文件个数输出的文件个数与我通过ls -l命令输出的个数基本一致果然输出了所有文件。接下来要做的就是将这些文件送到rm中。0x02但事实并非如此简单当我执行以下命令以为可以一口气顺利删除所有文件的时候我傻眼了$ find . -name * | xargs rm rm: log: No such file or directory rm: 20190601-110204.log: No such file or directory ... # 所有待删除文件均发生报错我重新观察文件名发现文件名格式均为log yyyymmdd-hhmmss.log众所周知Bash靠空格分割参数文件名被传入rm的时候照着空格被截断成为了两个文件名难怪删除失败0x03吸取教训我使用了一个新的参数find . -name * -print0 | xargs -0 rm注意这一参数里的-print0与-0这是为了区分空格与分界符加入参数后此前用于分隔参数的空格0x0a则会变成NUL0x00这一参数的效果可以通过16进制查看器体现$ ls 123 321 123 322 $ find . -name 12* 1.log $ find . -name 12* -print0 2.log $ hexdump -C 1.log 00000000 2e 2f 31 32 33 20 33 32 31 0a 2e 2f 31 32 33 20 |./123 321../123 | 00000010 33 32 32 0a |322.| 00000014 $ hexdump -C 2.log 00000000 2e 2f 31 32 33 20 33 32 31 00 2e 2f 31 32 33 20 |./123 321../123 | 00000010 33 32 32 00 |322.| 00000014可以发现在两个不同输出模式下分隔符不一样。默认的分隔符与空格一致即0x0a但当开启-print0模式后分隔符变成了0x00配合管道接收端的-0参数将NUL字符正确解析成参数定界符则可以完成带空格文件名的正常解析。解决了这一问题我们再次执行问题随即解决。0x04过了两天又有一台服务器需要删除大量文件且领导要求只删除文件不删除里面的目录我一看又是400多万个文件。但在之前的折腾过程中我早有准备。find命令默认开启递归模式如果只删除文件不删除目录只需要配置递归深度为1即可find . -maxdepth 1 -name * -print0 | xargs -0 rm执行命令后再执行ls -l发现问题果然解决所有目录完好无损。0x05快速解决完问题后我一看离下班还有好一阵子便开始琢磨Bash内通配符的长度限制到底从哪来。我首先找了另一个有大量文件的目录开始实验换用zsh进行ls ./*操作得到的确是一样结果。看来该长度限制与Bash无关。我突然想起来曾经看过的一个安全类视频Youtube - Bash injection without letters or numbers - 33c3ctf hohoho (misc 350) - LiveOverFlow其中解释了通配符Wildcard的原理。当我们输入*的时候Shell所做的是列举出满足通配符规则的所有文件并以空格分割然后送进Shell。举例而言如果你有一个全是txt文件的目录你直接执行*就会发现以下错误$ touch abc.txt $ touch bbc.txt $ * bash: command not found: abc.txt $ echo * abc.txt bbc.txt相信看到这里大家都明白通配符的行为以及为什么上述示例会报错在上述示例中Shell将abc.txt看做命令而将bbc.txt看做参数。这也说明了通配符的行为将满足条件的文件输出为文本并默认输出到Shell。0x06当我们继续向下挖掘我们会想到Shell执行命令的本质exec()类系统调用。这一限制如果并非来自于Shell因为find . -name *并不会报错那么就一定来自于系统调用。而一个Shell命令被执行的第一站则是exec()及其六个实际调用execl()execle()execlp()execv()execvp()execve()。于是我们使用strace工具来检查所有系统调用$ ls 1234.txt 123.txt $ strace ls * execve(/usr/bin/ls, [ls, 1234.txt, 123.txt], [/* 28 vars */]) 0 ...看到这里相信读者已经心里有数了我们的命令与参数都被作为execve()函数的第二个参数以数组形式被传入。考虑到数组默认存储在栈中该限制是否来自于Shell对栈空间的限制呢我查阅了Linux的源码在fs/exec.c:478中找到了我要的内容源码static int prepare_arg_pages(struct linux_binprm *bprm,struct user_arg_ptr argv, struct user_arg_ptr envp) {unsigned long limit, ptr_size;bprm-argc count(argv, MAX_ARG_STRINGS);if (bprm-argc 0)return bprm-argc;bprm-envc count(envp, MAX_ARG_STRINGS);if (bprm-envc 0)return bprm-envc;/** Limit to 1/4 of the max stack size or 3/4 of _STK_LIM* (whichever is smaller) for the argvenv strings.* This ensures that:* - the remaining binfmt code will not run out of stack space,* - the program will have a reasonable amount of stack left* to work from.*/limit _STK_LIM / 4 * 3;limit min(limit, bprm-rlim_stack.rlim_cur / 4);/** Weve historically supported up to 32 pages (ARG_MAX)* of argument strings even with small stacks*/limit max_t(unsigned long, limit, ARG_MAX);/** We must account for the size of all the argv and envp pointers to* the argv and envp strings, since they will also take up space in* the stack. They arent stored until much later when we cant* signal to the parent that the child has run out of stack space.* Instead, calculate it here so its possible to fail gracefully.*/ptr_size (bprm-argc bprm-envc) * sizeof(void *);if (limit ptr_size)return -E2BIG;limit - ptr_size;bprm-argmin bprm-p - limit;return 0; }从完整的注释中我们可以得知限制最大参数长度的参数叫做ARG_MAX而且其大小为栈的1/4可能是为了保证参数以外还有多的空间可以存储其他数据。当然如果你是个考古爱好者你会发现在2.6版本内核低于2.6.22的include/linux/limits.h文件中ARG_MAX是一个写死的常量 考古链接。关于ARG_MAX我们可以通过Linux下的getconf命令来获取这是一个获取Linux下所有全局变量/常量的命令$ getconf ARG_MAX 2097152我们再查询当前配置的栈大小$ ulimit -s 8192ARG_MAX参数的单位是Byteulimit -s命令的单位是MB可以看到当前最大参数数量的确是栈空间的1/4。那如果我们把栈空间增大呢$ ulimit -s 81920 $ ulimit -s 81920 $ getconf ARG_MAX 20971520可以看到允许的最大参数数量立马随着栈空间增大而同步增大。这个时候我们再来删除之前那个大目录就不会出现『参数列表过长』的错误提示了。实际上这一限制在大多数现代操作系统中均存在例如MacOS、Windows等可参考此处获得更多信息ARG_MAX, maximum length of arguments for a new process
http://www.sadfv.cn/news/17835/

相关文章:

  • 做网站排名推广效果怎么样网站建设预算申请
  • 在线a视频网站一级a做爰社群小程序搭建
  • 网站营销定义网站网页设计公司
  • 江门免费模板建站win7做系统网站哪个好
  • 2017网站备案页面设计模板网站
  • 建设虚拟币交易网站做围棋题网站
  • 自己怎样做海外网站如何做网页跳转
  • 长春seo公司长春网站设计网站建设鞍山
  • 网站建设加后台深圳设计网页
  • 网站怎么在工信部备案遵义建设厅官方网站 元丰
  • 网站后期维护流程正规营销型网站培训中心
  • 企业网站搜索优化外wordpress网站管理员插件
  • 网站程序系统精品一卡2卡三卡4卡二百信息网
  • 邢台哪有学做网站的网站建设相关文献
  • iis网站正在建设中wordpress文章内链指定关键词
  • 网站建设主机端口哪个软件做网站好
  • 如何快速自己做网站中国电力建设集团网站
  • wordpress打不开rss网站排名优化
  • 上海网站设计大概要多少钱wordpress默认参数
  • 沈阳好的网站网站使用支付接口如何收费
  • 德洲网站建设wordpress底部栏如何编辑
  • 厦门优化网站上海计算机考试网页制作
  • 广州网站建设商长春建站免费模板
  • iis怎么做网站射阳做网站的公司
  • 徐州免费网站建站模板天河区门户网站
  • 怎么看网站是用什么程序做的求个a站
  • 社区建站网站系统wordpress物流插件
  • 南通网站排名优化报价网站开发的设计与实现
  • 哪家公司建设网站wordpress 采集伪原创
  • 网站开发前端跟后端的区别关键词免费下载