Den Computer herunterfahren!


83

Herausforderung:

Fahren Sie in der Programmiersprache Ihrer Wahl den Computer herunter, auf dem Ihr Code ausgeführt wurde.

Regeln

  • Kein Herunterfahren durch Erschöpfung der Ressourcen (zB: Gabelbombe, um das Herunterfahren zu erzwingen)
  • Wenn Sie möchten, können Sie Code schreiben, der nur in einer bestimmten Umgebung / einem bestimmten Betriebssystem funktioniert.
  • Standardlücken sind verboten

Dies ist , daher gewinnt die niedrigste Anzahl von Bytes!


62
Ich habe Freunde, die das in der Schule machen und denken, dass sie "hacken": D
RaisingAgent

12
Wir sollten uns einmal eine Regel einfallen lassen, um `whatever`;Bash / Perl / PHP / Ruby / etc zu stoppen . Dummköpfe.
Manatwork

260
Windows, 0 Bytes. Lassen Sie den Computer für ein paar Tage eingeschaltet und lassen Sie automatische Updates ihre Arbeit erledigen
Luis Mendo

28
Hat noch jemand das Fehlen von TIO-Links bemerkt?
Steenbergh

8
@MontyHarder Nach dem Lesen dieser Seite habe ich beschlossen, den Begriff zu prägenshatdown: past tense of the verb shutdown
FGreg

Antworten:


92

Assembly (x86 / x64, Linux, as) , 22 21 19 Byte

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

Muss als root ausgeführt werden.

Dies entspricht dem Drücken des Netzschalters und ist keine sichere Methode zum Ausschalten des PCs. Stellen Sie sicher, dass Sie alle geöffneten Anwendungen schließen und ausführen sync, um alle Dateisystempuffer zu leeren, bevor Sie dieses Programm ausführen, um das Risiko einer Dateibeschädigung zumindest zu minimieren.

Testlauf

$ 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:

Gefolgt von Dunkelheit.

Wie es funktioniert

int $0x80ruft einen Software-Interrupt auf. Es funktioniert sowohl auf x86 als auch auf x64, ist jedoch seit über einem Jahrzehnt veraltet und sollte nicht im Produktionscode verwendet werden. syscallStattdessen sollte x64-Code verwendet werden. x86 sollte verwenden sysenter, aber es ist zu umständlich für Code-Golf.

Die sich aus dem Systemaufruf ergebende Aktion hängt von den Registern EAX - EDX, ESI und EDI ab. Die Linux-Syscall-Referenz zeigt alle Syscalls, die über verfügbar sind int $0x80.

Wenn EAX 0x58 (88) enthält , wird ein Neustart aufgerufen, mit dem der Computer ausgeschaltet, in den Energiesparmodus versetzt oder in den Ruhezustand versetzt sowie der Kernel gewechselt und die Tastenkombination Strg - Alt - Entf deaktiviert oder aktiviert werden kann .

Zu Beginn des Programms - und indem wir mit asoder kompilieren gcc -nostdlib, können wir sicherstellen, dass wir tatsächlich am Anfang des Programms sind - werden die meisten Register auf 0 gesetzt . Dies schließt EAX ein, sodass wir mov $0x58, %aldie unteren 8 Bits von EAX auf 0x58 setzen können , wodurch EAX selbst auf 0x58 gesetzt wird . Dies spart zwei Bytes beim manuellen Nullsetzen des Registers xor %eax, %eaxund eines weiteren Bytes beim geraden Weiterleiten mov $0x58, %eax, das 0x58 in 32 Bits codiert .

Die ersten beiden Argumente für einen Neustart sind magische Zahlen, vermutlich, um versehentliche Neustarts zu verhindern. Sie werden aus den Registern EBX und ECX gelesen. Wenn diese Zahlen nicht bestimmten Konstanten entsprechen, wird beim Neustart keine Aktion ausgeführt.

  • Die erste magische Zahl muss gleich 0xfee1dead ( sich tot fühlen ) sein und bezieht sich wahrscheinlich auf das Ausschalten / den Tod des PCs.

  • Die zweite magische Zahl kann vier verschiedenen Konstanten entsprechen, obwohl die letzten drei in alten Linux-Versionen nicht funktionierten. Alle scheinen sich auf das spätere Einschalten / Aufkommen des PCs zu beziehen.

    • 0x28121969 repräsentiert Linus Torvalds Geburtstag (28. Dezember 1969).

    • 0x05121996 repräsentiert Patricia Torvalds Geburtstag (5. Dezember 1996).

    • 0x16041998 repräsentiert Daniela Torvalds Geburtstag (16. April 1998).

    • 0x20112000 repräsentiert Celeste Torvalds Geburtstag (20. November 2000).

    Patricia, Daniela und Celeste Torvalds sind die drei Töchter von Linus Torvalds.

  • Das EDX-Register wählt die Art des gewünschten "Neustarts" aus. 0x4321fedc ist RB_POWER_OFF , fährt den PC herunter und schaltet ihn aus.

  • Schließlich wird der Wert des ESI-Registers für RB_POWER_OFF ignoriert ; Der Wert des EDI-Registers wird beim Neustart vollständig ignoriert .

Alternative Version, nur x64, 19 Byte

Auf x64 können wir einen richtigen Syscall für die gleiche Bytezahl verwenden.

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

Die einzigen Unterschiede liegen in der Anweisung ( syscallvs int $0x80), dem Wert von __NR_REBOOT ( 0xa9 vs 0x58 ) und den beteiligten Registern.


Zählen wir Assemblys normalerweise als kompilierte Bytes, ohne die für den exe-Header erforderlichen Framing-Bytes?
Joshua

Ja, da jeder Befehl bestimmten Bytes in der Binärdatei entspricht. ELF-Dateien (oder welches Format auch immer Ihr Betriebssystem verwendet) werden als andere Sprache betrachtet und müssten manuell erstellt werden, um eine angemessene Punktzahl zu erzielen.
Dennis

Könnten Sie den Hex-Dump nach der Montage des Codes hinzufügen?
ckjbgames

@ckjbgames Hier ist es.
Dennis

Ich fee1so deadgerade jetzt.
Arminb

49

PowerShell, 13 Byte

Stop-Computer

Ziemlich selbsterklärend? Funktioniert nicht mit PowerShell Core, daher nicht mit PowerShell für Linux / MacOS (bereits mit TIO :-D getestet).

Bonus Garbage Submission, 12 Bytes

gcm s*r|iex

In meinen Tests funktioniert dies unter Windows 2003 mit PowerShell 2.0. Bei den meisten neueren Versionen funktioniert es nicht und je nachdem, welche Module installiert sind, funktioniert es möglicherweise nicht. Es ist ziemlich schrecklich!

Dadurch wird die Befehlsliste nach allen Befehlen mit dem Muster durchsucht s*rund anschließend alle ausgeführt! Um klar zu sein, das ist gefährlich, tu das nicht!

Der Trick besteht natürlich darin, eine Liste von Befehlen abzurufen, für die keine obligatorischen Parameter angegeben sind. Andernfalls fordert PowerShell zur Eingabe eines Werts auf.

Auf meinem 2003-Computer lauten die 3 zurückgegebenen Befehle:

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...

Ja, der Laufschrift-Bildschirmschoner wird gestartet, aber nein, er wartet nicht, bis der Vorgang abgeschlossen ist, bevor er gestartet wird Stop-Computer.

Dieser Ansatz funktioniert auch auf neueren Computern, je nachdem, welche Module installiert sind. Das Beste, was ich unter Windows 2012 und 2016 tun konnte, waren 14 Byte :

gcm sto*er|iex

(Und ja, sicher, die Winbatch-Übermittlung funktioniert in PowerShell und ist kürzer, aber das macht keinen Spaß.)


4
Kürzere für Win7 & Win10 (und vielleicht noch mehr): gcm *p-c*|iex- und es gibt auch nur das eine Ergebnis!
Bob

@ Bob ist immer noch stark von installierten Modulen abhängig; Auf meinem Win10-Computer werden 6 Ergebnisse zurückgegeben, von denen einige obligatorische Parameter haben (sie werden also aufgefordert, es nie zu schaffen Stop-Computer, was das letzte Ergebnis ist).
Briantist

39

Batch, 10 Bytes

Bei Windows würde dies ausreichen

shutdown/s

Dies führt in einer Minute zu einer Abschaltung.

Alternativ, wie @flashbang betont:

shutdown/p

Dadurch wird der Computer sofort heruntergefahren.


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

96
@RaisingAgent Hier bei PPCG lösen wir unsere Probleme im Code. Körperliche Arbeit ist verpönt.
Steenbergh

12
@steenbergh Ich weiß nicht ... Drücken einer großen Taste gegen 10 Tastenanschläge? Ich gehe mit dem Knopf
WorldSEnder

16
@RaisingAgent Ihr Angebot weist Skalierbarkeitsprobleme auf. Versuchen Sie es viermal pro Woche für 10.000 Computer.
Emilio M Bumachar

10
@RaisingAgent echte Männer verwenden den Schalter, der direkt am Netzteil ist
Cruncher

35

x86-Maschinencode, Lenovo Z510, DOS COM oder Bootloader, 7 Byte

BITS 16

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

Zusammengebaut in B8 00 3C BA 04 18 EF

Ich nutze " Sie dürfen Code schreiben, der nur in einer bestimmten Umgebung / einem bestimmten Betriebssystem funktioniert, wenn Sie dies wünschen " für das ultimative Level: Dies funktioniert nur auf Lenovo Z510 1 .

Dies schreibt SLP_TYPa << 10 | SLP_ENin das PM1a_CNTACPI-Register. Ich habe diese Werte vor Monaten aus den ACPI-Tabellen ausgegeben, um eine Antwort zum Herunterfahren zu erhalten (wobei ich dem obigen Code ein wenig Kontext gebe).

Dies kann entweder unter DOS als COM (einfach die Binärdaten in eine Datei schreiben und die Erweiterung auf "com" ändern) oder als Bootloader ausgeführt werden.
Für letztere schreiben Sie die Standardsignatur und achten Sie auf die Probleme mit moderner Firmware .


1 Nicht unbedingt zutreffend, jedes System mit der gleichen ACPI-Konfiguration wird ebenfalls heruntergefahren.


13
Wegen der eingeschränkten Plattform hochgestuft.
Pipe

Ha! Jemand hat Dennis geschlagen!
Joshua

Wenn Sie mit einer 7-Byte-Anzahl arbeiten, sollten Sie dies eher eine Maschinencodeübermittlung als eine Assembly-Lösung nennen. Die Assembly-Übermittlung beträgt 63 Byte.
Jakob

@ Jakob Du hast recht!
Margaret Bloom

Sie sehen aus wie die richtige Person, um diese Frage zu beantworten: stackoverflow.com/questions/2019463/… (Ich habe es kläglich versäumt, musste meine "Antwort" aus Schande löschen.)
Prof. Falken

34

GRUB-Shell , 4 Bytes

Golf gespielt

halt

Befehl: halt --no-apm

Der Befehl hält den Computer an. Wenn die Option --no-apm angegeben ist, wird kein APM-BIOS-Aufruf ausgeführt. Andernfalls wird der Computer mit APM heruntergefahren.

Bonus

Hier ist ein Beweis dafür , dass GRUB - Shell in der Tat Tur ist n ing-complete (siehe Kommentare):

Bildbeschreibung hier eingeben


Grub-Shell ist keine "Programmiersprache" - es ist nicht Turing vollständig
Alnitak

9
@Alnitak, warum denkst du das? Es verfügt über eine recht weit fortgeschritten built-in scripting language, which has a syntax quite similar to that of GNU Bash and other Bourne shell derivativesund unterstützt Variablen, bedingte Konstrukte, Funktionen und mehr , so offensichtlich, es ist Turning-complete, in jeder Hinsicht.
Zeppelin

1
OK, ich nehme das zurück - ich habe das Zeug nicht gefunden, als ich es mir ansah
Alnitak

28
Wenn es nicht einen Spinner angezeigt wird es offensichtlich nicht Tur n ing-complete
J_F_B_M

1
In Bash ist es der gleiche Befehl.
Paweł Tokarz

31

65C02 Maschinencode, 1 Byte

STP-Anweisung (0xDB):

STP stoppt den Takteingang des 65C02 und schaltet den 65C02 effektiv aus, bis ein Hardware-Reset auftritt (dh der RES-Pin geht auf LOW). Dies versetzt den 65C02 in einen Energiesparmodus. Dies ist nützlich für Anwendungen (Schaltkreise), die einen geringen Stromverbrauch erfordern, aber STP wird selten anders gesehen.

(Quelle: http://www.6502.org/tutorials/65c02opcodes.html )

xxd dump:

00000000: db                                       .

Noice. Ich war damals ein Apple II-Hacker und konnte mich nicht einmal an diesen Opcode erinnern.
irgendwie

1
Ja, nachdem ich einen 65c816-Emulator mit mehr Funktionen geschrieben und diese Herausforderung gesehen hatte, wusste ich, was zu tun ist: P Sieht auch so aus, als wäre dies die einzige 1-Byte-Antwort bisher! \ o /
therealfarfetchd

24

Matlab, 21 Bytes

system('shutdown -s')

Ich habe dies nicht ausprobiert (das Schließen aller Programme, um mitten am Tag einen Neustart durchzuführen, ist nicht wirklich verlockend), aber es sollte funktionieren. . Das funktioniert...

Ich werde später eine kurze Erklärung hinzufügen, mein Laptop ist derzeit ausgeschaltet.


105
"Ich werde später eine kurze Erklärung hinzufügen, mein Laptop ist derzeit ausgeschaltet." <- Die Gefahr einer Abschaltung Herausforderung
Suever

4
Axaxaxaxa, na ja, ein gelegentlicher Neustart Ihres Computers kann nicht schlecht sein :)
RaisingAgent

6
Ruiniert Ihr uptimeallerdings
Wayne Werner

Warum sollten Sie dies als MATLAB einreichen, anstatt es shutdown -sals Shell einzureichen ?
user253751

10
Denn für mich ist Muschel entweder etwas, was ich am Strand finde, oder eine Tankstelle.
Stewie Griffin

21

MATLAB, 11 Bytes

!shutdown/p

Etwas ähnlich wie bei Stewie Griffin . MATLAB bietet jedoch viel kürzere Möglichkeiten zum Aufrufen von Systembefehlen. in diesem Fall !wird verwendet. Windows benötigt keine .exeBefehlsnamen, so dass auch diese weggelassen werden. Die /Option wird weiterhin unterstützt (unter Windows 10) und macht den Speicherplatz überflüssig. Alternativen sind:

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 Bytes

OPTION

Löst einen Absturz aus, bei dem der 3DS neu gestartet wird. Ich hoffe das zählt.

Funktioniert in der neuesten Version.


Ich dachte, das wurde gepatcht ... Bitte geben Sie eine Versionsnummer an.
wizzwizz4

3
Es wurde in Version 3.5 gepatcht, die noch nicht außerhalb Japans veröffentlicht wurde.
12. Mai,

4
@ 12Me21 Sicher zählt es. Gute Wahl der Umgebung.
P. Ktinos

Wenn nur REBOOTvon SBv2 als gültige Antwort gezählt.
snail_

16

Bash, 7 6 Bytes

init 0

Angenommen, das Programm wird als root ausgeführt.


In der Tat ist das Ausschalten der Maschine erforderlich. Daher benötigen Sie "halt -p" als gültige Antwort
P. Ktinos

4
Diese Bearbeitung Massaker :)
RaisingAgent

@ P.Ktinos: poweroffist ein einzelnes Wort, wenn auch etwas mehr Buchstaben.
ccpizza

1
@ccpizza Richtig, aber das typische Bewertungskriterium ist die Anzahl der Bytes
Suever

13

Java, 101 98 62 42 Bytes

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

Wie @Snowman betonte, wurde in der Frage nicht angegeben, ob ein vollständiges Programm benötigt wird, daher sollte dies weiterhin akzeptabel sein.


2
Das Ersetzen classdurch ist kürzer, interfaceda Sie auf publicmain verzichten können.
Pavel

6
Sie können eine Methode verwenden, da die Frage nicht angegeben wurde, dass die Einreichung ein vollständiges Programm sein muss:void f()throws Exception{Runtime.getRuntime().exec("shutdown/s");}

1
Wäre die Linux-Version nicht etwas kürzer?
jpmc26

2
()->{Runtime.getRuntime().exec("init 0");}oder vorläufig ()->Runtime.getRuntime().exec("init 0")(kann im Moment nicht überprüfen). Es ist ein Lambda, der eine benutzerdefinierte Schnittstelle implementiert, die keine Argumente wirft.
Olivier Grégoire

1
Dies sollte als Linux-spezifische Antwort gekennzeichnet werden, z. B. "Java on LInux".
Jakob

13

Python 2, 29 Bytes

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

Funktioniert auf Linux-Systemen und benötigt Root-Rechte.

Für Windows 33 Bytes

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

Dies könnte der am wenigsten interessante oder hilfreiche Code sein, den ich jemals geschrieben habe.


2
Jemand anderes hat die Linux-Shell-Version gepostet .
jpmc26

1
Ah ok, meine schlechte ..
FlipTack

12

Commodore 64, 11 Bytes

0 sys64738

Dies ist von der BASIC-Eingabeaufforderung. Oder...

Commodore 64, 6502 Assembly, 3 Bytes (zusammengesetzt), 16 Bytes (Quelle)

*=8000
JMP $FCE2

Ich denke , dass die Modus von BASIC direkter Eingabe Commodore 64 der Verwendung mit sys64738verwenden Null - Bytes , da es kein Programm oder irgendetwas anderes zu speichern ist; Sie verwenden Bildschirm-RAM, aber dieser RAM wird bereits mit Leerzeichen gefüllt, sodass Sie diese Leerzeichen nur durch Text ersetzen.
Shaun Bebbers

2
Der Quellcode belegt Platz. Nur weil es keinen Speicherplatz auf dem Zielcomputer reserviert , bedeutet dies nicht, dass es 0 Byte belegt. Andernfalls wäre die Antwort ``.
wizzwizz4

3
Sie brauchen kein Leerzeichen zwischen 0und sys64738, Sie können das sysdurch das Verknüpfungsformular ersetzen sY, und ich zähle den abschließenden Zeilenumbruch in der Programmlänge nicht. Ich glaube jedoch nicht, dass Ihr Code die Anforderungen erfüllt: Der Code bei 64738 führt einen Soft-Reset durch, kein Ausschalten.
Mark

2
Schaltet sich nicht aus.
TecBrat

1
Ich habe einmal Bier auf meinem Commodore 64 verschüttet, das es dauerhaft ausgeschaltet hat. Zählt das?
Shaun Bebbers

12

TI-Nspire CX CAS, 3 Byte

" "+" "

Summieren von zwei leeren Zeichenfolgen.

Bei einer älteren Version des Rechners würde dies das Gerät zum Absturz bringen und einen Neustart verursachen (es gibt keine Möglichkeit, ein Gerät herunterzufahren, ohne einen Neustart durchzuführen, abgesehen von physischen Tastenkombinationen).

Video von Adriweb


Sind das nicht 7 Bytes?
Roman Gräf


Klingt für mich überzeugend.
Roman Gräf

11

C ++, 51 bis 40 Bytes

-11 Bytes dank Ingve !

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

Funktioniert nur in IncludeOS (v0.10.0-rc.1)

Prüfung:

$ 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
Jetzt bin ich gespannt auf IncludeOS
Karl Napf

@KarlNapf Alfred hielt auf der CppCon 2016 eine großartige Präsentation über IncludeOS: youtube.com/watch?v=t4etEwG2_LY, wenn Sie mehr wissen möchten :-)
simon

1
Sie müssen nicht verwenden void Service::start, int main funktioniert auch in IncludeOS .
Ingve

10

AppleScript, 30 Byte

tell app "Finder" to shut down

Tut genau das, was es sagt: Weist Finder an, den Computer auszuschalten.


9

AutoHotkey, 11 10 Bytes

Dank Gurupad Mamadapur wurde ein Byte gespeichert

Shutdown,9

AHK unterstützt standardmäßig einen Befehl zum Herunterfahren. Das 9ist eine Flagge, bestehend aus Shutdown=1+ PowerDown=8.


1
AHKist mysteriös.
Gurupad Mamadapur

Benötigen Sie das Leerzeichen nach dem Komma?
therealfarfetchd

Platz danach ,wird nicht benötigt. Versuchen Sie es mit einer anderen Flagge. Ich dachte, dies würde den Computer nicht sofort herunterfahren und in mein Hauptskript einfügen, das beim Start geladen wird: D Jetzt muss ich im abgesicherten Modus laden und das Problem lösen. Seufzer.
Gurupad Mamadapur

9

Maschinencode (x86, Bootloader) 18 Byte

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

Demontage:

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

Sie können es im Bochs-Debugger mit den folgenden Befehlen testen (nach dem Start der Simulation, wenn ein Laufwerk eingerichtet ist):

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

Derselbe Maschinencode funktioniert auch als ausführbare DOS-Datei ( *.COM).


7

C # 79, 54 53 Bytes

Dies funktioniert unter Windows.

79 Bytes :

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

53 Bytes dank TheLethalCoder:

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

2
Beachten Sie die Herausforderung nicht ein volles Programm erfordert und nicht zulassen keinen Eingang unter (ungenutzt natürlich) , so konnte man auf eine kompilieren Action<int>und tun _=>System.Diagnostics.Process.Start("shutdown", "/s");für 54 Byte.
TheLethalCoder

@TheLethalCoder, aktualisiert, danke!
Dariusz Woźniak

Sie können auch den unnötigen Platz entfernen.
Nothrow

Natürlich ja! Vielen Dank, @nothrow :)
Dariusz Woźniak

6

AutoIt, 11 Bytes

Shutdown(1)

Die Abschaltfunktion erhält eine Kombination der folgenden Codes

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

Zum Herunterfahren und Ausschalten wäre der Code beispielsweise 9 (Herunterfahren + Ausschalten = 1 + 8 = 9).


1
0(Abmelden) ist hier ein Sonderfall; Es lässt sich nicht implizit mit Standby oder Ruhezustand kombinieren.
wizzwizz4

OK0 + 32 = 32
rahnema1

Hm, also meldet es sich immer ab, bevor es in den Standby / Ruhezustand geht?
Ruslan

@ Ruslan Ich weiß nicht genau, wie es funktioniert. Weitere Rückmeldungen erhalten Sie im AutoIt-Benutzerforum :-)
rahnema1

6

Windows - NativeAPI, 212 Byte

Ok das ist nicht wirklich die kürzeste Version. Aber für manche vielleicht interessant. Dies wird nicht auf dem Win32-Subsystem ausgeführt. Es wird jedoch ausgeführt, wenn es im Kontext der nativen API ausgeführt wird (wie dies bei autochk.exe der Fall ist).

Code

#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);
}

Bauen

Um dies zu erstellen, verwenden Sie entweder das WinDDK - build.exeTool (mit einer entsprechenden sourceDatei fürNMAKE ).

Oder verwenden Sie diese Befehle zum Kompilieren und Verknüpfen:

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 

Hinweis: Dadurch wird eine native x86-Programmdatei erstellt. Ändern Sie die entsprechenden Bits, wenn Sie dies für eine andere Architektur erstellen möchten.

Prüfung

Um eine native ausführbare Datei zu testen, müssen Sie sie ausführen, bevor das win32-Subsystem geladen wird. Eine gebräuchliche Methode ist das Anhängen der ausführbaren Datei im folgenden Registrierungsschlüssel:

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

Warnung

In diesem Fall benötigen Sie jedoch eine Option, um die Registrierungsstruktur des Zielbetriebssystems von einem anderen Betriebssystem aus zu bearbeiten. Da Sie das Ziel-Betriebssystem nicht mehr booten können!

Ich tat es auf einer VM, in der ich zu einem vorhergehenden Schnappschuss leicht zurückkehren könnte!



5

Die meisten Linux-Shells, 15 Bytes

# echo o>/p*/*ger

Es könnte 11 Bytes lang sein, wenn Sie sich zufällig im /procVerzeichnis befinden:

# echo o>*ger

Dies ist sehr einfach (hat keine Nebenwirkungen wie das Abmelden von Dateisystemen oder das Beenden von Prozessen) und eher brutal.


1
Als ich das letzte Mal eine Platzhaltererweiterung für die Umleitung ausprobierte, wurde eine Datei mit dem Platzhalter darin generiert, obwohl eine passende Datei vorhanden war.
Joshua

5
Ich glaube, Sie müssen "/ proc /" zu Ihrer
Zeppelin

@ Joshua Es könnte Shell abhängig sein. Ich habe es tatsächlich (mit bash) auf meinem Computer getestet :-)
Radovan Garabík

1
@Radovan Garabík - Ich denke nicht, dass das wirklich gültig ist. Dies ist im Grunde das Gleiche, als würde man einen Alias ​​"p = poweroff" (der auch nicht "unmöglich" ist) und "p" als gültige 1-Byte- Lösung angeben .
Zeppelin

1
Aber Sie können es wahrscheinlich auf Kosten von nur 3 Bytes gültig machen, wie diesecho o>/p*/*ger
Zeppelin


5

AppleScript, 44 Byte

tell application "Finder"
shut down
end tell

Ich weiß nicht, wie die AppleScript-Syntax funktioniert oder was auch immer. Wenn also jemand weiß, wie man dies verkürzt, sagen Sie es bitte.

Außerdem mache ich das auf meinem Handy in der Schule ("Hacking"), also kann ich es nicht testen.

Mit 14 Bytes weniger (dank kindall) kann man sagen

tell app "Finder" to shut down

Jemand kam mit einer kürzeren Lösung (mit dem gleichen Programm) bis wenige Stunden , nachdem Sie (aber gepostet es statt kommentieren hier) codegolf.stackexchange.com/a/107958/62824
devRicher

Sie können den Einzug wahrscheinlich entfernen
Cyoce

4
tell app "Finder" to shut downsollte funktionieren, glaube ich (obwohl die Zusammenstellung "app" durch "application" ersetzen kann).
irgendwie

4

J, 14 Bytes

2!:0'poweroff'

Funktioniert auf Linux-Systemen. 2!:0Führt den String in aus /bin/sh.


4

Clojure, 40 39 Bytes

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

-1 Byte durch Ändern des Flags von -snach/s , wodurch ich den Raum loswerden konnte.

Grundsätzlich die Java-Antwort.

Das zu testen hat Spaß gemacht. Windows hat beschlossen, ein Firmware-Update auf meinem Surface durchzuführen, sobald es heruntergefahren wird. Na sicher.

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

2

Node.js, 39 Bytes

Linux

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


2

C ++, 48 47 (Windows) 46 45 (Linux) Bytes

1 Byte dank Schneemann entfernt

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

Dies sollte das System für Windows herunterfahren

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

Dies sollte das System für Linux herunterfahren


brauchst du das ;?
RaisingAgent

1
@LliwTelracs Ziemlich sicher, dass es "shutdown / p" und nicht "-p" ist und der Speicherplatz nicht benötigt wird.
P. Ktinos

Das Semikolon ist für die korrekte c ++ - Syntax erforderlich. Die Verwendung eines Schrägstrichs ermöglicht eine kürzere Antwort für Windows, führt jedoch dazu, dass es unter Linux nicht mehr funktioniert. Obwohl ich das falsche Zeichen zum Herunterfahren hinzugefügt habe, das zwischen Windows und Linux geteilt wird
24.

@LliwTelracs Obwohl Sie tun können, was Sie wollen, schlage ich vor, die 2. Regel zu missbrauchen und sich nicht um die Linux-Funktionalität zu kümmern, da dies ein Code-Golf ist und eine geringe Anzahl von Bytes besser ist.
P. Ktinos

1
#include<cstdlib> wird ein Byte rasieren.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.