2021年9月7日 星期二

齊步走! 用 netcat 同步指揮教室裡的所有電腦

電腦教室裡有幾十部電腦, 想要把一個大檔一次同步派送給所有電腦, 可以用 udpcast; 那如果想要一次同步指揮所有電腦呢? 就用 netcat! gtwang 的 netcat 教學文 很詳細; 對我們來說只需要讀到 「在兩台主機之間複製檔案」 那一節就夠了。 不同版本的 netcat 有一些大同小異, 例如有一些版本在作為接受端時, 必須在 port 前面加上 -p 。 另外, 加上 -v 比較容易除錯。 例如我們任選 port 5284 好了, 最後的測試指令長這樣:
接收端 (某部學生機) 執行: nc -vlp 5284 | bash
發送端 (老師機) 執行: nc 學生機的IP 5284
然後在老師機開始 「盲下指令」 (因為看不到回應, 只能跑到學生機去確認):

set -x
pwd
ls
df

最後按 ctrl-C 終止。 很方便也很可怕, 對吧? 做完實驗馬上要確認接收端已經停止接收, 不然很危險! 如果你沒有躲在 NAT 後面, 不限區網, 任何人都可以進來惡搞你的電腦。 註: set -x 的目的是增加學生機看見的訊息, 方便除錯。

以上是一部學生機。 那如果是三十部或五十部學生機呢? 加上 -b -u 可以改採 udp 方式廣播, 可是好像很不穩, 當然, 因為是 udp 嘛。

所以我就寫了一個小程式 mcnc.py (multicast netcat 的意思) 用迴圈逐一對每一部機器做 (原本預設的) tcp 方式 netcat。 首先必須建立一個文字檔, 叫做 nchosts.txt 好了, 內容就是每列一個 host 的 IP:

192.168.3.32
192.168.3.33
...
192.168.3.63

再來請在每一部學生機執行 nc -vlp 5284 | bash
最後假設老師機的 IP 是 192.168.3.1 而且假設它已啟動 apache2 網頁伺服器。 那就可以 python3 mcnc.py -p 5284 -r nchosts.txt 並且在 mcnc 的提示符號下逐列執行以下指令:

set -x
ls
export MAC=$(cat /sys/class/net/eth0/address)
export IPADDR=$(ip r | perl -ne 'print "$1\n" if / eth0 .*\s((\d+\.){3}\d+)/')
wget 192.168.3.1/?MAC=$MAC+IPADDR=$IPADDR -O /dev/null

看著教室裡所有的學生機同步動作, 突然覺得自己好像是複製人軍團的指揮官 (嘴角露出邪惡的微笑~) 這裡先叫每一部學生機 從 /sys/class/net/eth0/address 查詢自己的 mac address, 再查詢自己的 IP 位址, 最後去造訪老師機的網頁。 老師機的網頁其實沒什麼好看的, 主要目的是要讓每一部學生機在造訪網頁時順便透過 query string (問號後面那一串) 把自己的資訊傳給老師機, 因為老師事後可以到 /var/log/apache2/access.log 抓出這些記錄, 然後就可以製作 「本教室所有 ip address / mac address 對照表」 以便餵給 dhcp 伺服器未來派送固定的 IP。 [9/10 謝謝 Typebrook 分享, 其實只需要在老師機 (或任何一部學生機) 下 nmap -sP 192.168.3.0/24 即可, 請參考 這篇簡中。 但是我還需要走到每一部學生機前面, 把座位與 IP 的對應關係也記下來, 所以就需要用 mcnc.py 。]

以上查 IP 與 MAC 只是一個示範; 基本上可以下指令, 就什麼都可以做了。 例如想要幫笨笨的 windows 做一些每部機器的 (有規律) 客製化設定, 也可以請 linux 幫忙。 當然,做的時候最好把教師對外的網路線拔掉, 以免黑帽駭客趁電腦門戶大開時入侵。 我只在兩部虛擬學生機測試過, 還有兩部伺服器暫時扮演學生機 (很危險,不要學) [9/9 已在35部學生機的電腦教室成功測試時沒問題。] 原來指揮電腦軍團同步執行指令並沒有很困難, 為什麼以前從來沒有人告訴我啊? 我超想到各地的去把這招分享給電腦老師們!

[9/10 謝謝 Tasuka 分享, 原來有早就有 dsh 這個好用的東東可以拿來遙控大量電腦, 請參考 中文教學文英文教學文 ]

2 則留言:

  1. 用 dsh "danser's shell" 好像也很方便

    回覆刪除
  2. 真有趣,最近我才知道可以用tmux server 讓不同使用者觀看同一個指令行操作
    老師介紹的這個netcat則是做相反的事。

    另外,若要檢查目前網路中各個host的IP和Mac address,應該可以直接下指令:
    nmap / -sP

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。