python中寫入utf-16 bom文件 (用來批量生成xshell的docker登入腳本)

在docker容器的實際應用中,對於我這樣的測試來講
最頭疼的事情反而是有時候需要同時操作容器外和容器內
容器外給掛載的路徑rz文件,編譯服務(以供容器內啓動使用),查看日誌
而容器內則負責啓動服務,查看進程等操作

經常不小心操作錯誤
後來想到個解決方式就是像這樣
在這裏插入圖片描述
把容器外和容器內用標籤分開
並且給登入容器的配類似這樣的腳本
在這裏插入圖片描述
但到了後來,模擬的節點變多,容器越來越多
store這個容器已經多到了18個,還可能更多,這樣配置文件顯得非常麻煩

解決:

其實xshell是有會話文件的,一般在~/Documents/NetSarang Computer/6/Xshell/Sessions下面,或者windows下相當於C:\Users\用戶名\Documents/NetSarang Computer/6/Xshell/Sessions下面是會話文件的保存位置,文件後綴爲xsh

我比對了store0和store1的xsh文件,發現僅有這一行不一樣
ExpectSend_Send_0=docker exec -it nebula_store0 /bin/bash

這裏記錄的是具體的expect命令,我只需要批量修改這裏並且生成xsh文件就可以

把文件內容複製,放到python中,將命令用{}活化,再在循環裏用變量格式化文件名和文件內容

import codecs

model = """
[CONNECTION:PROXY]
Proxy=

# ......略

ExpectSend_Expect_0=]#
ExpectSend_Send_0=docker exec -it nebula_store{} /bin/bash
Library=0

# ......略

SendKeepAlive=0
KeepAlive=1
""".replace("\n", "\r\n")

for i in range(0, 18):
    with open("新內網測試(store{}).xsh".format(i), "wb") as f:
        f.write(codecs.BOM_UTF16_LE)
        f.write(model.format(i).encode("utf-16le"))
    print(i)

這裏有幾個注意的地方
1.用notepad++打開源文件,發現源文件使用的是CrLf格式(windows)的換行符,而python中多行文本換行符爲Lf,所以用’\r\n’來替換’\n’,把換行符替換爲CrLf
2.還是notepad++,發現源文件格式居然是。。usc-2 (即utf16) little endian編碼,而且還帶BOM。。。。。。
3.爲了避免解析上的問題,我們需要先將文本編碼爲utf16-le格式。然後在前面加上utf16-le的BOM(codecs模塊提供)。因爲BOM是二進制的,所以我們也使用二進制寫入模式’wb’打開文件,這樣正文文本就需要encode爲字節流纔行。

然後執行代碼,得到生成的xsh文件,粘貼到原來xshell會話存儲的地方
在這裏插入圖片描述
點擊xshell的會話列表即自動刷新
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章