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!

P. Ktinos
quelle
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.

Dennis
quelle
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ß.)

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

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

Margaret Bloom
quelle
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

Zeppelin
quelle
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                                       .
da ist farfetchd
quelle
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.

Stewie Griffin
quelle
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.
Sanchises
quelle
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.

12Me21
quelle
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.

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

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

Gurupad Mamadapur
quelle
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
Shaun Bebbers
quelle
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

devRicher
quelle
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 ]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

$
simon
quelle
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.

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

Ein Taco
quelle
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).

Ruslan
quelle
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");
Dariusz Woźniak
quelle
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).

rahnema1
quelle
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!

MrPaulch
quelle
5

Groovy, 23 Bytes

'shutdown /p'.execute()
Gurupad Mamadapur
quelle
2
Ist der Raum vor dem Schrägstrich notwendig?
Steenbergh
3
@steenbergh Ja, es wird benötigt.
Gurupad Mamadapur
@ GurupadMamadapur sind Sie sicher?
TrojanByAccident
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.

Radovan Garabík
quelle
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

Android-Shell, 9 Bytes

reboot -p
Pedro Lobito
quelle
7
Willkommen bei PPCG!
ETHproductions
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
Daniel
quelle
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.

Meilen
quelle
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"))
Karzigenat
quelle
2

Node.js, 39 Bytes

Linux

require('child_process').exec('init 0')
Tom
quelle
2

AHK, 19-15 Bytes

Run,Shutdown -s

Funktioniert nur unter Windows.

Gurupad Mamadapur
quelle
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

fəˈnəˈtɛk
quelle
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.