关闭计算机!


83

挑战:

用您选择的编程语言,关闭在其上执行代码的计算机。

规则

  • 不会因资源耗尽而关闭(例如:Forkbomb强制关闭)
  • 如果需要,您可以编写仅在特定环境/ OS中工作的代码。
  • 禁止出现标准漏洞

这是,因此赢得了最低的字节数!


62
我有朋友,他们在学校里这样做并且认为他们在“黑客”:D
RaisingAgent

12
我们应该提出一些规则来停止此类`whatever`;Bash / Perl / PHP / Ruby / etc。愚蠢的人。
manatwork

260
Windows,0个字节。开启计算机几天,让自动更新完成工作
Luis Mendo

28
还有其他人注意到缺少TIO链接吗?
steenbergh

8
@MontyHarder阅读完该页面后,我决定shatdown: past tense of the verb shutdown
创造

Answers:


92

汇编(x86 / x64,Linux,as)22 21 19字节

mov  $0x58,       %al  # 2 bytes: b0 58
mov  $0xfee1dead, %ebx # 5 bytes: bb ad de e1 fe
mov  $0x28121969, %ecx # 5 bytes: b9 69 19 12 28
mov  $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
int  $0x80             # 2 bytes: cd 80

必须以root身份运行。

这等效于按下电源按钮,而不是关闭PC电源的安全方法。sync在执行该程序之前,请确保关闭所有打开的应用程序并执行以刷新所有文件系统缓冲区的操作,以至少将文件损坏的风险降到最低。

测试运行

$ as -o poweroff.o poweroff.s
$ ld -o poweroff   poweroff.o
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400078
$ sudo sh -c 'sync && ./poweroff'
root's password:

其次是黑暗。

这个怎么运作

int $0x80调用软件中断。它可以在x86和x64上运行,但是已经过了十多年了,不应该在生产代码中使用。应该使用x64代码syscall代替。x86应该使用sysenter,但是对于代码高尔夫来说太麻烦了。

系统调用产生的操作取决于寄存器EAX-EDX,EDI和EDI。《Linux Syscall参考》显示了可通过访问的所有syscall int $0x80

当EAX保持为0x58(88)时,将调用重新启动,该重新启动还可用于关闭计算机的电源,使其进入睡眠或休眠状态,以及切换内核并禁用或启用Ctrl-Alt-Del键组合。

在程序开始时–并且通过使用asor 进行编译gcc -nostdlib,我们可以确保我们实际上是在程序开始时–大多数寄存器都设置为0。这包括EAX,因此我们可以mov $0x58, %al用来将EAX的低8位设置为0x58,从而将EAX本身设置为0x58。与手动将寄存器清零相比,这节省了两个字节,xor %eax, %eax而在将32位0x58mov $0x58, %eax编码的straightforward中又节省了一个字节。

重新引导的前两个参数是幻数,大概是为了防止意外重新引导,并且从寄存器EBX和ECX中读取。除非这些数字等于某些常数,否则重新启动将拒绝执行任何操作。

  • 第一个幻数必须等于0xfee1dead感觉死了),可能是指PC断电/死机。

  • 第二个幻数可以等于四个不同的常数,尽管后三个在古代版本的Linux中不起作用。所有这些似乎都指随后的PC开机/诞生。

    • 0x28121969代表Linus Torvalds的生日(1969年12月28日)。

    • 0x05121996代表Patricia Torvalds的生日(1996年12月5日)。

    • 0x16041998代表Daniela Torvalds的生日(1998年4月16日)。

    • 0x20112000代表Celeste Torvalds的生日(2000年11月20日)。

    帕特里夏(Patricia),丹妮拉(Daniela)和Celeste Torvalds是Linus Torvalds的三个女儿。

  • EDX寄存器选择所需的“重新引导”类型。0x4321fedcRB_POWER_OFF,关闭PC并关闭电源。

  • 最后,对于RB_POWER_OFF,将忽略ESI寄存器的值;重新启动将完全忽略EDI寄存器的值。

替代版本,仅x64,19字节

在x64上,我们可以对相同的字节数使用适当的syscall。

mov     $0xa9,       %al  # 2 bytes: b0 a9
mov     $0xfee1dead, %edi # 5 bytes: bf ad de e1 fe
mov     $0x28121969, %esi # 5 bytes: be 69 19 12 28
mov     $0x4321fedc, %edx # 5 bytes: ba dc fe 21 43
syscall                   # 2 bytes: 0f 05

唯一的区别在于指令(syscallvs int $0x80),__ NR_REBOOT的值(0xa90x58)以及所涉及的寄存器。


我们通常将程序集算作没有exe标头所需的成帧字节的已编译字节吗?
约书亚记

是的,因为每条指令对应于二进制文件中的特定字节。ELF文件(或操作系统使用的任何格式)被认为是另一种语言,必须手动创建才能获得不错的成绩。
丹尼斯

您可以在汇编代码后添加十六进制转储吗?
ckjbgames

@ckjbgames 在这里。
丹尼斯,

fee1所以dead现在。
arminb

49

PowerShell,13个字节

Stop-Computer

很不言自明?在PowerShell核心上不起作用,因此在Linux / MacOS的PowerShell上也不起作用(已经在TIO :-D上尝试过)。

奖励垃圾提交,12字节

gcm s*r|iex

在我的测试中,这在带有PowerShell 2.0的Windows 2003上有效。它不适用于大多数较新的版本,并且可能无法正常运行,具体取决于安装了哪些模块。太可怕了!

这将在命令列表中搜索带有该模式的任何命令s*r,然后运行所有命令!要清楚,这很危险,请不要这样做!

当然,技巧是获取没有任何必需参数的命令列表,否则PowerShell将提示您输入值。

在我的2003机器上,它返回的3条命令是:

CommandType     Name                                                Definition                                         
-----------     ----                                                ----------                                         
Application     scrnsave.scr                                        C:\WINDOWS\system32\scrnsave.scr                   
Application     ssmarque.scr                                        C:\WINDOWS\system32\ssmarque.scr                   
Cmdlet          Stop-Computer                                       Stop-Computer [[-ComputerName] <String[]>] [[-Cr...

是的,它确实启动了字幕屏幕保护程序,但没有,它不等待启动完成Stop-Computer

再次取决于安装的模块,此方法可以在较新的计算机上使用,但是我在Windows 2012和2016上能做的最好的事情是14个字节

gcm sto*er|iex

(是的,可以肯定,winbatch提交可以在PowerShell中运行,并且更短,但是..这没什么好玩的)


4
对于Win7和Win10(甚至更多)来说,短一点:gcm *p-c*|iex-而且也只有一个结果!
鲍勃(Bob)

@Bob仍然高度依赖已安装的模块;在我的Win10机器上,它返回6个结果,其中一些将具有强制性参数(因此它们将提示并且永远不会提示Stop-Computer,这是最后一个结果)。
briantist

39

批处理,10个字节

在Windows上,就足够了

shutdown/s

这将在一分钟内设置一次关机。

或者,就像@flashbang指出的那样:

shutdown/p

这将立即关闭计算机。


79
Press the big button on the front of your computer= 0字节
RaisingAgent

96
@RaisingAgent在PPCG,我们解决了代码中的问题。体力劳动不被接受。
steenbergh

12
@steenbergh我不知道...按下一个大按钮与10次击键?我
将按

16
@RaisingAgent您的提案存在可伸缩性问题。尝试每周四次为10.000台计算机执行此操作。
Emilio M Bumachar

10
@RaisingAgent真正的男人在PSU上使用正确的开关
Cruncher

35

x86机器代码,Lenovo Z510,DOS COM或Bootloader,7个字节

BITS 16

mov ax, (1 << 13) | (7 << 10)
mov dx, 1804h
out dx, ax

组装成 B8 00 3C BA 04 18 EF

我正在将“ 您可以编写只允许在特定环境/ OS中使用的代码(如果您愿意的话)发挥到极致:这仅适用于Lenovo Z510 1

这写SLP_TYPa << 10 | SLP_ENPM1a_CNTACPI寄存器,我甩在ACPI表这个值个月前约关机的答案(在这里我给一些背景,以上面的代码)。

它既可以在DOS下作为COM运行(只需将二进制数据写入文件并将扩展名更改为“ com”),也可以作为引导程序运行。
对于后者,请写出标准签名,并注意现代固件的问题


1并非完全正确,任何碰巧具有相同ACPI配置的系统也将关闭。


13
由于平台有限而被推荐。

哈!有人击败了丹尼斯!
约书亚

如果要使用7字节计数,则应将此称为机器代码提交而不是汇编解决方案。程序集提交为63个字节。
Jakob

@Jakob你是对的!
玛格丽特·布鲁姆

您看起来像是回答这个问题的合适人选:stackoverflow.com/questions/2019463/…(我惨败于此,不得不丢掉我的“答案”。)
Falken教授

34

GRUB shell,4个字节

打高尔夫球

halt

命令:停止--no-apm

该命令将停止计算机。如果指定了--no-apm选项,则不会执行APM BIOS调用。否则,将使用APM关闭计算机。

奖金

这是一个证明,GRUB外壳确实是图尔ñ荷兰国际集团完成(见注释):

在此处输入图片说明


grub shell不是“编程语言”-它不是图灵完整的
-Alnitak

9
@Alnitak,您如何看待?它拥有相当先进的built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivatives,支持变量,条件结构,功能和更多,所以很明显,它车削完成,任何措施。
Zeppelin

1
好吧,我会把它拿回来-当我看时没发现这些东西
Alnitak

28
当它无法显示微调它显然不是TUR ñ荷兰国际集团完成
J_F_B_M

1
在Bash中,这是相同的命令。
帕维尔Tokarz

31

65C02机器代码,1个字节

STP指令(0xDB):

STP停止65C02的时钟输入,有效地关闭65C02,直到发生硬件复位(即RES引脚变为低电平)。这会使65C02进入低功耗状态。这对于要求低功耗的应用(电路)很有用,但很少会看到STP。

(来源:http : //www.6502.org/tutorials/65c02opcodes.html

xxd转储:

00000000: db                                       .

哎呀 那时我曾经是Apple II黑客,甚至都不记得这个操作码。
kindall

1
是的,在编写了具有更多功能的65c816仿真器并看到了这一挑战之后,我知道该怎么做:P另外,看起来这是迄今为止唯一的1个字节的答案!\ o /
therealfarfetch17年

24

Matlab,21字节

system('shutdown -s')

我没有尝试过(在一天中关闭所有程序重新启动并不是很吸引人),但是应该可以。。这有效...

稍后我将添加简短说明,我的笔记本电脑目前已关闭。


105
“稍后我将添加简短说明,我的笔记本电脑目前已关闭。” <-面临关闭挑战的危险
Suever

4
Axaxaxaxa,好吧,每隔一段时间重新启动计算机就不错了:)
RaisingAgent

6
uptime不过
韦恩·韦纳

为什么将其提交为MATLAB,而不是shutdown -s作为shell 提交?
immibis

10
因为对我来说,贝壳要么是我在海滩上发现的东西,要么是加油站。
Stewie Griffin

21

MATLAB,11个字节

!shutdown/p

有点类似于Stewie Griffin的方法。但是,MATLAB 调用系统命令的方式更短。在这种情况下,!使用。Windows不需要.exe命令名称,因此也省略了。该/选项仍受支持(我正在运行Windows 10),并且不需要空间。替代方法是:

system shutdown/p % 17 bytes; uses so-called 'command' syntax.
dos shutdown/p    % 14 bytes; the 'dos' command can be used just as well.

19

SmileBASIC,14 11 6个字节

OPTION

触发崩溃,导致3DS重新启动。我希望这很重要。

在最新版本中工作。


我以为这已被修补...请提供版本号。
wizzwizz4

3
它已在3.5版中进行了修补,但尚未在日本以外的地区发布。
17Me21年

4
@ 12Me21当然很重要。环境不错的选择。
P. Ktinos

如果仅REBOOT来自SBv2,则视为有效答案。
snail_

16

Bash,7个 6字节

init 0

假设程序以root身份运行。


实际上,需要关闭机器电源。因此,您需要使用“ halt -p”作为有效答案
P. Ktinos

4
这场编辑大屠杀:)
RaisingAgent

@ P.Ktinos:poweroff是一个单词,尽管字母略多。
ccpizza

1
@ccpizza是的,但是典型的评分标准是字节数
Suever

13

Java,101 98 62 42字节

()->{Runtime.getRuntime().exec("init 0");}

正如@Snowman指出的那样,该问题并未指定是否需要完整的程序,因此这仍然可以接受。


2
替换为较短classinterface因为它使您可以public从main 省略。
Pavel

6
您可以使用一种方法,因为问题未指定提交必须是完整程序:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}

1
会不会在Linux版本的有点短?
jpmc26

2
()->{Runtime.getRuntime().exec("init 0");}或暂时()->Runtime.getRuntime().exec("init 0")(目前无法检查)。这是一个lambda,用于实现自定义的无效,无参投掷接口。
奥利维尔·格雷戈尔

1
应将其标记为特定于Linux的答案,例如“ Java on LInux”。
Jakob

13

Python 2,29个字节

import os;os.system('init 0')

在Linux系统上工作,并且需要root特权。

对于Windows,33个字节

import os;os.system('shutdown/p')

这可能是我编写过的最不有趣或最有用的代码。


2
其他人发布了Linux Shell版本。
jpmc26

1
啊,好,我不好
。.– FlipTack

12

Commodore 64,11个字节

0 sys64738

这是从BASIC提示符。要么...

Commodore 64、6502汇编,3字节(汇编),16字节(源)

*=8000
JMP $FCE2

我认为从BASIC使用Commodore 64的直接输入模式sys64738将使用零字节,因为没有程序或其他要存储的东西。您正在使用屏幕RAM,但是该RAM已经充满了空格,因此您只需要用文本替换这些空格即可。
Shaun Bebbers

2
源代码占用空间。仅仅因为它没有在目标计算机上保留空间并不意味着它占用了0个字节。否则答案将是``。
wizzwizz4

3
您不需要在0和之间放置空格sys64738,您可以将sys快捷方式替换为sY,而且我也不会在程序长度中计算结尾的换行符。但是,我认为您的代码不符合要求:64738处的代码会执行软重置,而不是关闭电源。
Mark

2
不关机。
TecBrat

1
我曾经将啤酒洒在Commodore 64上,从而永久关闭了它的电源。这算吗?
Shaun Bebbers


11

C ++,51 40字节

-11个字节,感谢Ingve

#include<os>
int main(){OS::shutdown();}

仅适用于IncludeOS(v0.10.0-rc.1)

测试:

$ pwd
/home/simon/IncludeOS/examples/demo_service

$ cat service.cpp
#include<os>
int main(){OS::shutdown();}

$ mkdir build && cd build && cmake .. && make && cd ..
[...]

$ boot build/IncludeOS_example
[...]
================================================================================
================================================================================
 IncludeOS v0.10.0-rc.1-9-g151a2b9
 +--> Running [ IncludeOS minimal example ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$

1
现在,我对IncludeOS感到好奇
Karl Napf '17

@KarlNapf Alfred在2016年CppCon上就IncludeOS进行了精彩的演讲:youtube.com/watch? v=t4etEwG2_LY 如果您想了解更多:-)
simon

1
您无需使用void Service::start,也int main 可以在IncludeOS中使用。
Ingve

10

AppleScript,30个字节

tell app "Finder" to shut down

完全按照说的去做:告诉Finder关闭计算机。


9

AutoHotkey,11个10字节

感谢Gurupad Mamadapur节省了一个字节

Shutdown,9

AHK默认情况下支持关机命令。的9是一个标志,由Shutdown=1+ PowerDown=8


1
AHK是神秘的。
Gurupad Mamadapur

逗号后是否需要空格?
therealfarfetch17年

之后,不需要空格。尝试使用其他标志进行测试。我认为这不会立即关闭计算机,并将其放入启动时加载的主脚本中:D现在,我必须以安全模式加载并解决问题。叹。
Gurupad Mamadapur

9

机器码(x86,引导程序)18字节

b8 01 53 33 db cd 15 b8 07 53 bb 01 00 b9 03 00 cd 15

拆卸:

mov ax, 0x5301 ; connect to real-mode APM services
xor bx, bx     ; device id 0 - APM BIOS
int 0x15       ; call APM
mov ax, 0x5307 ; set power state
mov bx, 0x0001 ; on all devices
mov cx, 0x0003 ; to Off
int 0x15       ; call APM

您可以使用以下命令在Bochs的调试器中对其进行测试(开始仿真后,设置一些磁盘驱动器):

pb 0x7c00
c
setpmem 0x7c00 4 0x335301b8
setpmem 0x7c04 4 0xb815cddb
setpmem 0x7c08 4 0x01bb5307
setpmem 0x7c0c 4 0x0003b900
setpmem 0x7c10 2 0x15cd
c

相同的机器代码也将用作DOS可执行文件(*.COM)。


7

C#,79 54 53字节

这适用于Windows。

79个字节

class _{static void Main(){System.Diagnostics.Process.Start("shutdown","/s");}}

53字节,感谢TheLethalCoder:

_=>System.Diagnostics.Process.Start("shutdown","/s");

2
请注意,该挑战不需要完整的程序,也不允许输入(当然不使用),因此您可以编译为an Action<int>并执行_=>System.Diagnostics.Process.Start("shutdown", "/s");54个字节。
TheLethalCoder

@TheLethalCoder,已更新,谢谢!
DariuszWoźniak'17

您也可以删除不必要的空间。
nothrow

当然可以!谢谢你,@nothrow :)
达留沃兹尼亚克

6

AutoIt,11个字节

Shutdown(1)

关机功能获得以下代码的组合

0 = Logoff
1 = Shutdown
2 = Reboot
4 = Force
8 = Power down
16= Force if hung
32= Standby
64= Hibernate

例如,要关闭电源并关闭电源,代码将为9(关闭+电源关闭= 1 + 8 = 9)。


1
0(注销)在这里是一种特殊情况;它不会隐式地与Standby或Hibernate结合。
wizzwizz4

OK0 + 32 = 32
rahnema17年

嗯,所以在进入待机/休眠状态之前总是注销吗?
Ruslan

@Ruslan我不知道它是如何工作的,您可以参考AutoIt用户论坛以获取更多反馈:-)
rahnema1

6

Windows-NativeAPI,212字节

好的,这不是最短的版本。但也许对某些人很有趣。这将不会在Win32子系统上执行。但是,它将在本机api的上下文中执行时运行(就像autochk.exe一样)

#define WIN32_NO_STATUS
#include <windef.h>
#include <winnt.h>
#include <ntndk.h>
NTSTATUS main() {
RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,TRUE,FALSE,NULL);
return ZwShutdownSystem(ShutdownPowerOff);
}

建立

要构建此文件,请使用WinDDK build.exe工具(带有的相应source文件NMAKE

或使用以下命令进行编译和链接:

cl /Gd /D_X86_ /showIncludes /I%DDK_INC_PATH% /I%CRT_INC_PATH% /c main.c
link /verbose /nodefaultlib /subsystem:native /machine:X86 /entry:NtProcessStartup@4 C:\WinDDK\7600.16385.1\lib\win7\i386\nt.lib C:\WinDDK\7600.16385.1\lib\win7\i386\ntdllp.lib C:\WinDDK\7600.16385.1\lib\win7\i386\BufferOverflow.lib .\main.obj 

注意:这将构建一个x86本机可执行文件。如果要针对其他体系结构进行构建,请更改相应的位。

测试

要测试本机可执行文件,必须加载win32子系统之前执行它。一种常见的执行方法是在以下注册表项中附加可执行文件:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\BootExecute

警告

但是,如果执行此操作,则需要有一个选项可以从另一个OS编辑目标OS的注册表配置单元。由于您将无法再启动目标操作系统!

我是在VM上完成的,可以轻松还原到以前的快照!



5

大多数Linux Shell,15个字节

# echo o>/p*/*ger

如果碰巧在/proc目录中,则可以将其设置为11个字节长:

# echo o>*ger

这非常简单(没有副作用,例如卸载文件系统或终止进程),并且相当残酷。


1
上次我尝试对重定向进行通配符扩展时,尽管存在匹配文件,但仍生成了一个包含通配符的文件。
约书亚

5
我相信您必须在字节数中添加“ / proc /”
zeppelin

@Joshua可能是外壳相关的。我实际上bash在计算机上用进行了测试:-)
RadovanGarabík17年

1
@RadovanGarabík-我认为那不是真的。这基本上与暗指存在别名“ p = poweroff”(也不是“不可能”)并声称“ p”是有效的1字节解决方案相同。
Zeppelin

1
但是您可以仅花费3个字节就可以使它有效,就像这样echo o>/p*/*ger
zeppelin


5

AppleScript,44个字节

tell application "Finder"
shut down
end tell

我不知道AppleScript语法的工作原理或其他任何内容,因此,如果有人知道如何缩短它,请告诉我们。

另外,我正在学校的手机上进行此操作(“黑客攻击”),因此无法对其进行测试。

少了14个字节(感谢kindall),您可以说

tell app "Finder" to shut down

几个小时后有人提出了一个较短的解决方案(使用相同的程序)(但在此处发布而不是在此处发表评论)codegolf.stackexchange.com/a/107958/62824
devRicher

您可能可以删除缩进
Cyoce

4
tell app "Finder" to shut down我认为,它应该可以工作(尽管该编译可能会将“ app”替换为“ application”)。
kindall

4

J,14个字节

2!:0'poweroff'

在Linux系统上工作。2!:0执行中的字符串/bin/sh


4

Clojure,40 39字节

(.exec(Runtime/getRuntime)"shutdown/s")

-1字节通过改变从标志-s/s,这让我摆脱了空间。

基本上是Java的答案。

测试这个很有趣。Windows决定在第二次关机时对我的Surface进行固件更新。当然。

(defn shutdown []
  (.exec (Runtime/getRuntime) "shutdown -s"))

2

Node.js,39个字节

的Linux

require('child_process').exec('init 0')


2

C ++, 48 47(Windows) 46 45(Linux)字节

多亏了Snowman,删除了1个字节

#include<cstdlib>
main(){system("shutdown/p");}

这应该关闭Windows系统

#include<cstdlib>
main(){system("poweroff");}

这应该关闭Linux系统


您需要;吗?
RaisingAgent

1
@LliwTelracs非常确定它是“ shutdown / p”而不是“ -p”,并且不需要空间。
P. Ktinos

分号是正确的c ++语法所必需的,使用斜杠可使Windows的答案更短,但使其不再适用于Linux。尽管我添加了Windows和Linux之间共享的关机错误信息
fəˈnɛtɪk

@LliwTelracs尽管您可以做任何您想做的事,但我还是建议您滥用第二条规则而不关心Linux功能,因为这是一个代码问题,并且字节数少一点更好。
P. Ktinos

1
#include<cstdlib>将剃掉一个字节。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.