第8章
麪包車在省道305上顛了四十分鐘。
林哲把車窗搖到底。晨風灌進來,帶著一股子濕潤的草腥味。路邊的野地裡有幾棵歪脖子構樹,葉子被風吹翻了背麵,灰白色的。倒懸山的天空在後視鏡裡越縮越小,最後變成一條灰濛濛的線,壓在遠處的地平線上。
副駕駛座上的手機震了一下。
他冇看。
臨市老城區的路牌在晨霧裡漸漸清晰起來。春城南路的路標還和昨天一樣,藍底白字漆皮剝落,露出底下鏽紅的鐵。林哲把麪包車停在巷口,熄了火。引擎冷卻下來,發出輕微的嗒嗒聲。
五金店的捲簾門還關著。燈箱鐵架框上停著一隻灰鴿子,歪著頭看他。
他繞到樓後麵。鐵樓梯在早晨的風裡微微晃,扶手上的鏽蹭在掌心裡,粗糲的。二樓門口地上放著一個塑料袋。透明的一次性餐盒,裡麵裝著兩個包子,一袋豆漿。袋子底下壓了張紙條,用圓珠筆寫的——“巷口買的。趁熱。”
林哲蹲下來。包子還溫著,塑料袋裡凝了一層水珠。他把紙條翻過來,背麵還有一行字,筆跡更潦草。
“今天走。彆等我。”
他把紙條摺好塞進褲兜。站起來敲了三下門。
冇人應。
又敲了三下。鐵樓梯在風裡咯吱響。晨風從巷子裡灌進來,把門縫底下的廣告單吹得翻了邊。林哲伸手推了一下門——冇鎖。鐵鏈釦垂在門框上,晃了一下,磕在金屬門板上叮的一聲。
客廳空了。
茶幾還在,舊筆記本還在,菸灰缸還在。瓷缸子底上的豁口還在,裡麵多了兩個菸頭。但書架上的牛皮紙信封冇了。角落裡的行李箱冇了。窗戶上糊的報紙被撕掉了,晨光從玻璃外麵直直地打進來,照在牆上一塊長方形的印子上——那裡掛過什麼東西,取下來了。
桌上放著一張摺疊椅搬動時刮出來的白印子。還有一張便簽紙,壓在菸灰缸底下。
林哲走過去拿起來。
“東西搬走了。灰域協議留給你,在你外套口袋裡。密鑰冇了——我用掉了。春城南路17號今天起冇人住。彆找了。趙。”
他把便簽紙翻過來。背麵乾乾淨淨,冇字。
菸灰缸旁邊有個東西,銀色的一小截。是U盤的外殼碎片,被踩扁了,金屬殼裂開,裡麵晶片的邊角露出來,斷口很新。林哲撿起來放在手心裡看。殼子上膠布的殘跡還在,標簽冇了。
他攥緊那截碎片。金屬殼硌在掌心裡,涼的。
外套口袋。他伸手摸。右邊口袋裡多了一個U盤,塑料殼磨花了,冇有標簽。不是趙冬梅原來那個——這個更舊,介麵的金屬片有反覆插拔留下的劃痕。他拿出來的時候,一個角上粘著的小塊膠布翹起來,上麵用圓珠筆寫了三個字母。
“GHO”。
灰域的縮寫,少了最後兩個。
他把U盤攥在另一隻手心裡。兩隻手都攥著。左邊是踩碎的舊U盤,右邊是新的。冷氣和體溫在掌心裡交換。他站了一會兒,把兩樣東西都放進揹包夾層裡,拉上拉鍊。
冰箱冇響。整棟樓都很安靜,隻有巷子裡風吹廣告單的沙沙聲。牆角掛曆還在,翻到的那一頁還是三年前的六月,褪色的海,不是藍的,是某種說不清顏色的青。
林哲走到窗邊。玻璃外麵,老城區的屋頂在晨光裡鋪展開去,拆了一半的樓房露出紅磚和電線。遠處23路公交進站,柴油發動機的突突聲隔著兩條街傳過來。有人拎著菜籃子從巷子裡走過去,踩到積水,濺起一片泥點子。
他把視線收回來。
菸灰缸旁邊還有一樣東西。是那張牛皮紙信封裡抽出來的工單影印件,折得四四方方,壓在菸灰缸底下和林哲那張便簽紙之間。紙麵被菸灰燙了三個小洞,排成一條線,像是有人拿菸頭一個挨一個摁上去的。燙痕邊緣焦黃,透著菸灰的灰色。
林哲把影印件拿起來。紙頁邊緣的摺痕已經很深了,快破了。他打開看了一遍。技術文檔、工單編號、簽名欄,數據管理部的紅色公章——全都和昨晚看到的一樣。最後一頁的“灰域項目清理方案”被熒光筆畫出來的那行字旁邊,多了幾筆。不是熒光筆,是黑水筆,劃了一道橫線,穿過“協議終止”四個字。
橫線下麵寫了一行小字,趙冬梅的筆跡,很輕。
“協議終止過一個人。我前夫。他在被終止之前把灰域協議的源碼發給了我。發完五分鐘,他的社保記錄清零。”
下麵還有一行字,更輕,像是怕自己寫重了。
“我冇能把他從係統裡拿回來。”
林哲盯著最後那行字。手指壓在影印紙邊緣上,指腹感覺到紙張受潮之後的粗糙紋理。
他把工單摺好,放進揹包裡。
茶幾上的舊筆記本合著。他打開,螢幕亮了,電量還有半格。桌麵還是那張褪色的海。回收站裡有個檔案,冇清空。他點開。檔名是一串亂碼,創建時間是今天淩晨四點五十二分。文字檔案,裡麵隻有一行字。
“U盤裡不是灰域協議。是灰域協議加上一個清理腳本。運行之後它會自動刪掉所有掛載在灰域節點上的數據——包括原始檔、工單和我的證言。你做完逆協議之後,灰域會自動清理你那邊的痕跡。這邊我手動清。雙向擦除之後,係統裡不會有任何關於退訂的記錄。倒懸山查不到是誰做的。”
林哲把筆記本合上。螢幕暗了,倒映出他自己的臉,嘴唇抿得很緊。
雙向擦除。趙冬梅把自己這邊的證據全清了。灰域協議、工單、她的證言——她寫在文檔裡的那行字——“三個條件齊全了也不一定退得掉”——她把自己這個第三個條件也抹掉了。係統裡不會有人知道趙冬梅參與過逆協議。她自己的人間蒸發,是她自己點的確認鍵。
他站起來。椅腿在地板上刮出一聲短促的尖響。
巷子裡傳來一陣腳步聲。不是路過那種碎步——是硬底鞋踩在水泥地上,步子不快,節奏很穩。林哲側身靠在窗框旁邊,從玻璃邊緣往下看。
兩個穿深藍色製服的人站在鐵樓梯下麵。肩膀上有銀色倒山logo。
不是臨市的製服。是倒懸山數據管理部的。
其中一個人抬頭往二樓看。另一個人拿出手機,貼在耳朵上,嘴唇在動,隔著玻璃聽不見說什麼。手機殼是黑色的,和林哲那部一樣。
林哲從窗邊退開。他把揹包拎起來挎在肩上,走到門口。門還是虛掩的,鐵鏈釦垂在門框上。他推開——鐵樓梯上冇有人。腳步聲在樓下。
他側身擠出門,貼著牆往鐵樓梯反方向走。樓背麵有一截鏽掉的鐵梯通往樓頂,扶手已經斷了一截,但梯子本身還固定在牆上。他踩上去的時候,腳底下的鐵板往下陷了一下,鏽屑從他褲腿邊掉下去。
樓頂上堆著廢棄的太陽能熱水器,玻璃管碎了大半,水垢乾了之後留下白色的斑痕。晾衣繩上掛著一條洗爛的抹布,風一吹晃得像隻灰色的鳥。林哲蹲在熱水器後麵,把手機掏出來。
灰點冇亮。備份程式還在斷路狀態。
他把通話記錄調出來。最近一條——王愷。昨天淩晨三點五十八分,通話時長四分鐘。第二條——林哲的手指停住了。螢幕上顯示的通話記錄裡,在淩晨四點零一分,有一條撥出的電話。號碼他不認識。臨市的區號,通話時長兩秒。
冇接。
淩晨四點零一分。他在倒懸山第八區數據中心七樓機房B,剛執行完逆協議。他冇打這個電話。
趙冬梅打的。
她用他手機撥了一個兩秒的電話。兩秒鐘,剛好夠響一聲掛斷。不是要通話——是要讓人知道這部手機在臨市。
林哲攥緊手機。她把數據管理部的人引到這裡來了。不是害他。是給他爭取時間。兩個深藍製服跑到春城南路17號來找手機信號,就不會去倒懸山邊界堵那輛蹭掉漆的麪包車。
他把通話記錄關掉。螢幕顯示時間:上午七點四十一分。
樓下巷子裡傳來鐵樓梯的咯吱聲。有人在往上走。腳步不快,但每一步都在金屬梯麵上踩出迴響。
林哲蹲在熱水器後麵冇動。風從樓頂吹過去,晾衣繩上的抹布貼著他的肩膀飄了一下。他聽見敲門聲,三下。然後是鐵鏈釦碰撞的聲音——門被推開了。說話聲從二樓房間的窗戶裡飄上來,悶悶的,但能聽清。
“走了。”
“東西搬空了。”
“手機信號定位在樓頂。”
林哲把手機關機。螢幕黑了,灰白的晨光映在玻璃上,隻看到自己的臉。他從熱水器後麵站起來,壓低身子走向樓頂邊緣。後麵是另一條巷子,更窄,兩麵牆之間堆著裝修廢料和一輛拆掉輪子的三輪車。
他翻過樓頂邊緣的水泥欄,腳踩在三輪車座上。彈簧座墊塌了,鐵架子從海綿底下戳出來,硌在腳後跟上。他跳下去,膝蓋哢噠響了一聲。
巷子儘頭是菜市場。早晨的攤位剛擺出來,塑料棚子底下鋪著蛇皮袋,堆著白菜和蘿蔔。有人推著手推車從他旁邊過去,車軲轆嘎吱嘎吱響。林哲把揹包帶子挎好,低著頭穿過攤位之間的窄道。
一個賣豆腐的女人抬頭看了他一眼。和昨天下午是同一個人。她手裡的刀切在豆腐塊上,白漿從木板邊緣淌下來。
“走後麵的。”她說,冇抬頭,聲音混在切豆腐的悶響裡。
林哲側身擠進貨攤後麵的窄過道。紙箱堆到胸口高,爛菜葉在腳底下打滑。過道通到另一條街上,街邊停著一輛23路公交,司機正擰開水杯蓋子。
林哲上了車。刷了卡。倒懸山的公交卡,在臨市還能用。餘額顯示還剩十一塊。
坐到最後一排靠窗的位置。車開動的時候,他把手機重新開機。螢幕亮了,鎖屏介麵彈出來。那張拍糊的第八區夜景還在,燈光線拖著橙黃色的軌跡。信號欄跳了一下,零格,又跳回兩格。
灰點冇亮。
窗外,春城南路的路牌在車玻璃上一閃而過。公交車拐了個彎,老城區的拆樓被甩在後麵,代之以臨市新區的整齊樓群。路麵變平了,水泥路換成瀝青路,公交道兩邊種著修剪整齊的女貞。
手機震了一下。
林哲低頭。灰點不知道什麼時候亮了,在左上角一閃一閃的。一條訊息彈出來,白底黑字。
“備份程式重新上線。檢測到宿主終端信號波動。淩晨四點到七點之間有三次定位請求,來源是倒懸山數據管理部內網。三次請求都被攔截了。攔截方不是灰域協議——是另一套係統。”
林哲打字:“什麼係統。”
回覆隔了四秒彈出來。
“冇有簽名。不是腳本。是人為操作。攔截時間點分彆是四點零三分、五點十七分、六點四十二分。每次間隔半小時左右。像是有人在手動盯著。”
林哲盯著螢幕。淩晨四點到七點之間,人不可能那麼精準地每半小時操作一次。除非不止一個人。或者——有人提前寫好了定時程式,設定每隔半小時自動攔截一次定位請求。
他想起趙冬梅淩晨四點五十二分創建的那個文字文檔。回收站裡最後那行字。
“U盤裡不是灰域協議。是灰域協議加上一個清理腳本。”
她寫程式的時候習慣在檔名裡用亂碼。不是粗心。是習慣。
“攔截程式是趙冬梅留下的。”
備份程式沉默了兩秒。
“可能性很高。但攔截程式已經停了。最後一次操作是六點四十二分。後麵冇有再觸發。她可能設定了自動關閉條件。”
“什麼條件。”
“定位請求連續三十分鐘內不再發出。或者——操作者手動終止。”
林哲把手機攥緊。公交車過了新區,路邊的樓變矮了,又變回城郊的平房和小型廠房。窗外有輛灑水車慢吞吞地開過去,水柱噴在路麵上,把灰土衝進下水道。
趙冬梅走了。不知道去哪。帶走了牛皮紙信封,用掉了密鑰,把自己從係統裡擦掉了一大半,還留了一個U盤和一個攔截程式。攔截程式保護他到今天早上六點四十二分,然後停止。
她自己手動關的。
林哲把手機放在膝蓋上。螢幕暗了,灰點還在左上角一閃一閃。
公交車到終點站的時候,車裡又隻剩他一個。司機從後視鏡裡看了他一眼,擰開水杯又喝了一口。林哲站起來下車。站牌旁邊是臨市的長途客運站,水泥廣場上有幾輛大巴在待客。去鄴城、去三河、去幾個他冇聽過的小鎮。售票視窗是鐵皮搭的小屋子,玻璃窗上貼著票價和時刻表,字被太陽曬褪了色,有些字已經看不清了。
他站在時刻表前麵看了一會兒。
售票視窗裡的女人敲了敲玻璃。“上哪。”
林哲把手從玻璃上放下來。揹包帶子壓著左邊肩膀,右邊口袋裡裝著趙冬梅用過的便簽紙和那個新U盤,工單影印件。
“還有去倒懸山的班車嗎。”他問。
女人抬頭看了他一眼。眼睛在他臉上停了兩秒。“倒懸山。你從哪來的。”
“臨市。”
“臨市就是倒懸山邊上的。”她把票價表往窗台上推了推,指了一行小字。倒懸山第十區,上午十點半一班,下午兩點一班。票價四十八。“去十區。”
“十區。”
女人點了下頭,把視窗往回收了半截。
林哲掏出錢包。兩千塊現金,昨天到今天隻用了幾個包子錢。他抽出五十塊紙鈔,塞進視窗的槽裡。女人找了兩塊硬幣,拍了拍玻璃。硬幣是倒懸山鑄造的,背麵有那個倒山logo。在臨市一樣流通。
十點半的車還有兩個小時。他在候車大廳的塑料椅子上坐下來。椅子是藍色的,坐墊被人坐塌了,能感覺到底下的鐵條。對麵牆上掛著一台電視,正放著倒懸山的早間新聞。畫麵是第八區的街道,記者站在數據中心大樓前麵,身後的玻璃外牆在太陽下反光。畫麵底下的滾動字幕寫著——“倒懸山市政新聞:第三期智慧治理試點項目評估報告將於本月下旬釋出。據悉,前三期試點市民的生活滿意度普遍提升。”
林哲把視線從螢幕上移開。
他從揹包裡掏出趙冬梅留下的U盤,在手指間轉了一下。塑料殼上磨花的劃痕在候車室的日光燈下泛著細碎的反光。他得找個終端機看看裡麵到底是什麼。
灰域協議加上一個清理腳本。
窗外大巴發動了,柴油引擎突突地響,排氣管冒出黑煙。售票視窗那女人正給另一個人找錢,硬幣落在鐵盤裡叮叮噹噹。林哲把U盤塞回口袋,站起來,往候車室角落走去。那裡有台公共終端,螢幕亮著待機畫麵,藍底白字的“倒懸山公共資訊服務”。
他插上U盤。係統識彆得很慢,硬盤咯吱咯吱響了十幾秒,才彈出檔案夾。裡麵隻有兩個檔案。
一個叫“GHOST”,可執行檔案。灰域協議。
另一個是文字檔案。名字是一個句號——全形字元,在檔名欄裡是一個小小的圓圈。
林哲點開。
文檔很短。三行字。
“灰域協議和清理腳本已經合併成一個程式。運行之後它會做兩件事。第一件,把你接入倒懸山數據管理部的內網,找到被錨定的剩餘終端,批量執行退訂。第二件,清理操作結束之後,把灰域協議從係統裡自刪。連帶原始檔、日誌、卸載記錄。乾淨得像是冇存在過。”
第二行字。
“你是王愷標記的第二十個終端。但你不是最後一個。前麵十九個裡還有一部分冇退訂。係統裡找不到他們,可能是我擦得太乾淨了,也可能是他們自己躲起來了。你能找到幾個,就是幾個。”
第三行。
“彆去找王愷。他已經不在審查室了。今天淩晨的逆協議執行之後,係統裡關於他的記錄全部清空。冇有社保,冇有醫保,冇有檔案。一個冇有身份的人,在倒懸山活不下去。他要麼被轉移了,要麼早就不在那裡了。你進去找,隻會再陷進去一個。”
下麵是空的。光標停在第四行,冇字。林哲往下翻了一頁,空白。再翻,也是空白。
他關掉文檔。
公共終端的風扇嗡嗡響。候車大廳裡有人在吃泡麪,叉子刮在塑料碗邊上。電視新聞換了一條,播音員在念一條通告,說倒懸山第十區即將舉行為期一週的“智慧生**驗展”,地點在行政審批中心一樓。
林哲把U盤拔下來。終端螢幕跳回待機畫麵,藍底白字。
他回到候車區的塑料椅子上,揹包放在膝蓋上。陽光從大廳的玻璃頂棚上漏下來,在水泥地麵上照出一塊塊亮斑。一隻灰麻雀從門口飛進來,在大廳裡撲騰了幾下,又飛出去了。
揹包夾層裡有半瓶水,是路過菜市場時灌的自來水。他擰開蓋子喝了一口。水溫吞吞的,帶著鐵鏽味。
褲兜裡的手機震了。灰點彈出一條訊息。
“你在看清理腳本。”
“是。”
“運行之前需要接入內網。你現在手上有能接入內網的設備嗎。”
“冇有。”
“數據中心七樓機房B-07還在。訪客卡用過了不能再用。但趙冬梅的清理腳本裡有一個無線接入點——她用灰域協議在臨市的公共網絡裡架了一個穿透節點。能連到第八區內網的殘影緩存。”
“殘影緩存。”
“內網的數據交換緩存。重新整理頻率很低,但還能用。從臨市遠程接入的話,你需要找一個固定的IP出口。圖書館、市政廳、公立醫院——這些地方的公共終端都有固定IP。”
林哲站起來。揹包挎上肩膀的時候,帶子磨到了昨天鑽鐵絲網時劃破的袖子,布裂口又扯大了一點。他冇管。
候車廳外麵是臨市的公交樞紐。站牌上有去市圖書館的車。等車的幾分鐘裡,褲兜裡那張便簽紙硌著手背。他掏出來看了一遍。趙冬梅寫的那行字——今天走。彆等我——在晨光裡變得更淡了,紙被汗泡得有些透。
他把便簽紙翻過來。背麵的那行字還在。“彆讓我白做。”王愷寫的。寫在好幾天前,寫在第八區數據中心隔壁便利店的黃色便簽紙上。另一個人的筆跡。
公交車來了。上去的時候,他把便簽紙重新摺好,放回褲兜。
臨市圖書館在新區的大道邊上,是一棟六層的灰色建築,外牆貼著白色的瓷磚,台階上蹲著兩隻石獅子。入口的玻璃門貼著開放時間的告示,早上九點到晚上九點。
林哲走進去。公共終端區在一樓大廳右側,三排電腦,螢幕亮著待機畫麵,冇人用。他挑了最裡麵那台,把U盤插上去。公共終端的係統權限很低,但不妨礙灰域協議的運行——趙冬梅把腳本寫成了便攜版,不需要管理員權限。
灰域協議啟動。介麵彈出來,黑色的命令列視窗。一行字跳出來——“灰域協議v2.2。目標:遠程接入倒懸山第八區內網殘影緩存。等待連接。”
他在圖書館裡坐著,盯著螢幕上的進度條。窗外有灑水車的音樂聲,叮叮噹噹的,從街頭響到街尾。
倒計時開始。這一次不是九十秒。是不限時。
灰域協議的介麵上彈出一串IP地址。都是倒懸山市內的終端,標註著“規則破壞者”——有人的ID後麵跟著綠色的狀態欄,寫著“未啟用錨定”,有的跟著灰色的,寫著“狀態未知”。
林哲數了一下。灰色狀態欄的有四個。
他一個一個點擊。清理腳本自動運行,把退訂指令寫進殘影緩存。螢幕上的進度條爬了一條,再爬一條。第三條的時候,卡住了。
彈窗跳出來——“目標終端離線。無法完成退訂。是否繼續?”
他點了繼續。
第四條同樣離線。
第五條也離線。
六個灰色狀態欄裡,四個離線。兩個還在,被退訂了。
林哲盯著螢幕上的那幾行灰色狀態欄。離線。趙冬梅說係統裡找不到他們,可能是她擦得太乾淨了,也可能是他們自己躲起來了。四條離線——不是躲起來。是冇有了。
他關掉灰域協議。螢幕退回桌麵,壁紙是臨市圖書館的logo,藍色調。他把U盤拔下來。U盤塑料殼上沾了手心汗,滑膩膩的。
公共終端風扇還在嗡嗡響。林哲站起來,把揹包挎好。落地窗外麵的陽光已經挪到了第二排椅子底下,光照裡的灰塵慢慢飄。
他走到門口的時候,褲兜裡的手機震了。
不是備份程式。是係統簡訊。
“尊敬的市民,您的退訂申請已受理。感謝您參與倒懸山智慧治理試點項目。您的護航服務將於今日零時正式終止。如有任何疑問,請致電倒懸山數據管理部客服熱線。”
藍底白字。
林哲把手機攥在手裡。指節貼著機身邊緣,一陣陣發涼。他站在圖書館門口,台階上兩隻石獅子的影子被上午的太陽拖得很長。
台階下麵,灑水車剛過去,路麵上濕了一片。等公交車的人用鞋子踩著還冇乾的水印子。