給公司的伺服器做一個“核按鈕”
起因是這樣的,某天刷微博看到果殼網轉發了一個很有意思的微博,有網友製作了一個連線到電腦上的按鈕,按下後自動執行rm -rf /*
原po沒有在微博上解釋製作過程和執行原理,不過看著這麼有趣的小玩意,不折騰會死星人表示必須自己實現一個!下面就是我製作的按鈕。
機械開關
這個按鈕在網上很容易買得到,關鍵字搜尋“急停按鈕”就可以。我買的這個不超過20塊錢。這個按鈕是一個機械開關,一共有4個觸點,兩個一組,共兩組,一組為常開開關,一組為常閉開關,可以根據實際情況選擇接線。我選擇使用的是常閉那一組。
開發板
由於需要把機械開關的物理訊號轉換為數字訊號傳給電腦,要使用開發板進行轉換。由於這個功能非常初級,所有支援GPIO擴充套件的開發板都可以。我手上有NodeMCU的ESP8266模組就直接用了,這個模組本身體積小,能夠塞進按鈕下面的倉盒內方便封裝。如果你手上沒有開發板,可以去網上買一個,價格也不貴,NodeMCU ESP8266的價格也不超過20塊。
電路圖
電路圖也簡單得要死,開關斷開時GPIO連到GND,輸入低電平,開關閉合時GPIO輸入高電平。如果使用NodeMCU ESP8266,VDD使用3.3v,因為這個板子沒有5v,其他板子有5v的使用5v就可以。R1選擇一個比較大的電阻,避免短路,通常10k左右就可以。沒有10k的用個差不多的就行,我手上沒有10k的,我選用了一個6.8k的電阻。R2選擇小一些的電阻,比如100歐姆的。如果使用NodeMCU ESP8266,GPIO不要使用1、2、15,boot的時候會卡住。我使用的是4,對應的Pin是D2。另外請忽略白板上面的氣泡,懶癌患者表示不想處理……
開發板程式碼
本來當時我選擇ESP8266的原因還有一點就是可以連線WiFi。我最開始的想法是將開關訊號發到網上,電腦再從網際網路拉取資料。不過首先因為ESP8266資源有限,連線HTTPS有很大問題。其次這樣會產生明顯的延遲,同時還要維護一個網際網路服務。所以最後偷懶我直接用串列埠傳資料,所以這也不再是物聯網示例了。
那麼程式碼邏輯就是定義Pin模式為INPUT,迴圈讀取GPIO電平狀態,將結果輸出到串列埠。下面是Arduino原始碼:
void setup() {
Serial.begin(115200);
pinMode(D2, INPUT);
}
void loop() {
if (digitalRead(D2) == HIGH)
{
Serial.write(1);
}
else
{
Serial.write(0);
}
delay(200);
}
有關Arduino IDE、如何在Arduino IDE配置ESP8266開發板,可以參見https://github.com/esp8266/Arduino。
電腦端指令碼
電腦端指令碼首先要能讀取到串列埠資料。指令碼我使用了比較熟悉的Node編寫,Node讀取串列埠資料可以使用serialport這個包。讀取出來的資料是Buffer型別的,需要先轉換為整型。
最後一步就是根據串列埠資料執行相應命令,比如rm -rf /*
。Node有一個很有意思的包叫robot,它可以模擬鍵盤和滑鼠等行為。我們可以使用這個包來模擬輸入命令並執行。
下面是完整的電腦端指令碼,同樣邏輯非常簡單:
var SerialPort = require('serialport');
var robot = require("robotjs");
var port = new SerialPort('COM16', { autoOpen: false, baudRate: 115200 });
var status = 0;
var lastStatus = 0;
port.open(function (err) {
if (err) {
return console.log('Error opening port: ', err.message);
}
});
port.on('data', function (data) {
lastStatus = status;
status = data.readUIntBE(0, 1);
if (status !== lastStatus && status === 1) {
robot.typeString('rm -rf /*');
robot.keyTap('enter');
}
});
port.on('readable', function () {
port.read();
});
指令碼里建立SerialPort例項時傳入的第一個引數是串列埠名,Windows下是COM<n>,n的具體數值要到裝置管理器中確認。Linux和macOS下第一個引數是/dev/tty*
,具體串列埠路徑可以使用ls /dev/tty*
檢視。
如果你使用的是Windows,同時希望執行Linux命令,比如rm
,可以通過安裝Git BASH實現。如果你使用的是Windows 10,則可以直接安裝Windows Linux Subsystem。
演示
最終我所執行的不是rm -rf /*
,因為視訊中的不是虛擬機器。視訊中實際的操作是移除git repo本地除master外的其它分支,這是一個非常有用的操作,但同時也是一項非常危險的操作。
相關文章
- Blazor入門100天 : 自做一個支援長按事件的按鈕元件Blazor事件元件
- Tkinter (04) 核取按鈕部件 Checkbutton
- 核取方塊和切換按鈕的7個使用案例
- 用ESP32-C3做一個運動按鈕
- 如何給input的右上角加個清除的按鈕?
- 單選按鈕和核取方塊
- 一個按鈕,一鍵傳功!
- Tkinter (24) 核取按鈕部件 ttk.Checkbutton
- 核取方塊有四個按鈕,選擇兩個按鈕,table 就會出現相應資料,驗證資料是否正確,應該怎麼做?
- 點選一個按鈕使其樣式發生變化,再點選另一個按鈕發生同樣變化,但上一個按鈕樣式復原
- flutter demo (一):居中的按鈕Flutter
- Fiori Elements List Report table 裡的普通按鈕,Global 按鈕 和 Determining 按鈕
- 大公司開源怎麼做?SOFAStack 給出一個很好的例子AST
- 使用SVG實現的一個Android播放/暫停按鈕SVGAndroid
- switch button 待完善,做出一個合理的開關按鈕
- 一個簡單的Vue按鈕級許可權方案Vue
- 用CSS Houdini實現一個Material風格的按鈕CSS
- 建立工程,編寫一個介面有兩個按鈕的程式,通過定時器控制這兩個按鈕上的文字變化。定時器
- 直播系統原始碼,單選按鈕和核取方塊原始碼
- Qt實現一個支援QSS的Switch Button(開關按鈕)QT
- QT經驗(一)——按鈕長按事件分析QT事件
- 雲棲科技評論|醫療AI,醫療健康產業的“核按鈕”AI產業
- 舉例說明寫一個button的按鈕的方法有哪些?
- 如何給 SAP Fiori Elements 應用新增自定義按鈕
- 高亮按鈕
- 面向Vue新人:寫一個簡單的倒數計時按鈕Vue
- Flutter 敲一個靈動的錄音按鈕動畫 - Speed CodeFlutter動畫
- iOS - 新增一個全域性懸浮按鈕(整合pods版)iOS
- JavaScript新增一個文字框並帶有刪除按鈕JavaScript
- 自定義有多個按鈕節點的SliderViewIDEView
- 上手做一個華為鴻蒙手錶應用 2 - 在主頁新增一個按鈕並響應點選事件鴻蒙事件
- iOS開發:給UIWebview的導航欄新增返回、關閉按鈕iOSUIWebView
- NX二次開發:一個DLL設定多個按鈕操作的方法
- radio 單選按鈕 選中多個
- 配置選單按鈕掃一掃
- LabVIEW的自定義按鈕View
- 直播app開發,核取方塊選中所在的行,右側按鈕禁掉APP
- 給大家分享一個 python 做的搜尋引擎Python
- Android 學習筆記之單選按鈕(RadioButton)和核取方塊(CheckBox)Android筆記