技术解析

研究 Linux 版 powershell,却找到了 Linux 的 bug?
0
1975-02-24 07:15:33
idczone
------- [环境] -------
虚拟机,centos 7.6
kernel 升级到了最新 kernel.x86_64.0.3.10.0-957.10.1.el7
find 版本最新 findutils-4.5.11-6.el7.x86_64

QQ 群号=183173532
名称=powershell 交流群
群内创作文章,著作权所有者为群

------- [问题从这里开始] -------
我想,用 powershell 统计,系统最大的 10 个文件。


------- [ linux 的 powershell 命令 1,返回的结果] -------
PS /root> Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 |Select-Object {$_.length / 1mb},fullname

$_.length / 1mb FullName
--------------- --------
134217726.007812 /proc/kcore
101.161056518555 /usr/lib/locale/locale-archive
77.8723373413086 /usr/bin/dockerd-ce
65.3838729858398 /usr/bin/docker
63.01171875 /var/lib/rpm/Packages
51.1564149856567 /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
42.2908325195312 /usr/bin/containerd
29.62109375 /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
28.40234375 /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
27.015625 /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll



------- [ linux 的 powershell 命令 2,返回的结果] -------
du -sh (Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 ).fullname
0 /proc/kcore
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll


我的想法:
咦?怎么变 0 了?我还是用 [正宗 linux 命令] 试试吧。


------- [ linux 的 find 命令 1,返回的结果] -------
find / -type f -exec du -sh {} + | sort -rh | head -n 10
du: 无法访问"/proc/3933/task/3933/fdinfo/6": 没有那个文件或目录
du: 无法访问"/proc/3933/fdinfo/6": 没有那个文件或目录
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll
27M /opt/microsoft/powershell/6-preview/System.Management.Automation.dll



------- [ linux 的 find 命令 2,返回的结果] -------
find / -type f -print0 | xargs -0 du -h | sort -rh | head -n 10
du: 无法访问"/proc/4157/task/4157/fdinfo/6": 没有那个文件或目录
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll
27M /opt/microsoft/powershell/6-preview/System.Management.Automation.dll



------- [ linux 的 find 命令 3,返回的结果] -------
find / -type f -ls | sort -k 7 -r -n | head -10 | column -t | awk '{print $7,$11}'
find: ‘/proc/4267/task/4267/fdinfo/6 ’: 没有那个文件或目录
find: ‘/proc/4267/fdinfo/5 ’: 没有那个文件或目录
140737486266368 /proc/kcore
106075056 /usr/lib/locale/locale-archive
81655064 /usr/bin/dockerd-ce
68559960 /usr/bin/docker
66072576 /var/lib/rpm/Packages
53641389 /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
44345152 /usr/bin/containerd
31059968 /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29782016 /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28327936 /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll



------- [我的疑问] -------

问 1:linux 上所有都是文件么?
是的话,find,du 为什么会报那些错?谁来答答?



问 2:/proc/kcore 是文件么?
测试代码:
[email protected] ~]#ls -l
-r--------. 1 root root 140737486266368 3 月 20 10:57 /proc/kcore



问:find 不加 [-print0 ] 参数后,能算 [最大 10 个文件] 么?
答:不行。
欢迎帮忙测试,下面的命令:
find / -type f | xargs -0 du -h | sort -rh | head -n 10

find / -type f | xargs du -h | sort -rh | head -n 10




问:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?
测试代码:
[[email protected] ~]# find /proc -name 'kc*' -type f
/proc/kcore

/proc/kcore[[email protected] ~]# find /proc -name 'kc*' -type f -print0
返回空,即无返回



问: [ find / -type f -exec du -sh {}] 也有丢文件的 bug,对么?
答:
应该是 du 的问题。

测试代码:
find /proc -name 'kc*' -type f
/proc/kcore

find /proc -name 'kc*' -type f -exec du -sh {} +
0 /proc/kcore




------- [结论] -------
我认为:
[ linux 的 powershell 命令 1,返回的结果]
[ linux 的 find 命令 3,返回的结果]
靠谱点。
虽然 [/proc/kcore ] 返回的结果我并不需要。

当然,我也认为,没占磁盘,du 不应该返回。

powershell 那两个返回都是可以的,find 的返回就不乐观了。
/proc 下的数字目录表示的是进程的信息,而进程会一直创建和销毁,你统计这个有何意义……都是虚拟的文件,不占磁盘空间
排除 /proc 再统计吧
ncdu 更好用

/proc/数字 这里面的都是各个进程(数字是 pid)的基本信息,如果这个 pid 代表的进程结束了,那么就会弹找不到文件。。。
先找一下 /proc 下都是啥牛鬼蛇神不好吗?

提醒一下
本人原来学习 powershell 在国内几个 QQ 群里都待过,建议还是不要进为好,学习讨论氛围太差!
尤其是此贴宣传的 QQ 群.
举个例子,当年 wannacry 爆发之前几个月有相关的网站爆出 SMB 漏洞,我转帖到那个群里
被群管理"传教士"以"黑客小子,脚本小子"为理由封禁了,后来我就直接退了.这种群根本不是做技术讨论的.

如果硬要去,另外一个群比较不错,讨论分析问题不会受到奇葩的限制或者干扰,不过就是爱吵架.

水瓶子不满,晃荡

笑死……管理员怕不是小学生吧

至于楼主这个为什么变成 0,因为 du 并不是查看文件大小的,而是查看文件占用空间的。
如果只要找最大的 10 个文件,那应该用 du --apparent-size 来统计文件大小,而不是用 du 来统计文件占用空间。
最后,Linux 的 bug 在哪?

Powershell 是个神奇的东西,我觉得只有完全不用 shell 的人才会设计出 Get-Item 这样的命令

PS 命令很多都是这样啊,把结果对象化,这样就不需要其他 shell 塞过来塞过去的选择
毕竟有时候需要写正则还是很痛苦的,直接把结果按照变成语言的方式.XX 的呈现给你多方便?

基础不牢,地动山摇

建议 bl0ck

对象化概念我还是很喜欢的,毕竟 shell 基于文本的方式确实太蛋疼的。我是说语法,Get-item 又有大写又有小写还有符号,运维用这个估计想死的心都有

建议看一遍 unix 痛恨者手册

powershell 的开发有 IDE 补全,而且他们那套规则就是这样,一个动词加名词,不用自己解析结果是最好的,多少 shell 命令都是在做简单结果解析。



给 Linux 装 power shell 运行时或者 IDE 还不如直接用 python 写代码,解决一些已解决的问题不知道有什么意思

主要还是跨平台通用的问题吧,.NET 都上 LINUX 了 相应的 PS 可以直接调用.NET 等于是 1+1=3 的好事
不过这又是微软一手好牌打的稀烂,最终结果还是去学 BASH 或 PY.
PS 国内社区都没有

ISE 选中多少运行多少的功能真的是领先啊..

原来进程已经销毁了,感谢 1 楼 2 楼。
3 楼,群是专业群,不过,群里不许分享黑客,提问黑客。
感谢 7 楼,果然出来了,
du --apparent-size -h (Get-ChildItem / -file -Recurse | Sort-Object length -Descending -top 10 ).fullname
128T /proc/kcore
102M /usr/lib/locale/locale-archive
78M /usr/bin/dockerd-ce
66M /usr/bin/docker
64M /var/lib/rpm/Packages
52M /boot/initramfs-0-rescue-314df5eb857b4ced8b7d82f9365999e7.img
43M /usr/bin/containerd
30M /var/cache/yum/x86_64/7/base/gen/primary_db.sqlite
29M /var/cache/yum/x86_64/7/epel/gen/primary_db.sqlite
28M /opt/microsoft/powershell/6.0.5/System.Management.Automation.dll

[[email&~]find /proc -name 'kc*' -type f -exec du --apparent-size {} +
137438951432 /proc/kcore
问:最后,Linux 的 bug 在哪?
答:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?

Get-item 又有大写又有小写还有符号,运维用这个估计想死的心都有-----------在 win,linux 中的 powershell 中。( linux 叫 pwsh )你输入小写的 get-i 然后打 tab 即可。 若你输入 get-item,也能正常运行。所有命令不区分大小写,还支持中文文件名,中文脚本名,中文参数名,中文变量名。
大家看看这个脚本:
$a = jc 检测 [win-linux 进程命令行中] 关键字的并发数 2.ps1 -想要检测的关键字 'xxx.jar'
$a xxx.jar 进程 ,则$a 返回 2
打 jc + tab,即可补全脚本名。
打 - + tab,即可补全参数名 “-想要检测的关键字”

PS 国内社区都没有---------楼主的群,就是 ps for win,linux ps 社区,就是精品社区。。

Windows 就是瞎搞, 你一个 Linux 的软件居然需要另外一个 repl 去调用, 实在是难以想象。

拉倒吧 什么叫提问黑客,安全防护是整个行业一环,转发一个安全新闻就叫黑客提问,windows 恰恰是最需要关注相关知识的地方。
我看你就是传教士本人吧

你居然那么不知趣我也就明说了
QQpowershell 唯二的两个群其中一个就是躲避你的
搞个 QQ 群跟土大王一样,群里气氛弄得跟宗教传教一样
ps 没上 linux 之前怎么黑 linux 的自己都忘了?
还专业群,宗教群吧!

ps 的 tab 自动补全很弱智 get-i + tab 一下显示的 是 Get-IseSnippet 如果 get- +tab 不知道要 tab 多少次

我先 block 为敬

问:加上 [-print0 ] 参数后,返回消失了,这是 find 的 bug 么?
查一下每个指令的参数意义再问问题好吗?
`-print0`不是没有输出, 导到文件或是其他程式转一下就知了
指令: `find /proc -name 'kc*' -type f -print0 | base64 -`
输出: `L3Byb2Mva2NvcmUA`
不要动不动就喊 bug= =

参考:
https://superuser.com/questions/118639/whats-the-usage-of-exec-xargs-and-print0
http://blog.sina.com.cn/s/blog_5611597901019nye.html

重名的太多,没法子呀,linux 也一样。
bash 补全=bash 一手好牌打的稀烂,最终结果还得去学 ps。

任何媒体,都有禁止内容,都要有监管。fb 也封杀几十万账户。也是土大王。毒枭也禁止手下马仔碰 du,有自由么?
你再嚷嚷,群规还是那样(宗教群宗旨):“群是正规 ps 社区,不是 ps 黑社会。不是 ps 贼窝。禁止学用 ps 作恶,禁止 ps 黑客,禁止提问,分享,黑客技术”,我不觉得有问题。
ps 是我心爱的东西,我不想社区脏了。可以吗?

凡是游戏,就要封杀外挂,大家怎么看?
凡是多人游戏,中国开挂最多,外国人都想封杀国区,大家怎么看?
脚本小子,大义凛然,阵阵有词,大家怎么看?
从 winxp,到 win10,收紧权限,大家怎么看?
堕落的人多否? win 中脚本小子多否?教旨好否?欢迎探讨。

bash tab 两下能把匹配的列出来,所以问题不大

这么说楼主真的是"传教士“么

你貌似认为网络安全就是黑客技术?那抱歉,在下告辞

~]find /proc -name 'keys' -type f
/proc/keys
[[email&~]find /proc -name 'keys' -type f -print0
返回空。
hi 我不认同 要 base64 的做法,还认为这是 刁民 /刁钻 的做法。或者说 此参数有,未知的大坑。

哈哈哈 说的好高大上,奇葩到底还是奇葩
从安全防护=黑客 这种奇葩思想是只有你一个人拥有的,不但思想奇葩甚至连正常的是非对错都无法分辨,把这种错误的思维和强加到你所谓"大义"上只是你自嗨罢了.还好意思举例子.理讲都讲不通

原来就感觉这人偏执的很思维也很奇怪,现在发现脑子也不正常.
这里不是你那 QQ 群一亩三分地,把人禁言了没人反你,少把你那套东西搞到这里
自己搞不懂的东西就是 BUG?不符合自己心仪的就是错误的做法?
多去学学吧!要么就滚回你那一亩三分地

https://www.v2ex.com/t/545357
这哥们真挺逗的,哈哈哈哈

我建了一个 linux 群,教人 linux 命令语法,要求人尊重分享者,要求。跪拜 linux 大神“脱袜子”
跑进来不好好学命令语法,总想研究拿肉鸡,用人机子挖矿,总想在群里吸血,不愿分享。总想保留朝 linux 大神“脱袜子”吐痰的权利。这就是你。谁喜欢你,就把你这孙子带走。

人身攻击就没意思了。。。

/>所以你还是没查`-print0`代表的意思????
就告诉你不用换行改成'\0'分隔档名
自己看清楚下完指令后下一行`[[email&~]/>自己不看说明, 不看清楚输出, 就怪别人有坑?!!
刁民到底是谁啊 Zzz

/>再补充一下
终端没显示不代表没输出
印出不可见字元也是输出
base64/hexdump 转一下就知道有没有东西
连验证都不会
还要怪别人有坑= =

呵呵,又脑补全世界都是"黑客小子,脚本小子"了.
V2 不能像 QQ 群里那样让你封人,不能封上人嘴喷人家好急吧?
无能狂怒形容你真很贴切.

30 楼哥们发的那帖子,这种智商和文化水平还有脸皮去讨论别的问题,先救救你的专业水平吧
哈哈

顽固不化?

有啊,但是没用啊。
不换行的话,,行不行,我不知道。但我知道 kcore 丢了。感觉应该是不行。
find / -type f -print0 | xargs -0 du -h 这个你试过么? -print0 输出的不换行,应该用 -0 就可以接收吧。
去掉-print0 -0 也不行,不去也不行。所以我的结论才是 bug。
你的结论是什么呢? 是“去掉也不行,不去也不行,也不是 bug,就是不能这么用” 对么?

竟然没人喷“群内创作文章,著作权所有者为群”这句话?

你哈哈 个 啥?
人没理想 跟咸鱼有啥区别?
人不思考 跟木头有啥区别?
思考,类比,讨论有何不好?你哈哈 个 啥?说出你的笑点,看看哈不哈?

上蹿下跳,看给你美的,群学习讨论氛围太差? 有你给此本贴带来了屎一样的氛围差么?没你的群学习氛围很好。

欢乐多

槽点太多,说不过来了.
block

/>`find / -type f -print0 | xargs -0 du -h`
试过, 不行在哪?? 看不懂你这想表达啥
kcore 丟了??
你有试过`find /proc -name kcore -print0 2>/dev/null`去掉错误讯息吗?
你有试过`find /proc -name kcore -print0 2>&1 | grep kcore`
让 grep 告诉你 kcore 有没有出现吗???
`find /proc/ -type f -print0 2>/dev/null | xargs -0 du -sh --apparent-size 2>/dev/null | sort -rh | head -n 10`
无视所有错误讯息的输出你又有试过了吗?

自己不查清楚、不搞清楚意思、不会用 /用错方法怪别人有坑 Zzz
就比如开着船上公路, 开不了, 就开喷"不是交通工具吗? 为啥不让开"一样的 Zzz

如果你觉得是 Find 的 bug 就说是 Find 的 bug 呗,还非得和 Linux 扯上关系。

看了下楼主发帖历史 告辞…

“群里不许分享黑客,提问黑客” 太厉害了!

我加入一个群不过很安静,但有真东西。 毕竟个个要养家

感谢你的解答。已经给你感谢铜币。
经过我的测试,这个完美了。
find / -type f -print0 | xargs -0 du -sh --apparent-size 2>/dev/null | sort -rh | head -n 10
说明:
1 跟据 41 楼修改而来,第一个命令不需要过滤掉错误,也能正常输出。
2 顶楼问题需求很简单。
3 楼顶上的那些 linux 命令组合,是我搜到的,但是不正确,和最终比差不少。
4 还是 powershell 简单。实现此需求的 linux 命令很难写出,需要命令高手,或者还需要研究很久。
4.1 find / -type f 我想大家都能写出,但刷刷报错。
4.2 会加 -print0 的人就很少,就算是搜到,还要另一个命令的-0 协作。但这并不能解决顶楼问题,还会丢对文件的统计。
4.3 --apparent-size 有有几个人会呢?起码写“统计 10 个 linux 最大文件”命令的那‘网上分享者’不会。
4.4 或许你们认为你们都会,就我是猪。
我欢迎你们把这道题写入"linux 开发人员,运维人员面试题"。
如上述命令中,--apparent-size 干嘛用的,不加行么?
看几个人能正确写出。
那很正常啊,win 客户机多,是 linux 的 90 多倍。再说一个 linux 群 /论坛 /社区,会欢迎 linux 黑客么?谁敢再说我就要分享 linux 黑客技术 /工具了。
最后,我想说,这是一个单纯技术研究的提问帖子,不讨论技术的滚远点。带节奏的滚远点。


> ps 是我心爱的东西,我不想社区脏了。可以吗?
可以,那就放开安全相关讨论,否则就真的脏了。

> 凡是游戏,就要封杀外挂,大家怎么看?
对,而你的行为就是说游戏公司不要封杀外挂,把说要封杀外挂的人封了就没人说了。
> 凡是多人游戏,中国开挂最多,外国人都想封杀国区,大家怎么看?
对,而你的行为就是说不要封杀国区,把说要封杀国区的人封了就没人说了。
> 脚本小子,大义凛然,阵阵有词,大家怎么看?
朝你看。
> 从 winxp,到 win10,收紧权限,大家怎么看?
好,所以我们不能封了提出要收紧权限的人。
> 堕落的人多否?
少得可怜。万人不出一。
> win 中脚本小子多否?
少得可怜。万人不出一。
> 教旨好否?
教旨不错,而你是最大的违背者。

你这是典型的 “不解决问题,解决提出问题的人” 的思路。
安全威胁一直存在,避而不谈不是解决问题的方法。
避而不谈最明显的结果就是大家都写出来有漏洞可以被利用的程序。
假设你群中有名群友因为你封堵信息,不知道某个漏洞的存在,写出来被此漏洞影响的程序。
造成经济损失,你怎么办?
造成人员伤亡你又怎么办?
自然,法理上你是没什么责任的,但你正是直接造成这件事的人。
linux 群、论坛、社区 都很欢迎黑客,只要并不是故意地破坏社区,任何工具的分享都很受欢迎。
当然 v2 并不是 linux 论坛, “ V2EX 的使命是为创意工作者打造一个最好的社区,他们在这里可以获得灵感,分享想法,找到伙伴,获得通向目标的加速度。” 所以在此分享非自己所写的任何工具原则上不被接受——也不因非原创而排斥就是了。

今天心情好,就免你一顿嘲讽,只 block 你好了。

光说不做假把式。
v2ex 里有个分享创造版,你先上去分享点黑客工具,木马我看看。
你在 linux 版,分享点攻击人机子的技法,我看看。
转贴:
中央网络安全和信息化委员会成立一年以来,经党中央作出一系列重大决策,我国网络安全保障能力稳步提升,
管得住才是硬道理。
主管部门协同发力、联合整治,依法约谈网站 1497 家,取消违法网站许可或备案、关闭违法网站 6417 家,移送司法机关相关案件线索 1177 件。依法管网治网进一步加强,我国网络空间日渐晴朗,公民网络素养也正大幅提升,我国网信事业快速健康发展成果,,正越来越好的造福人民。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服