那些不了解Terminal的人通常会害怕使用它,因为担心他们会弄乱命令并导致计算机崩溃。那些了解Terminal的人最好知道不是这种情况-通常Terminal只会输出一个错误。但是实际上是否有会使您的计算机崩溃的命令?
那些不了解Terminal的人通常会害怕使用它,因为担心他们会弄乱命令并导致计算机崩溃。那些了解Terminal的人最好知道不是这种情况-通常Terminal只会输出一个错误。但是实际上是否有会使您的计算机崩溃的命令?
sudo
和rm
命令,则可能会丢失数据。Answers:
使计算机崩溃的一种方法是执行所谓的fork-bomb。
您可以通过以下方法在unix系统上执行它:
:(){ :|: & };:
这是一个将递归生成进程的命令,直到OS如此繁忙以至于不再响应任何操作为止。
;
,&
您可以同时删除所有文件和fork炸弹,看看哪个首先破坏了系统!
不知道您关于“使计算机崩溃”的意思-如果您将其重新表述为“使计算机无法使用”,则可以。当然,只需要一个单一的流浪命令-就在您不清楚自己在做什么的那一刻,就像您不加思考地说话时一样,损害可能是巨大的,几乎是立即的。经典示例:
$ sudo rm -rf /
如果仅让该命令运行一秒钟,则可能会耗尽系统的足够内存,使其无法启动,并可能导致不可逆的数据丢失。不要这样
-r
表示以递归方式删除目录中的文件。-f
表示“强制”,因为无论给定文件的权限如何,都不要求确认。/
是文件系统的根目录,这意味着它将破坏所有内容,除非某些特殊文件的行为不像典型文件。另外,您将很难找到一条简短的命令,该命令将导致没有root / admin权限的系统崩溃。
rm -rf /
了一会儿,rm
说如果要删除根,请使用某某标志。没有数据丢失。似乎现在已经有了防止盲目运行的安全保护rm -rf /
。
rm -rf
非常相似,但确实出错了:/
假设您不知道自己在做什么以及尝试备份某些硬盘驱动器
dd if=/dev/disk1 of=/dev/disk2
好吧,如果您将它们混合在一起(切换if和of),它将用旧数据覆盖新数据,而不会出现任何问题。
存档工具可能发生类似的混淆。坦率地说,大多数命令行实用程序都是如此。
如果您希望一个字符混用的示例使系统崩溃,请看一下这种情况:您要将当前目录中的所有文件移动到另一个:
mv -f ./* /path/to/other/dir
让我们接受一个事实,您已经学会了使用它./
来表示当前目录。(我知道)如果您省略点,它将开始移动所有文件。包括您的系统文件。您很幸运,您没有对此感到不高兴。但是,如果您在某处读到“ sudo -i”,则不必再键入sudo,您现在已经以root用户身份登录。现在,您的系统正在自己的面前吃光。
但是我再次认为,诸如用垃圾覆盖宝贵的代码文件之类的事情比较麻烦,因为我弄乱了一个字符或因为我弄混了参数的顺序。
假设我想检查一下gcc生成的汇编代码:
gcc -S program.c > program.s
假设我已经有一个program.s,并且我使用TAB完成。我很着急,忘了两次TAB:
gcc -S program.c > program.c
现在,我的program.c中有了汇编代码,现在不再有c代码了。对于某些人来说,这至少是一个真正的挫折,但对另一些人来说,这是从头开始的。
我认为这些将导致真正的“伤害”。我不在乎系统是否崩溃。我会担心我的数据丢失。
不幸的是,在您以适当的预防措施学习使用终端之前,这些都是必须犯的错误。
gcc program.c -o program.c
正是由于制表符的完成,我曾经破坏了我正在使用的程序。之后,我学会了认真使用版本控制。
到目前为止,引起内核恐慌的原因更类似于崩溃:
sudo dtrace -w -n "BEGIN{ panic();}"
(代码取自此处,也可在Apple自己的文档中找到)
您也可以尝试:
sudo killall kernel_task
我尚未验证那里的第二个项目是否确实有效(并且我不打算这样做,因为我现在确实有一些工作要做)。
No matching processes were found
dtrace: system integrity protection is on, some features will not be available
dtrace: description 'BEGIN' matched 1 probe
dtrace: could not enable tracing: Permission denied
dtrace
SIP已有效地将其清除
kernel_task
这不是正常的过程。这是不朽的;它只能通过自身的错误(这将被称为KP并使整个计算机瘫痪)而被杀死。kernel_task
的PID名义上为0,但是如果您将其提供给kill(pid, sig)
syscall,则手册页会显示“ 如果pid
等于0”,则将sig
其发送到调用进程的进程组中的每个进程。。因此,您根本无法发送kernel_task
信号。
现代化的macOS使得以非特权用户身份使您的计算机真正崩溃(即,不使用sudo
),因为UNIX系统旨在处理成千上万的用户,而不会让任何用户破坏整个系统。因此,值得庆幸的是,通常在执行破坏计算机的操作之前,必须先提示您。
不幸的是,这种保护仅适用于系统本身。正如xkcd所示,您关心的很多内容不受系统完整性保护,root用户特权或密码提示的保护:
因此,如果您不注意的话,您可以输入大量内容,这只会破坏您的用户帐户和所有文件。一些例子:
rm -rf ${TEMPDIR}/*
。直到您意识到环境变量是拼写的,这似乎是完全合理的TMPDIR
。TEMPDIR
通常是未定义的,因此这是rm -rf /
。即使没有sudo
,这也会很高兴地删除您具有删除权限的所有内容,通常包括您的整个主文件夹。如果让它运行足够长的时间,它也将破坏连接到计算机的任何驱动器,因为您通常对此具有写权限。find ~ -name "TEMP*" -o -print | xargs rm
。find
通常会找到符合特定条件的文件并打印出来。如果没有,-o
这将达到您的期望,并删除所有以TEMP*
()开头的文件(只要路径中没有空格)。但是,其-o
意思是“或”(不是许多其他命令那样的“输出”!),导致该命令实际上删除了所有文件。笨蛋ln -sf link_name /some/important/file
。我偶尔会弄错此命令的语法,它会很乐意用无用的符号链接覆盖您的重要文件。kill -9 -1
会杀死您的每个程序,导致您很快退出系统并可能导致数据丢失。find
有一个-delete
论点比传递给xargs rm
ln -sf
会产生... 以及如何从中恢复:-)
find -print0 | xargs -0
来安全地处理文件名中的奇怪字符。
<whatever> | xargs echo <something>
首先使用,预览xargs将实际运行的命令。xargs是CLI如此强大的一个很好的例子:CLI如此强大:您可以一次处理很多项目,而无需烦人的确认和手工操作……只要确保您告诉它做自己想做的事情即可。
您可以执行的另一项操作(我之前曾经犯过错误)是:
sudo chmod 0 /
这将导致整个文件系统(意味着所有命令和程序)无法访问...除了root用户之外。这意味着您将需要以root用户身份直接登录并还原文件系统,但是您将无法访问该sudo
命令(或其他任何命令)。您可以通过引导进入单用户模式,并使用挂载和还原文件系统来恢复对命令和文件的访问chmod 755 /
。
如果使用递归方式进行操作,chmod -R 0 /
则将导致系统无法使用。正确的解决方法是使用恢复分区中的“磁盘工具”来修复磁盘权限。如果以递归方式运行快照或文件系统备份,则最好这样做。
chmod 755 /
将使您的系统不安全,并且会以细微的方式损坏。唯一的完整恢复chmod 0 /
是通过快照还原,备份还原和/或重新安装。
-R
标志,否则chmod不会递归-因此我认为子目录的权限不会受到影响?
/
会受到影响。
sudo chmod -R 700 /
有一台新计算机,如果这样做的话,它会更加安全。令人惊讶的是,它启动了,最后出现了空白的菜单栏和空白的桌面。没有其他任何工作,但是恢复分区的“磁盘工具还原权限”实际上设法将几乎所有内容都设置正确!
该呼叫的答案sudo
应被视为无效。这些已经承担了对系统的管理访问。
尝试perl -e 'exit if fork;for(;;){fork;}'
。OSX现在可以对此采取一些保护措施。如果显示苹果气泡,询问您是否要终止Terminal应用程序和子流程,则您(几乎)很好。
while true ; do cat /dev/zero > /dev/null & done
特别方便。如果你没有perl
。
for i in 1 2 3 4 ; do cat /dev/zero > /dev/null & done
只会做一个有趣的CPU负载测试。非常适合检查散热器和风扇是否达到标准。
当然,请确保您已备份并保存您关心的所有文件,然后键入 halt
假设您后来sudo
成为root用户,Mac将会崩溃。
命令行最大的风险是数据丢失。macOS界面经过数十年的设计,不会让人感到惊讶,也不会粉碎他们的数据,设置或应用。macOS图形界面还可以消除学习曲线(陡峭的曲线),使其变得安全并掌握Shell脚本。
您失去了这些保护,这就是为什么我提醒人们从终端应用程序或ssh开始的原因。如果您有备份,那么您知道自己可以工作,并且有时间和信心/技能来执行还原,那么您应该深入研究并学习甚至打破问题。
sudo kill -9 -1
我不小心kill -9 -1
在以root身份运行的perl脚本中执行了a。那就像拉电源线一样快。重启后,服务器进行了文件系统检查,并继续正常运行。
我从未sudo kill -9 -1
在命令行上尝试过该命令。它可能不起作用,因为进程ID“ -1”的意思是“杀死所有属于调用者进程组的进程”。
不知道,如果使用sudo,这还意味着init和所有内核内容...但是,如果您是root用户,kill -9 -1
肯定会立即停止-就像拉电源线一样。顺便说一句-日志文件中什么也不会出现,因为该命令是西方最快的杀手!
实际上,为了恢复,我去了系统管理员,告诉他们我做了什么。他们进行了硬重启,因为无法登录到该服务器(RHEL6)。
一个kill -9 -1
为根杀死每一道工序,即以root身份运行。那就是sshd。那立即使我注销,并阻止任何人再次登录。由init启动的任何进程-包括init都已被杀死,除非它们更改了UID或GID。甚至无法通过串行控制台登录。ps -eaf | grep root
显示了一些奇特的过程,如果这些过程以默认方式对SIGKILL做出反应,则即使基本写入HD也几乎会停止。
我现在不会在笔记本电脑上尝试:-)我kill -9 165
不足为奇地想知道([ext4-rsv-conver])是否真的停止向高清硬盘写入。
init
正常终止,但是您可以终止所有getty和SSH会话并使计算机无法使用。一个有Magic SysRq应该让一个干净的重新启动,但它往往容易只是动力循环,并依靠FS杂志:)
是的,您可以完全破坏您的系统。偶然地使用sudo
特权进行操作是已经发布的一个示例,它是否忘记了一些指示终端执行与您预期完全不同的操作的字符。rm
荷兰国际集团/
,而不是/tmp/\*
仅仅是一个5个字符的区别。在错误的位置放置空格也可能会完全不同。在其他时候,看似含义良好的指令可能会将恶意代码混入其中。互联网上的某些人非常擅长混淆代码。
还有一些使用html的命令可以将字体大小设置为零,因此,当看上去完全无害的外观复制到剪贴板时,实际上可能是安装某人的git repo作为可信任的源并下载了恶意软件。
您可以运行一些命令来利用这些命令,也可以很好地使用它们,但是会删除重要的文件或程序,或者损坏了磁盘。实际上,错误地使用工具可能会做一些基本的事情,例如意外地覆盖启动扇区,磁盘头或许多其他问题。
尚未发布的破坏性较小的示例是在中打开二进制文件vi
。如果您曾经尝试过,它将使您的终端弄糟,直到无法使用为止reset
。
另外,有些命令会使您的计算机陷入瘫痪,例如:
yes >> /dev/null & yes >> /dev/null & yes >> /dev/null & yes >> /dev/null &
您可以尝试使用它,它不会造成损害,但是会使您的处理器陷入瘫痪,并且您必须杀死所产生的每个进程。
话虽这么说,但在计算中通常要注意的是,如果不弄破几个鸡蛋,就不能制作煎蛋卷。您应该在终端上保持谨慎,但是要使自己更好地使用OS,唯一的方法就是学习和实践。
reset
,这应该清除已经打印了二进制输出的终端。或者,只是生成一个新的TTY
reset
技巧!有关更多信息:unix.stackexchange.com/questions/79684
我只是一个初学者,但您可以设置True。做命令; 完成 大多数人会尝试使用Ctrl + C来停止命令,而不是外部进程(ctrl + Z,然后需要将其杀死)。我想如果命令是一些繁重的操作,例如将大量数字乘以自己的力量,那可能会干扰您的资源。但是确实,现代操作系统通常可以防止此类混乱。
while true do cat /dev/zero > /dev/null & done
^C
也会杀死while循环,但是它重复的速度太快而无法捕获中断。按住^C
可能会跳出循环。关闭终端也将:)
当然,使用在Terminal中输入的命令仍然可以导致系统崩溃。
多年来,由于各种限制和保护措施的应用,这种情况变得越来越难,但正如墨菲法则所言:“没有什么能对一个有足够能力的傻瓜提供万无一失。”
“叉子炸弹”和所有rm -rf
脚本小子都是UNIX古老的东西。使用Mac OS X,您可以使用它的GUI子系统部分(WindowServer
更不用说)或类似OpenBSD防火墙(又名PF
Apple工程师带来但自2008年以来从未进行过更新)的游戏,带来更多乐趣。PF
它可以在内核中运行,因此当它出现异常时,是时候苹果告诉您“ 由于紧急原因您重新启动了计算机”或类似的东西。
最糟糕的是,您永远无法知道为什么会恐慌–因为苹果公司没有提供任何有意义的堆栈跟踪信息。您只能使用十六进制数的堆栈帧返回地址。
您所说的“使计算机崩溃”的含义有点模棱两可……虽然没有其他确切的答案,但也没有确切的正确答案。由于您的问题较为歧义和笼统,我想着重于问题的性质,并给出更笼统的答案。
不了解Terminal的人通常会害怕使用它,因为担心他们会弄乱命令并使其计算机崩溃
我认为命令行是一把双刃剑,通常是非常锋利的剑。它的最大优点也是对新用户的最大缺点:CLI程序可以执行您所说的操作,而无需询问它是否真的是您的意思。他们通常不要求确认,他们不提供手动或交互式帮助,并且它们的选项简短,经常简短,有时会混淆基于文本的字符串。请注意,它们通常都有很好的文档记录,仅需阅读手册(几乎始终是man <command you are about to run>
),并花点时间了解他们将要运行的命令行将执行的操作。
这种操作模式功能强大 -意味着经验丰富的CLI用户可以制作长命令“管道”,这些命令可以用单个命令完成复杂的任务。这是因为任务不会询问“您确定吗?” 在此过程的每一步中,它都会执行所告诉的内容。但是对于不熟悉此模式并且习惯于单击了在线帮助的GUI的用户而言,它并不熟悉且令人恐惧。
但是实际上是否有会使您的计算机崩溃的命令?
您可以使用CLI“崩溃”计算机吗?也许。如果不正确地使用破坏性命令,肯定会导致数据丢失。例如,这里提到的许多答案rm
都是删除文件的命令。显然,使用该命令可能会导致数据丢失,这是该命令设计的目的。
正如其他答案所指出的那样,您可以使用命令行在一段时间内使计算机几乎不可用:您可以不经确认就关闭计算机,使流程不经确认就使用100%的可用资源,终止所有程序或破坏您的文件系统。如果确实需要,您可以使用CLI编写内核扩展,该扩展会导致内核崩溃(这是我能想到的最接近“崩溃”的崩溃)。
命令行(通过终端访问)是功能强大的工具。通常,使用终端解决问题要比使用GUI更快。某些解决方案仅可通过终端命令使用。但是,CLI的关键是了解。不要执行您在网上看到的随机命令。阅读手册页并了解命令的作用。如果不确定,请在运行命令之前咨询某人或进一步了解该命令。