完全伪造的重启[关闭]


21

这个挑战很简单。编写代码,使代码看起来完全像完全重新启动计算机一样。它在屏幕上不得显示任何表明它不是真正的重新引导的内容,并且应在重新引导后会获得的正常登录屏幕上完成。

规则。

  1. 您可以选择任何想要模仿的操作系统。例如,您可以从Windows或您选择的任何其他组合重新引导到Linux。
  2. 该代码应显示完整的关闭/重新启动序列全屏,没有迹象表明它不是真实的。
  3. 这是一场人气竞赛,所以越酷越好。
  4. 实际上,该代码必须完全无害,不得重新启动,并且随时可以轻松退出。
  5. 如果您需要使用外部映像来使重启看起​​来更加逼真,那么您的代码应从网络上自动获取这些映像。
  6. 您的代码应该是独立的,仅依赖于标准的免费提供的库或工具,并且可以按照提供的说明轻松执行。
  7. 祝好运!

由于这是一次人气竞赛,因此我将在2014年6月1日将得奖的票数最高的奖项授予。


在要求缩小问题范围之后,这是一条附加规则。

  • 该系统应模仿任何版本的Windows或Linux,OS X的Mint,Ubuntu,Debian,Fedora,Archlinux或Mageia发行版。

有兴趣的人可能想看看Pitch dark(地球小时纪念),其中建议从xterm开始使用多种方法来使用全屏。


2
就目前而言,这个问题太广泛了。通过不限制应该被伪造的系统,它会遇到(至少-此列表可能并不详尽)问题:b)确定例如当我在其上运行的计算机是多头且伪造的OS不支持多头(或根本没有头)时,伪造品是否符合接受标准。
彼得·泰勒

@PeterTaylor我希望类型a)的答案只会获得较低的选票,因为这是一场不错的人气竞赛。如果您可以帮助我改进它以处理点b),我将不胜感激。

问题b)的明显解决方案是通过说您的解决方案只需要在其模仿的系统下工作以及限制可以模仿的系统来缩小问题的范围。但是即便如此,由于可用于IBM兼容机的各种BIOS仍注定要失败。
彼得·泰勒

@PeterTaylor谢谢。我已经大大缩小了范围。现在怎么样

Gah,对于纯ArchLinux,我几乎有一个完美的解决方案(没有启动启动,只有内核消息和BIOS)。我必须说,我从来不明白在引导时浪费CPU周期只是为了显示一些漂亮的图形。
2014年

Answers:


18

zsh + coreutils +整洁+混合器+ xterm(Arch Linux)

我接受了@TheDoctor的回答并运行了它。这个版本有许多改进,并且有99%的内容可以说服我的Arch Linux系统上有经验的用户(me)。我使用Zsh是因为它具有良好的数组和浮点数支持。
依赖项:feh,整洁,混合器,zsh,xterm

改进之处:

1)使用dmesg在第一栏中打印的数字(即[0.000000]),它是自启动以来的时间,以确定睡眠时间。没有这个,在我的机器上看起来非常不现实。这些时间是在循环之前(在较早的睡眠状态下)进行解析的,因为在循环内部进行解析的速度太慢。

2)不要在启动后的时间大于16秒的地方打印行。此特定数字与机器有关,但重点是避免打印以后由于插入/移除USB记忆棒等而与引导无关的dmesg-stuff。

3)在具有黑底白字的全屏终端窗口中执行所有这些操作。对于此技巧,Mechanical Snail非常感谢:使用“ Hello World!”制作PNG图像。使用编程API,用最短的代码

4)关闭时将音频静音,脚本完成后恢复音量。

5)隐藏鼠标光标,脚本完成后恢复。

6)显示BIOS和Syslinux初始屏幕。

运行: xterm -fu -fg白色-bg黑色-e'/ usr / bin / zsh fake-reboot.sh'

码:

#!/usr/bin/zsh
# Remove (undisplay) the mouse pointer
unclutter -idle 0 -jitter 255 &
# Since there is no easily-accessible (i.e. without being root) shutdown log, we
# fake these messages.
echo "The system is going down for maintenance NOW."
sleep 2.0
echo "[21656.404742] systemd[1]: Shutting down."
echo "[21656.404742] systemd[1]: Stopping Session 1 of user `id -u -n`."
echo "[21656.404742] systemd[1]: Stopped Session 1 of user `id -u -n`."
echo "[21656.404742] systemd[1]: Stopping Sound Card."
# For added effect, store volume and then mute sound
volume=`amixer -- sget Master | awk -F'[][]' 'END{print $2}'`
amixer -- sset Master 0% &> /dev/null
echo "[21656.404742] systemd[1]: Stopped target Sound Card."
sleep 0.5
echo "[21656.919792] systemd[1]: Stopping system-systemd\x2dfsck.slice."
echo "[21656.919792] systemd[1]: Removed slice system-systemd\x2dfsck.slice."
echo "[21656.919792] systemd[1]: Stopping system-netctl\x2difplugd.slice."
echo "[21656.919793] systemd[1]: Removed slice system-netctl\x2difplugd.slice."
echo "[21656.919793] systemd[1]: Stopping User Manager for UID `id -u`..."
sleep 0.7
echo "[21657.624741] systemd[1]: Stopping Graphical Interface."
echo "[21657.624742] systemd[1]: Stopped target Graphical Interface."
echo "[21657.624745] systemd[1]: Stopping Multi-User System."
sleep 0.9
echo "[21658.606561] systemd[1]: Stopped target Multi-User System."
echo "[21658.606562] systemd[1]: Stopping Paths."
echo "[21658.606562] systemd[1]: Stopped D-Bus System Message Bus."
echo "[21658.606562] systemd[1]: Stopped target Paths."
echo "[21658.606568] systemd[1]: Stopping Timers."
echo "[21658.606568] systemd[1]: Stopped target Timers."
echo "[21658.606568] systemd[1]: Stopping Sockets."
echo "[21658.606568] systemd[1]: Stopped target Sockets."
echo "[21658.606568] systemd[1]: Starting Shutdown."
echo "[21658.606571] systemd[1]: Reached target Shutdown."
echo "[21658.606571] systemd[1]: Starting Exit the Session..."
echo "[21658.606571] systemd[1]: Received SIGRTMIN+26 from PID 10988 (kill)."
echo "[21658.606571] systemd[1]: Deactivated swap."
sleep 0.4
echo "[21659.001741] systemd[1]: Starting Unmount All Filesystems."
echo "[21659.001742] systemd[1]: Unmounted /home."
echo "[21659.001742] systemd[1]: Reached target Unmount All Filesystems."
echo "[21659.001742] systemd[1]: Stopping Remount Root and Kernel File Systems..."
echo "[21659.001742] systemd[1]: Stopped Remount Root and Kernel File Systems."
echo "[21659.001743] systemd[1]: Reached target Shutdown."
echo "[21659.001743] systemd[1]: Starting Final Step."
echo "[21659.001743] systemd[1]: Reached target Final Step."
echo "[21659.001754] systemd[1]: Shutting down."
sleep 0.3
echo "[21659.304341] systemd-journal[250]: Journal stopped"
sleep 0.2
echo "System halted."
sleep 2
clear
sleep 1
# Get the BIOS splash screen and display it
wget http://pvv.ntnu.no/~asmunder/bios.jpg  &> /dev/null
feh -Z -x -F -N --force-aliasing bios.jpg &
pid=$! # Store PID of Feh, so we can kill it later
# While showing the BIOS splash, use the time to parse dmesg output into arrays
tim=`dmesg | awk '{print $2}' | sed 's/]//' | grep "[0-9][0-9][0-9][0-9][0-9]"`
tim=($=tim)
dmsg=("${(@f)$(dmesg)}")
sleep 2.5
kill $pid
sleep 0.5
# Get the Syslinux splash and display it
wget http://pvv.ntnu.no/~asmunder/syslinux.png  &> /dev/null
feh -Z -x -F -N --force-aliasing syslinux.png &
pid=$!
sleep 1.3
kill $pid
# Loop through the arrays we created. Calculate the time we have to wait before
# displaying this line. If the wait time is less than 0.1 sec, we skip waiting.
T1=0.0
T2=0.0
n=0
for d in $dmsg; do
  T1=$T2
  T2=${tim[$n]}
  ((dT = $T2-$T1))
  if (( $dT > 0.1));then
    sleep $dT
  fi
  echo $d
  if (( $T2 > 16.0 )); then
    break
  fi
  ((n=$n+1))
done
sleep 1
clear
# It's normally agetty that parses /etc/issue and handles escape codes in a 
# special way. Thus we skip the first line of /etc/issue and do that manually.
echo "Arch Linux "`uname -r`" (tty1)"
tail -n +2 /etc/issue 
echo `hostname`" login:"
sleep 10
# Reset the mouse pointer so it is visible again
unclutter -idle 5 -jitter 0 &
# Reset the audio volume
amixer -- sset Master $volume &> /dev/null

3
这真的很好,是迄今为止我所能测试的最令人印象深刻的一个。

非常好,启动屏幕很多
Claudiu 2014年

哈哈,你链接了我自己的问题!但是那是非常好的代码。我要尝试一下。
figgycity50

cat /etc/issue | tail -n +2 没用猫tail -n +2 /etc/issue更简单,尤其是在没有管道的情况下。
彼得·科德斯

好点子。修复它,并修复了断开的链接。
半外在

12

准将64

1?CHR$(147)
2?"    **** COMMODORE 64 BASIC V2 ****"
3?
4?" 64K RAM SYSTEM  38911 BASIC BYTES FREE"

BASIC解释器将READY.自动显示提示。


2
我建议将第1行更改为: 1 POKE 53280,6:POKE 53281,14:?CHR$(159):?CHR$(147) ...以确保颜色正确。
2014年

+1可以使我流泪,即使它不符合规则。
ClickRick 2014年

10

TI基本

AxesOff
GridOff
LabelOff
CoordOff
ClrDraw
DispGraph
ClrHome

2
在我的Ti-83 Plus上,它显示“ Done”,如果这违反规则,则不知道……
约书亚

1
为了避免“完成”,您应该在单引号上添加额外的一行。
Timtech

这不会模拟重新启动。如果仅按2ND + ON,然后再按ON,则仅将设备置于待机状态,将其唤醒会显示(大多数情况下)将其置于待机状态时的屏幕。真正的重启比较困难。有多种方法可以在不取出电池的情况下进行操作,但这是最简单的方法。因此,更换电池后所看到的就是程序应模拟的内容。这比较困难,但在TI-Basic中也可以实现。
FabianRöling18年

10

Bash + Coreutils(Linux)

echo "The system is going down for maintenance NOW."
clear
sleep 5
dmesg|while read i; do echo "$i"; sleep 0.1; done
cat /etc/issue
login

如果从虚拟终端运行,这很好。如果它是在xterm中启动的,有什么方法可以使其全屏显示?我想此时您基本上正在实现一个屏幕保护程序。

@Lembik xterm -fullscreen


在Mac上试用过;不起作用。
Jwosty 2014年

2
@Jwosty在OS X(Mavericks,10.9)上,您需要具有超级用户权限,因此请替换dmesgsudo dmesg。Futhermore的/ etc /问题不会在OS X存在
CousinCocaine

5

Windows 8

糟糕的尝试,我不知道如何自动全屏显示。我试过了。

<!DOCTYPE html>
<html>
<body>

<iframe width="1600" height="900" src="http://www.youtube.com/embed/VgQ87b7muWs?start=510&end=524&autoplay=1" frameborder="0" allowfullscreen></iframe> 

</body>
</html>

3
您可以尝试查找HTML5 API Element.RequestFullScreen()developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/…
Ismael Miguel

4

Python / Pygame OSX

import pygame, time, os, urllib # Import Modules
pygame.init() # Initalise Pygame
pygame.mouse.set_visible(0) # Hide the Cursor
stdscr = pygame.display.set_mode((1280,800),pygame.FULLSCREEN) # Set up the display
stdscr.fill((255,255,255)) # Fill the screen white
urllib.urlretrieve("http://harrybeadle.github.io/FakeRestart/apple.bmp", "apple.bmp") # Get Apple Logo
urllib.urlretrieve("http://harrybeadle.github.io/FakeRestart/startup.wav", "startup.wav") # Get Startup Sound
time.sleep(1) # Wait for 1 second, screen still black
applelogo = pygame.image.load('apple.bmp').convert() # Load the Logo
pygame.mixer.music.load('startup.wav') # Load the Bung
stdscr.blit(applelogo,(580, 340)) # Blit the logo
pygame.mixer.music.play(1) # Play the sound
pygame.display.flip() # Flip the buffers
time.sleep(5) # Wait 5 seconds
pygame.quit() # Quit the pygame window
os.remove('apple.bmp') # Delete logo
os.remove('startup.wav') # Delete bung
os.system('/System/Library/CoreServices/"Menu Extras"/User.menu/Contents/Resources/CGSession -suspend') # Lock the Mac

现在更新!

特征:

  • 黑屏
  • 带Apple徽标和Bung Sound的白色屏幕
  • 使用以下命令从GitHub下载资产 urlib
  • 使用终端命令锁定用户的Mac,保留所有工作,然后 os.system()

真好 次要nitpick-规则说:“如果您需要使用外部映像来使重启看起​​来更加逼真,则您的代码应从网络上自动获取这些映像。”
2014年

@ semi-extrinsic看着它,它比值得的还要麻烦,我还是不得不编辑图像,而且Pygame对不是Windows位图的任何文件类型都不友好,所以我认为我现在就保留它。
哈里·比德尔2014年

1
@ semi-extrinsic取消我先前的评论,添加了功能。
哈里·比德尔2014年

这只会全屏显示苹果徽标几秒钟。它肯定需要“ Bung” :)

@Lembik我现在添加了这一点,以及将资产移至GitHub的可靠性:)
Harry Beadle 2014年

2

这个用参数“ quiet”和“ init = / bin / sh”执行linux

#!/bin/sh
echo shutting down
sleep 1
clear
echo Press F12 to enter setup. #everyone forgets the BIOS
sleep 1
clear

通常系统会显示映像或控制台输出。并非所有人的
简历

1
@ masterX244-映像是Linux中可配置的构建选项。安静时没有内核输出,而init = / bin / sh则没有启动输出,因为init只是启动一个shell。您应该花一些时间尝试一下,并确切地了解启动X所需的内容。启用devtmfs + automount后,我可以用1-liner在不到0.2秒的时间内到达X。
technosaurus

啊,不是一个通用的配置,这就是我为什么要发表评论的原因
masterX244 2014年
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.