liujia 发布的文章

DCImanager 5 - Windows 2025 - UnattendEFI.xml

问题:setup.exe /Unattend:x:\temp\Unattend.xml 后,在约 60% 的进度条,弹框提示安装失败
过程:查看 Panther\setuperr.log 文件内容,有如:

2024-12-06 19:41:00, Error                            WpxXmlDocument::ReportError (onecore\base\ntsetup\wpx\core\xml.cpp:157) - 0xc00ce50d:
2024-12-06 19:41:00, Error                                Invalid XML (line 196, position 142): A semi colon character was expected.

2024-12-06 19:41:00, Error                            WpxXmlDocument::LoadXml (onecore\base\ntsetup\wpx\core\xml.cpp:266) - 0x8007000d:
2024-12-06 19:41:00, Error                                The given data cannot be parsed
2024-12-06 19:41:00, Error                            WpxGetAnswerFileType (onecore\base\ntsetup\wpx\file\getfiletype.cpp:54) - 0x8007000d:
2024-12-06 19:41:00, Error                                Couldn't parse answer file contents as XML

查看相应的 Unattend.xml 内容,是:

        <RunSynchronousCommand wcm:action="add">
          <Description>finish</Description>
          <Order>9</Order>
          <Path>cmd /c echo cmd /c %windir%\setup\scripts\wget.exe -O- "http://10.8.8.8/dcimgr?func=osinstall.finish&id=1wJj42
pYVdjzzB9" >> %windir%\setup\scripts\SetupComplete.cmd</Path>
          <WillReboot>OnRequest</WillReboot>
        </RunSynchronousCommand>

而 DCIM 的 UnattendEFI.xml 文件内容是:

<?xml version="1.0" encoding="utf-8"?>
<unattend xmlns="urn:schemas-microsoft-com:unattend">
    <settings pass="windowsPE">
        <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <UserData>
                <AcceptEula>true</AcceptEula>
            </UserData>
            <DiskConfiguration>
                <WillShowUI>OnError</WillShowUI>
                <Disk wcm:action="add">
                    <CreatePartitions>
                        <CreatePartition wcm:action="add">
                            <Order>1</Order>
                            <Size>400</Size>
                            <Type>EFI</Type>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>2</Order>
                            <Type>MSR</Type>
                            <Size>128</Size>
                        </CreatePartition>
                        <CreatePartition wcm:action="add">
                            <Order>3</Order>
                            <Extend>true</Extend>
                            <Type>Primary</Type>
                        </CreatePartition>
                    </CreatePartitions>
                    <ModifyPartitions>
                        <ModifyPartition wcm:action="add">
                            <Format>FAT32</Format>
                            <Label>System</Label>
                            <Order>1</Order>
                            <PartitionID>1</PartitionID>
                        </ModifyPartition>
                        <ModifyPartition wcm:action="add">
                            <Order>2</Order>
                            <PartitionID>3</PartitionID>
                            <Label>Windows</Label>
                            <Letter>C</Letter>
                            <Format>NTFS</Format>
                        </ModifyPartition>
                    </ModifyPartitions>
                    <DiskID>0</DiskID>
                    <WillWipeDisk>true</WillWipeDisk>
                </Disk>
            </DiskConfiguration>
            <ImageInstall>
                <OSImage>
                    <InstallTo>
                        <DiskID>0</DiskID>
                        <PartitionID>3</PartitionID>
                    </InstallTo>
                    <InstallFrom>
                        <MetaData wcm:action="add">
                            <Key>/IMAGE/INDEX</Key>
                            <Value>2</Value>
                        </MetaData>
                    </InstallFrom>
                    <WillShowUI>OnError</WillShowUI>
                    <InstallToAvailablePartition>false</InstallToAvailablePartition>
                </OSImage>
            </ImageInstall>
        </component>
        <component name="Microsoft-Windows-International-Core-WinPE" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <SetupUILanguage>
                <UILanguage>en-US</UILanguage>
            </SetupUILanguage>
            <InputLocale>0409:00000409</InputLocale>
            <SystemLocale>en-US</SystemLocale>
            <UILanguage>en-US</UILanguage>
            <UILanguageFallback>en-US</UILanguageFallback>
            <UserLocale>en-US</UserLocale>
 </component>
    </settings>
    <settings pass="oobeSystem">
        <component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <UserAccounts>
                <AdministratorPassword>
                    <Value>($PASS)</Value>
                </AdministratorPassword>
            </UserAccounts>
            <OOBE>
                <HideEULAPage>true</HideEULAPage>
            </OOBE>
        </component>
        <component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <InputLocale>en-US</InputLocale>
            <SystemLocale>en-US</SystemLocale>
            <UILanguage>en-US</UILanguage>
            <UserLocale>en-US</UserLocale>
        </component>
    </settings>
    <settings pass="offlineServicing">
    </settings>
<settings pass="specialize">
    <component name="Microsoft-Windows-TCPIP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Interfaces>
            <Interface wcm:action="add">
                <Ipv4Settings>
                    <DhcpEnabled>false</DhcpEnabled>
                    <RouterDiscoveryEnabled>false</RouterDiscoveryEnabled>
                </Ipv4Settings>
                <Ipv6Settings>
                    <DhcpEnabled>false</DhcpEnabled>
                    <RouterDiscoveryEnabled>false</RouterDiscoveryEnabled>
                </Ipv6Settings>
                <Identifier>($WIN_MAC)</Identifier>
                <UnicastIpAddresses>
                    <IpAddress wcm:action="add" wcm:keyValue="1">($IP)/($NETMASK_SHORT)</IpAddress>
                    <IpAddress wcm:action="add" wcm:keyValue="2">($IPv6)/($NETMASKv6)</IpAddress>
                </UnicastIpAddresses>
                <Routes>
                    <Route wcm:action="add">
                        <Identifier>1</Identifier>
                        <Metric>10</Metric>
                        <NextHopAddress>($GATEWAYv4)</NextHopAddress>
                        <Prefix>0.0.0.0/0</Prefix>
                    </Route>
                    <Route wcm:action="add">
                        <Identifier>2</Identifier>
                        <Metric>10</Metric>
                        <NextHopAddress>($GATEWAYv6)</NextHopAddress>
                        <Prefix>::/0</Prefix>
                    </Route>
                </Routes>
            </Interface>
            <!--Interface wcm:action="add">
                <Ipv4Settings>
                    <DhcpEnabled>false</DhcpEnabled>
                    <RouterDiscoveryEnabled>false</RouterDiscoveryEnabled>
                </Ipv4Settings>
                <Ipv6Settings>
                    <DhcpEnabled>false</DhcpEnabled>
                    <RouterDiscoveryEnabled>false</RouterDiscoveryEnabled>
                </Ipv6Settings>
                <Identifier>Ethernet 2</Identifier>
            </Interface-->
        </Interfaces>
    </component>
    <component name="Microsoft-Windows-DNS-Client" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <Interfaces>
            <Interface wcm:action="add">
                <Identifier>($WIN_MAC)</Identifier>
                <DNSDomain>($HOSTNAME)</DNSDomain>
                <DNSServerSearchOrder>
                    <IpAddress wcm:action="add" wcm:keyValue="1">($NAMESERVER)</IpAddress>
                </DNSServerSearchOrder>
                <DisableDynamicUpdate>false</DisableDynamicUpdate>
                <EnableAdapterDomainNameRegistration>false</EnableAdapterDomainNameRegistration>
            </Interface>
        </Interfaces>
    </component>
    <component name="Microsoft-Windows-TerminalServices-LocalSessionManager" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <fDenyTSConnections>false</fDenyTSConnections>
      </component>
      <component name="Microsoft-Windows-TerminalServices-RDP-WinStationExtensions" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
          <UserAuthentication>0</UserAuthentication>
      </component>
    <component name="Networking-MPSSVC-Svc" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <FirewallGroups>
            <FirewallGroup wcm:action="add" wcm:keyValue="RemoteDesktop">
                <Active>true</Active>
                <Group>@FirewallAPI.dll,-28752</Group>
                <Profile>all</Profile>
            </FirewallGroup>
        </FirewallGroups>
    </component>
    <component name="Microsoft-Windows-Deployment" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <RunSynchronous>
           <RunSynchronousCommand wcm:action="add">
              <Description>Delete route</Description>
              <Order>1</Order>
              <Path>cmd /c echo IF "($IPv4)"=="" (route delete 0.0.0.0/0) ELSE IF "($IPv6)"=="" (route delete ::/0) >> %windir%\setup\scripts\SetupComplete.cmd</Path>
              <WillReboot>OnRequest</WillReboot>
           </RunSynchronousCommand>
           <RunSynchronousCommand wcm:action="add">
                      <Description>Change EFI boot order</Description>
              <Order>2</Order>
                      <Path>cmd /c echo cmd /c %windir%\setup\scripts\boot_order_changer.exe setfirstid __EFIBOOT__  >> %windir%\setup\scripts\SetupComplete.cmd</Path>
              <WillReboot>OnRequest</WillReboot>
           </RunSynchronousCommand>
           <RunSynchronousCommand wcm:action="add">
                       <Description>Disable Network Discovery</Description>
                       <Order>3</Order>
                       <Path>cmd /c echo cmd /c %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -command "&amp; {&amp;'Disable-NetFirewallRule' –DisplayName '@FirewallAPI.dll,-32752'}" >> %windir%\setup\scripts\SetupComplete.cmd</Path>
                       <WillReboot>OnRequest</WillReboot>
           </RunSynchronousCommand>
                   <RunSynchronousCommand wcm:action="add">
                       <Description>Setting multiple nameservers</Description>
                       <Order>4</Order>
                       <Path>cmd /c echo cmd /c %windir%\setup\scripts\nameservers.cmd ($NAMESERVERS) >> %windir%\setup\scripts\SetupComplete.cmd</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
           <RunSynchronousCommand wcm:action="add">
                       <Description>Enable language</Description>
                       <Order>5</Order>
                       <Path>cmd /c %windir%\System32\WindowsPowerShell\v1.0\powershell.exe %windir%\setup\scripts\lang.ps1 "($LANG)" >>%windir%\setup\scripts\lang.log 2>&amp;1</Path>
                       <WillReboot>Never</WillReboot>
           </RunSynchronousCommand>
                   <RunSynchronousCommand wcm:action="add">
                       <Description>finish</Description>
                       <Order>6</Order>
                       <Path>cmd /c echo cmd /c %windir%\setup\scripts\wget.exe -O- "($FINISH)" >> %windir%\setup\scripts\SetupComplete.cmd</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
           <RunSynchronousCommand wcm:action="add">
                       <Description>Postinstall script listener</Description>
                       <Order>7</Order>
                       <Path>cmd /c IF "($HAS_RECIPE)"=="1" (echo cmd /c %windir%\System32\WindowsPowerShell\v1.0\powershell.exe  %windir%\setup\scripts\winrm_listener.ps1 "($HOSTNAME)" "($LOCATIONIP)") >> %windir%\setup\scripts\SetupComplete.cmd</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
                   <RunSynchronousCommand wcm:action="add">
                       <Description>Change EFI boot order 2</Description>
                       <Order>8</Order>
                       <Path>cmd /c %windir%\setup\scripts\boot_order_changer.exe setfirstid __EFIBOOT__ >> %windir%\setup\scripts\efi.log</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
                   <RunSynchronousCommand wcm:action="add">
                       <Description>Put key</Description>
                       <Order>9</Order>
                       <Path>cmd /c echo ($PRODUCTKEY) >> %windir%\setup\key</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
                   <RunSynchronousCommand wcm:action="add">
                       <Description>Activating windows</Description>
                       <Order>10</Order>
                       <Path>cmd /c echo cmd /c %windir%\setup\scripts\activate.cmd >> %windir%\setup\scripts\SetupComplete.cmd</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
                   <RunSynchronousCommand wcm:action="add">
                       <Description>TZ setup</Description>
                       <Order>11</Order>
                       <Path>cmd /c IF NOT "($TIMEZONE)" == "()" ( IF NOT "($TIMEZONE)" == "" (tzutil /s "($TIMEZONE)"))</Path>
                       <WillReboot>OnRequest</WillReboot>
                   </RunSynchronousCommand>
        </RunSynchronous>
    </component>
</settings>
    <cpi:offlineImage cpi:source="catalog:c:/distr/7601.17514.101119-1850_x64fre_server_eval_en-us-grmsxeval_en_dvd/sources/install_windows server 2008 r2 serverstandard.clg" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
</unattend>

网上查得,在 xml 文件中,& 的符号要转义。尝试使用 CData 来表达 URL 的变量 ($FINISH) 。但实践中,使用了 CData 后,网址末尾多出来了个分号 ; 符号。无奈,最后将 URL 的变量拆成两部分,前边一部分写固定,后边用变量 ($AUTH_ID) 的组合。

参考:

iredmail - 注册页 - register - 简单制作

需求:有一个简单的 web 表单,让未登录的访客 注册 邮箱
思路:iredadmin 里,有 Create 的类,照它样子,复制出一个 Register 类来;同样,模仿着添加好 web 访问的路径 和 html 表单

环境:debian 12 里安装好的 iredmail - 1.7.1 SQL 版本

请注意,我不会 Python ,这是我在 Poe GPT 帮助下,简单制作的,仅用于测试。

步骤:

文件内容:iRedAdmin-2.6/controllers/sql/urls.py 中,添加 访问路径 :

'/register', 'controllers.sql.basic.Register',

文件内容:iRedAdmin-2.6/controllers/sql/basic.py 中,添加 Register 的类 :

from libs import iredpwd
from libs.sqllib import general as sql_lib_general
class Register:
    def GET(self):
        available_domains = ['iredmail.demo.anqun.org', 'imap.demo.2xinxian.top', 'example.net']  # 示例域名列表
        form = web.input()
        return web.render(
            'register.html',
            available_domains=available_domains,
            msg=form.get('msg'),
        )

    def POST(self):
        form = web.input()

        domain = form.get('domainName', '').strip().lower()
        username = form.get('username', '').strip().lower()
        newpw = form.get('newpw', '').strip()
        confirmpw = form.get('confirmpw', '').strip()
        cn = form.get('cn', '').strip()  # 获取可选的显示名称

        if not username or not newpw or not confirmpw or not domain:
            return web.seeother(f'/register?msg=INVALID_INPUT')

        if newpw != confirmpw:
            return web.seeother(f'/register?msg=PASSWORDS_DO_NOT_MATCH')

        # 生成密码哈希
        pwscheme = 'SSHA512'
        passwd_hash = iredpwd.generate_password_hash(newpw, pwscheme=pwscheme)

        result = self.add_user(domain, username, passwd_hash, cn)  # 将 cn 传递给 add_user

        if result[0]:
            return web.seeother(f'/register?msg=CREATED')
        else:
            return web.seeother(f'/register?msg={web.urlquote(result[1])}')

    def add_user(self, domain, username, password, cn):
        mail = f"{username}@{domain}"

        if sql_lib_general.is_email_exists(mail):
            return (False, 'ALREADY_EXISTS')

        record = {
            'domain': domain,
            'username': mail,
            'password': password,
            'active': 1,
            'name': cn
        }

        try:
            _wrap = SQLWrap()
            conn = _wrap.conn
            conn.insert('mailbox', **record)
            return (True, )
        except Exception as e:
            return (False, repr(e))

创建模板文件 iRedAdmin-2.6/templates/default/register.html

{% extends "layout.html" %}

{% block title %}{{ _('Add mail user') }}{% endblock title %}
{% block navlinks_create %}class="active"{% endblock %}

{% block main %}
{# Show system message #}
{% if msg %}
    {% if msg.startswith('PW_') %}
        {% set _pw_errors = msg.split(',') %}
        {% for _err in _pw_errors %}
            {{ user_msg_handler(_err) }}
        {% endfor %}
    {% else %}
    {#        {{ user_msg_handler(msg) }} #}
        <p>{{ msg }}</p>
    {% endif %}
{% endif %}

    <div class="content-box">
        <div class="box-body">
            <div class="box-header clear">
                <ul class="tabs clear">
                    <li class="active"><a href="#user_add"><i class="fa fa-plus"></i> {{ _('User') }}</a>
                </ul>

                <h2>{{ _('Add mail user') }}</h2>
            </div>

            <div id="user_add" class="box-wrap clear">
                <form name="form_add_user" method="post" action="{{ctx.homepath}}/register">
                    <div class="form-field clear">
                        <h4 class="size-250 fl-space">{{ _('Mail Domain') }} <span class="required">*</span></h4>
                        <span class="clean-padding">
                            <select name="domainName" id="domainSelect" required>
                                {% for domain in available_domains %}
                                    <option value="{{ domain }}">{{ domain }}</option>
                                {% endfor %}
                            </select>
                        </span>
                    </div>
                
                    <div class="form-field clear">
                        <h4 class="size-250 fl-space">{{ _('Mail Address') }} <span class="required">*</span></h4>
                        <span class="clean-padding">
                            <input type="text" size="35" name="username" value="" autocomplete="off" class="text fl-space" required />@
                        </span>
                    </div>
                
                    <div class="form-field clear">
                        <h4 class="size-250 fl-space">{{ _('Password') }} <span class="required">*</span></h4>
                        <span class="clean-padding">
                            <input type="password" name="newpw" required class="text fl-space" />
                        </span>
                    </div>
                    
                    <div class="form-field clear">
                        <h4 class="size-250 fl-space">{{ _('Confirm Password') }} <span class="required">*</span></h4>
                        <span class="clean-padding">
                            <input type="password" name="confirmpw" required class="text fl-space" />
                        </span>
                    </div>

                    <div class="form-field clear">
                        <h4 class="size-250 fl-space">{{ _('Display Name (Optional)') }}</h4>
                        <span class="clean-padding">
                            <input type="text" name="cn" value="" autocomplete="off" class="text fl-space" />
                        </span>
                    </div>                    
                
                    <div class="form-field clear">
                        <span>
                            <input type="submit" name="submit_add_user" value="{{ _('Add') }}" class="button green"/>
                        </span>
                    </div>
                </form>
            </div>{# -- End box-wrap -- #}
        </div>{# -- End content-box -- #}
    </div>{# -- End box-body -- #}
{% endblock main %}

iredmail 自定义注册页 表单

iredmail 自助注册邮箱成功

iredmail 自助注册的邮箱,成功登录到 Webmail

参考:

mailcow - 554.5.7.1 this message does not meet our delivery requirements - rspamd - aliyun.com - 白名单

问题:从 example@aliyun.com 发往 mailcow 邮局,被打回了。提示:554.5.7.1 this message does not meet our delivery requirements in replay to end of data command

步骤:登录到 mailcow 管理 web 界面,查看 rspamd 的 “日志” 。可以看到发自 example@aliyun.com 的邮件被邮局拒收(reject)了。点击查看详细,在各项扣分中,如 FREEMAIL_POLICY_FAILURE (16) 这一项就被扣了 16 分?相比较,从 example@qq.com 发过来的,没有这个扣分项。难道 aliyun.com 或由 阿里云 托管的邮局 不如 qq.com 的“知名”?

FREEMAIL_POLICY_FAILURE (16)
DMARC_POLICY_QUARANTINE (8) [aliyun.com : SPF not aligned (relaxed), No valid DKIM, quarantine]
FORGED_W_BAD_POLICY (3)
TO_EXCESS_BASE64 (1.5)
MV_CASE (0.5)
CTE_CASE (0.5)
ONCE_RECEIVED (0.2)
MIME_BASE64_TEXT (0.1)
RWL_MAILSPIKE_VERYGOOD (-0.2) [54.207.22.56:from]
R_SPF_ALLOW (-0.2) [+ip4:54.207.22.56]
MIME_GOOD (-0.1) [multipart/alternative, text/plain]
MX_GOOD (-0.01) []

尝试:将 aliyun.com 添加到全局的 header-from 白名单中。再次测试,能正常收到邮件了。

广州天河沐陂小学附近钻人行道路基

上午约11点,出去买水豆腐。路过,看到沐陂小学临“沐陂大街”一侧在施工:有台小型钻凿机将人行道边沿的小泥钻松,另外还有两个施工人员。买豆腐回来时,看到村口附近的一排棚架在焊接,每组约有十米,共七组,总共约七十米长。不知道棚架是否用于张贴宣传海报等(11-18日向卖馒头的老板打听,他说是电动自行车的充电桩栅)。

沐陂小学临街人行道施工

沐陂大街村口附近正在搭建的棚架

挤脓肿做清创

唉……我整天在手机上点这点那,签到、看视频之类的,想省几块钱。但……因为肩膀附近生了个“脓肿”,今天上午到附近的卫生站(沐陂村的沐陂大街)看医生,照彩超、挤脓清创,总共花费六百多元。来到广州两个月,活没揽到,已经被割走了些“皮肉”。

  1. 大概在 2024-10-18 日,感觉到右前胸上侧痒,有小的红痕,忽略
  2. 大概在 10-29 日,即十天后,红痕范围扩大,且明显已经鼓起了疱
  3. 11-02 日,通过京东网上问诊,自拍相片(小尾指尖般凸起)给医生看。医生提到“脂肪瘤”,但我说不会触痛,且会红延。建议是验血和做B超,确定情况。单子写着是“皮肤发炎”
  4. 11-04 日,周一。因为脓疱增大,且按压有波动感,我到附近的“新塘街道聚贤社区卫生服务站”看医生。医生说是“粉瘤”引起的细菌感染“脓肿”。必须做彩超确定情况后破皮排脓。做彩超,约110元,期间压破了脓肿,流了脓。拍照的医生简单拿两张卫生纸让我擦、捂住。医生开单:手术排脓,随后几天每天换约,在家按时吃消炎药。再次缴费约510元。脱上衣,躺在被做手术。先打麻药,我感觉到针在钻入皮肤,很痛。医生先后两次加大麻药剂量。之后,感觉到医生有手指用力捏、按压、排挤伤口。医生说里边有很多脓。我别的想不了,因为很痛。双手掌紧紧互相攥着,脚也忍不住绞在一起。医生边操作边解说,如“现在清洗一下”、“现在塞入棉花”、“这也是为什么每天要来换药的原因”……开的药有两种:“凯霖”的“盐酸克林霉素棕榈酸酯分散片”,每次2片,每日三次;“合作者”的“龙血竭片”,每次4片,每日三次。我是约10:40分走出卫生站的。饭前吃了一次“龙血竭片”,饭后约1点时吃了一次“克林霉素”消炎药。晚上约八点时,吃了第二次的“克林霉素”。但在约一个小时后,偶尔发现右手手腕痒,热。挠了一下后又会痒,撸起袖子一看,皮肤有隐约凸起,有淡淡的红迹。同时对比左手,不会。然后在“沐贤社区家医”微信群里发相片,丁医生说“先停药,明天来看看”。九点半后,睡觉前,发觉左手背也有点红迹了。我拿出“盐酸克林霉素棕榈酸酯分散片”的说明书看,里边写了“不良反应”是:过敏反应,少数病人可出现药物性皮疹。半夜里,双手不自觉去挠和摸肚脐下的小肚子,再之后又往上挠大肚子
  5. 11-05 日,周二。早上脱开长裤子查看,右膝上边里侧和右大腿内侧,有成片的红色疹子;左大腿内侧也有,但数量相对少些;拉起上衣看,肚腹和小腹也是成片的红疹,特别是在吃早餐后,颜色更红、更明显。八点多我到卫生站,先向丁医生说起红疹的事情,且让他看肚子上的红疹。他顿了一下,说“消炎药不要吃了”;“如果会痒,我开点止痒药给你”。我表示不想再吃药。丁医生然后给我的伤口换了药。下午六点,抹身后,觉得右手红迹区有点肿,肚脐下小腹觉得有点胀,内裤有些勒。向微信群里丁医生反馈手腕附近肿的现象,答,“明早来看一下”
  6. 11-06 日,周三。八点多到卫生站,看医生要排队等。我看墙上挂着的职员表,发现“李某婷”,毕业于广东金融学院。负责导医、建档工作。轮到我看医生时,医生坐在凳子上,问我是否吃抗过敏药(氯霉他定),我说不吃;又被问,是否打屁股针,我也说不打。医生反问我,你不吃药不打针,那红疹的问题怎么帮你解决?我问,先帮我换肩上创口的药吧。躺在床上换药时,医生又问,不吃药的话,要不要给点药膏给你抹一下?我也说不要。医生问,那红疹怎么办?我说给我一个手套吧,晚上睡着时,我怕不自觉地挠它,怕挠烂了皮肤。医生给了一双包装的一次性手套,同时说我不要太固执,药膏不收钱的。我问红疹的地方为什么会肿,医生说因为发炎了。我又问,一般红疹症状过几天预期会怎么样?医生答说,会慢慢减退
  7. 11-07 日,周四。昨晚夜起床三次,右后背不舒服,要不断地变换睡姿。起床后观察,红疹区域未见减少,颜色从鲜红转为深红,颗粒较之前明显。整个人觉得疲倦。九点出门换药。向医生反馈了今天的状态,他问吃的方面,正常吗?我答,“基本正常”。医生说创口恢复得“还可以”,再换3~4天,就好了
  8. 11-08 日,周五。今天精神状态,相对昨天,好一点。手腕、膝盖红痕减淡、面积减小了一点,大腿、腰腹等重要地方还未见明显好转。昨晚夜,11点到1点左右,睡不着,觉得肚脐四周胀,有压力压迫到右侧器官,反复变换睡姿、坐、半躺、平躺都不能解决不适感。八点多医生换药时,反馈腹胀现象,医生说“你想多了”
  9. 11-09 日,周六。中午,吃在“美团”买的“圣农”鸡腿肉丁(300克)和生菜。午饭后约一点半,觉得颈背热,伸左手挠,不解痒。短暂午睡后,发到两个手臂增加了红疹面积,颜色相对较鲜、较浅。想我二姐说过的,鸡肉可能会增加过敏。赶忙将锅里剩下的约一半鸡肉倒掉,且加一杯水到锅里煮十分钟后再倒掉,当作清洗了一遍。晚饭煮了剩下的一半生菜(约250克)和一条腐竹(红疹期间吃过,应该没问题)。但晚饭后觉得脖子热、有点痒,拿镜子一看,颈窝、右肩附近有新增的红疹面积,颜色也是鲜和㳀的。难道,之前心脏以上位置区域没出过红疹的,现在要补上去?
  10. 11-11 日,周一。换药时,医生说伤口恢复得还可以,明天不用来,过两天再来看一次。
  11. 11-12 日,周二。觉得小肚子还是有胀的感觉。细看,肚脐下边附近有暗点,如生“青春痘”后期那种灰、暗红的形状,摸上去不痒也不痛。撸几下毛毛,皮肤似乎微微扯起一些灰色的蜕皮。数了一下,到两侧腹股沟附近,总共约有12个暗点
  12. 11-13 日。周三。到卫生站换药。医生说,伤口已经结痂,今天还是用纱布挡一下,明天就可以碰水了。从躺床上下来,我从裤兜里掏出两盒“克林霉素”,问能否退钱,如果不能就送给下一个患者。医生答说“不好退”,然后就走回坐诊室了。我在坐诊室门口等。医生看了一个病人后,在里边喊我的名字。我进去了。他让我去药房报我的名字,打出发票,退药。我走到药房窗口,问里边的姑娘。姑娘查看药盒和里边的药片包装。我解释说,消炎药我吃了过敏起红疹,我留着药没用,且我打算离开这儿(沐陂村)了。姑娘说好们要确认药是不是从这里出去的,药不是随便配的,要对其他患者负责。之后,医生也来到窗口,说“他吃了过敏,退一下(药)”。然后我再到坐诊室,医生打印出两张纸,让我一起拿给药房。在交单子给药房前,我拍了一下单子:处方单、处置单和发票。我继续等,过程中看到有三个人缴费领药。最后,姑娘喊我,递给我50和20元的纸币,说,两盒消炎药,总共69.5元。我接过纸币,问,那这儿是70元,我是不是该给你找回钱。姑娘说,因为没零钱,所不用找了。我拿了钱,捏在右手,站在坐诊室门外。医生他不在。等了几分钟,他从过道里回来。我迎上去,微微向上摇了右手,笑着对他说,“退到钱了”。医生说,拿到钱了啊。那回家去吧
  13. 11-14 日。周四。昨晚约两点,醒了,听到窗外有铁丝摩擦声音,我以为是老鼠在爬。继续睡,之后,又听到有翅膀扇动的声音,声音短而急,夹着沿爬的声音。我打开灯,看到一只个体大的蟑螂在床头不远的地上,我伸左脚踩死了它。我躺在床上,手不自觉从沿大腿外侧往上摸到腰附近,觉得皮肤不平,有凸起的地方。但相应的区域不热,也不会有那种挠痒会更痒的感觉。同样,我换成身左侧,一摸,差不多的“粗糙”皮肤感觉。我拿起手机,倒计时自拍左侧身腰股四周区域。看到有如之前小肚子的那些“暗点”,区别是腰股四周的这些点,多数顶尖已经是白色,脱皮了。上午,八点多时,撕开右上肩的胶布和纱布,看到一条约两厘米长,宽2毫米的紫色结痂
  14. 11-29 日。周五。中午约一点吃午饭,土豆、意大利生麦和鸡蛋(都是“美团优选”网上买的),一锅熟。下午五点散步回来看发现,双膝周围及大腿附近起红疹(皮肤不会大面积显红)。右膝内侧较严重,呈龟裂,不规则条纹状。晚上约十点半睡觉,约一点时醒来,因为起疹子的地方,感觉到热,痒。不自禁地摸,隔着裤子轻轻地挠,越挠越痒。两侧髋骨附近、肚脐下的皮肤痒,忍不住地摸。触摸的皮肤有凸感。之前,起红疹的地方,它又有疹子了
  15. 11-30 日。周六。下午约五点半,洗澡前查看膝周、大腿皮肤,有凸起的疹子,但不红。洗澡时,用花洒淋温水,区域会变明显:变红,疹子颗粒状。洗澡后,皮肤较难受——觉得痒,但又不敢挠