CMD说明

CMD说明

CMD字体要求

  • CMD/Powershell对字体要求比较严格

    • 等宽字体
    • 不能为斜体字体
    • 不能有A或C负空间
    • 若是TrueType字体,则必须是FF_MODERN
    • 若不是TrueType字体,则必须是OEM_CHARSET
  • 对于CJK(亚洲字体),还有额外附加条件

    • 若不是TrueType字体,字体名必须是Terminal
    • 若是TrueType字体,必须使用亚洲语言字符集
    • 在字体元信息里声明支持CP936

PowerPoint 技巧

插入元素

插入网页

  • WebView加载项:可以在ppt应用市场中获取

    • 只支持https页面
      • 本地页面都不支持
      • 尝试自建https服务器(自签发证书)失败
    • 可以在编辑状态查看页面效果
    • 在OFFICE2010及以前不可用
  • Microsoft Web Browser控件

    • 调用IE渲染页面,因此网页对IE的兼容性很重要
    • 控件不会自动加载网页,需要通过VB通过触发事件调用其 Navigate2方法加载网页,所以只有在ppt播放页面才能 看到实际效果
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      // 页面切换事件
      // 注意不要`Private Sub`,否则事件不会被触发
      // 若想手动触发可以使用button控件的`CommandButton<X>_Click`事件
      Sub OnSlideShowPageChange()
      Dim FileName As String
      FileName = "<FILENAME>"
      // `WebBrowser1`:控件名称,唯一(单个slide内)标识控件
      // `ActivePresentation.PATH`:当前工作目录(未保存文件返回空),
      // 浏览器默认`http://`协议
      // `Navigate`方法可能会无法加载
      WebBrowser1.Navigate2(ActivePresentation.PATH + "/" + "<FILENAME>")
      End Sub

Excel技巧

EXCEL密码破解

VBAProject密码

  • vbaProject.bin中密码对应字段

    • DPB:当前已存在密码,后跟加密密码值
  • xls:97-03格式表格是RAR格式压缩文件

    • 解压之后再次压缩一般无法正常打开,应该是有特殊的压缩 规则
    • 可以直接用编辑器打开、修改整个文件,但要注意以二进制 格式打开
  • xlsm:07之后带宏表格是ZIP压缩文件

    • 解压之后再次zip打包也无法正常打开,但是zip格式可以 直接替换其中文件,所以可以直接修改单个文件
    • vim对zip格式文件处理类型文件夹,所以使用vim二进制打开 可以修改其中单个文件

修改二进制文件

  • 处理方法:将密码对应字段“无效”

    • 需要保持文件前后大小不改变
    • 密码字段无效化
  • “删除”密码字段

    • DPB字段替换为等长其他名称
      • 密码无法被正常识别
      • 文件大小没有改变,仅字符被替换
    • 再次打开文件,启用宏会报错
      • 不断点击确认之后即可查看vba工程
      • 为vba工程设置新密码,覆盖替换后错误字段,保存 可得已知密码文件
        • 右键VBAProject
        • 工程属性
        • 保护
        • 查看工程属性密码:修改为新密码即可
  • 替换密码字段

    • DPB后密码值替换为其他值
      • 为保证文件大小不变
        • 若新密码较短需要用0填充不足部分
        • 较原始密码长则无需额外操作
    • 打开文件则可以使用已知密码查看vba工程
1
2
3
4
5
6
7
8
9
10
11
 # 二进制打开文件,否则vim会做某些处理,损坏文件
$ vim -b <file>

# 调用xxd转换字符格式为16进制
# 可看到16进制、字符对应格式
# 仅修改左侧16进制有效,修改右侧字符表示不影响文件
# 内容
$ !%xxd

# 16进制转换回原始表示
$ !%xxd -r

VBA脚本穷举密码

  • xls格式:打开VBA编辑器执行代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    '移除VBA编码保护
    Sub MoveProtect()
    Dim FileName As String
    FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
    If FileName = CStr(False) Then
    Exit Sub
    Else
    VBAPassword FileName, False
    End If
    End Sub

    '设置VBA编码保护
    Sub SetProtect()
    Dim FileName As String
    FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
    If FileName = CStr(False) Then
    Exit Sub
    Else
    VBAPassword FileName, True
    End If
    End Sub

    Private Function VBAPassword(FileName As String, Optional Protect As Boolean = False)
    If Dir(FileName) = "" Then
    Exit Function
    Else
    FileCopy FileName, FileName & ".bak"
    End If

    Dim GetData As String * 5
    Open FileName For Binary As #1
    Dim CMGs As Long
    Dim DPBo As Long
    For i = 1 To LOF(1)
    Get #1, i, GetData
    If GetData = "CMG=""" Then CMGs = i
    If GetData = "[Host" Then DPBo = i - 2: Exit For
    Next
    If CMGs = 0 Then
    MsgBox "请先对VBA编码设置一个保护密码...", 32, "提示"
    Exit Function
    End If
    If Protect = False Then
    Dim St As String * 2
    Dim s20 As String * 1
    '取得一个0D0A十六进制字串
    Get #1, CMGs - 2, St
    '取得一个20十六制字串
    Get #1, DPBo + 16, s20
    '替换加密部份机码
    For i = CMGs To DPBo Step 2
    Put #1, i, St
    Next
    '加入不配对符号
    If (DPBo - CMGs) Mod 2 <> 0 Then
    Put #1, DPBo + 1, s20
    End If
    MsgBox "文件解密成功......", 32, "提示"
    Else
    Dim MMs As String * 5
    MMs = "DPB="""
    Put #1, CMGs, MMs
    MsgBox "对文件特殊加密成功......", 32, "提示"
    End If
    Close #1
    End Function

Sheet保护密码

VBA脚本

  • xlsx:打开VBA编辑器执行代码

    1
    2
    3
    4
    5
    6
    7
    Sub pj()
    Dim sht As Worksheet
    For Each sht In Worksheets
    sht.Protect AllowFiltering:=True
    sht.Unprotect
    Next
    End Sub
  • xls:打开VBA编辑器执行代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    Public Sub AllInternalPasswords()
    ' Breaks worksheet and workbook structure passwords. Bob McCormick
    ' probably originator of base code algorithm modified for coverage
    ' of workbook structure / windows passwords and for multiple passwords
    '
    ' Norman Harker and JE McGimpsey 27-Dec-2002 (Version 1.1)
    ' Modified 2003-Apr-04 by JEM: All msgs to constants, and
    ' eliminate one Exit Sub (Version 1.1.1)
    ' Reveals hashed passwords NOT original passwords
    Const DBLSPACE As String = vbNewLine & vbNewLine
    Const AUTHORS As String = DBLSPACE & vbNewLine & _
    "Adapted from Bob McCormick base code by" & _
    "Norman Harker and JE McGimpsey"
    Const HEADER As String = "AllInternalPasswords User Message"
    Const VERSION As String = DBLSPACE & "Version 1.1.1 2003-Apr-04"
    Const REPBACK As String = DBLSPACE & "Please report failure " & _
    "to the microsoft.public.excel.programming newsgroup."
    Const ALLCLEAR As String = DBLSPACE & "The workbook should " & _
    "now be free of all password protection, so make sure you:" & _
    DBLSPACE & "SAVE IT NOW!" & DBLSPACE & "and also" & _
    DBLSPACE & "BACKUP!, BACKUP!!, BACKUP!!!" & _
    DBLSPACE & "Also, remember that the password was " & _
    "put there for a reason. Don't stuff up crucial formulas " & _
    "or data." & DBLSPACE & "Access and use of some data " & _
    "may be an offense. If in doubt, don't."
    Const MSGNOPWORDS1 As String = "There were no passwords on " & _
    "sheets, or workbook structure or windows." & AUTHORS & VERSION
    Const MSGNOPWORDS2 As String = "There was no protection to " & _
    "workbook structure or windows." & DBLSPACE & _
    "Proceeding to unprotect sheets." & AUTHORS & VERSION
    Const MSGTAKETIME As String = "After pressing OK button this " & _
    "will take some time." & DBLSPACE & "Amount of time " & _
    "depends on how many different passwords, the " & _
    "passwords, and your computer's specification." & DBLSPACE & _
    "Just be patient! Make me a coffee!" & AUTHORS & VERSION
    Const MSGPWORDFOUND1 As String = "You had a Worksheet " & _
    "Structure or Windows Password set." & DBLSPACE & _
    "The password found was: " & DBLSPACE & "$$" & DBLSPACE & _
    "Note it down for potential future use in other workbooks by " & _
    "the same person who set this password." & DBLSPACE & _
    "Now to check and clear other passwords." & AUTHORS & VERSION
    Const MSGPWORDFOUND2 As String = "You had a Worksheet " & _
    "password set." & DBLSPACE & "The password found was: " & _
    DBLSPACE & "$$" & DBLSPACE & "Note it down for potential " & _
    "future use in other workbooks by same person who " & _
    "set this password." & DBLSPACE & "Now to check and clear " & _
    "other passwords." & AUTHORS & VERSION
    Const MSGONLYONE As String = "Only structure / windows " & _
    "protected with the password that was just found." & _
    ALLCLEAR & AUTHORS & VERSION & REPBACK
    Dim w1 As Worksheet, w2 As Worksheet
    Dim i As Integer, j As Integer, k As Integer, l As Integer
    Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
    Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
    Dim PWord1 As String
    Dim ShTag As Boolean, WinTag As Boolean

    Application.ScreenUpdating = False
    With ActiveWorkbook
    WinTag = .ProtectStructure Or .ProtectWindows
    End With
    ShTag = False
    For Each w1 In Worksheets
    ShTag = ShTag Or w1.ProtectContents
    Next w1
    If Not ShTag And Not WinTag Then
    MsgBox MSGNOPWORDS1, vbInformation, HEADER
    Exit Sub
    End If
    MsgBox MSGTAKETIME, vbInformation, HEADER
    If Not WinTag Then
    MsgBox MSGNOPWORDS2, vbInformation, HEADER
    Else
    On Error Resume Next
    Do 'dummy do loop
    For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
    For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
    For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
    For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
    With ActiveWorkbook
    .Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
    Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    If .ProtectStructure = False And _
    .ProtectWindows = False Then
    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    MsgBox Application.Substitute(MSGPWORDFOUND1, _
    "$$", PWord1), vbInformation, HEADER
    Exit Do 'Bypass all for...nexts
    End If
    End With
    Next: Next: Next: Next: Next: Next
    Next: Next: Next: Next: Next: Next
    Loop Until True
    On Error GoTo 0
    End If
    If WinTag And Not ShTag Then
    MsgBox MSGONLYONE, vbInformation, HEADER
    Exit Sub
    End If
    On Error Resume Next
    For Each w1 In Worksheets
    'Attempt clearance with PWord1
    w1.Unprotect PWord1
    Next w1
    On Error GoTo 0
    ShTag = False
    For Each w1 In Worksheets
    'Checks for all clear ShTag triggered to 1 if not.
    ShTag = ShTag Or w1.ProtectContents
    Next w1
    If ShTag Then
    For Each w1 In Worksheets
    With w1
    If .ProtectContents Then
    On Error Resume Next
    Do 'Dummy do loop
    For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
    For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
    For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
    For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
    .Unprotect Chr(i) & Chr(j) & Chr(k) & _
    Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    If Not .ProtectContents Then
    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
    MsgBox Application.Substitute(MSGPWORDFOUND2, _
    "$$", PWord1), vbInformation, HEADER
    'leverage finding Pword by trying on other sheets
    For Each w2 In Worksheets
    w2.Unprotect PWord1
    Next w2
    Exit Do 'Bypass all for...nexts
    End If
    Next: Next: Next: Next: Next: Next
    Next: Next: Next: Next: Next: Next
    Loop Until True
    On Error GoTo 0
    End If
    End With
    Next w1
    End If
    MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK, vbInformation, HEADER
    End Sub

网络设置

VMware网络模式

虚拟网络组件

虚拟交换机

Virtual Network Editor中默认有三个虚拟交换机

  • VMnet0(Bridged):桥接模式下的虚拟交换机
  • VMnet1(Host-only);仅主机模式下的虚拟交换机
  • VMnet8(NAT):NAT模式下虚拟交换机

虚拟网卡

在宿主机上安装完成VMware后,在网络适配器中会安装有两块 虚拟网卡

  • VMware Network Adapter VMnet1:主机模式下虚拟网卡
  • VMware Network Adapter VMnet8:NAT模式下虚拟网卡

卸载虚拟网卡后,可以Virtual Network Editor->还原默认设置, 还原虚拟网卡

Bridged

桥接模式:将主机网卡同虚拟机网卡利用虚拟网桥进行通信

  • 网络结构

    • 在桥接作用下,类似从物理主机虚拟出一个交换机
    • 所有桥接设置的虚拟机都连接到这个交换机的接口上
    • 物理主机也同样连接在此交换机上
    • 虚拟机就像是外部局域网中的独立主机,同宿主机逻辑上 同等地位
  • 网络连通性

    • 所以桥接下的网卡与网卡的都是交换模式的, 可以相互访问,不受干扰
    • 虚拟机可以在外部网络上可见
  • 机器网络配置

    • 虚拟机IP地址需要和宿主机在同一网段(外网网段)
    • 需要手动配置虚拟机配置IP地址、子网掩码
    • 若需要联网,虚拟机Gateway、DNS需要和主机一致

vmware_bridged

适用场景

  • 利用VMware在局域网中新建虚拟服务器,位局域网提供网络服务
  • 网络环境ip资源充裕

网络设置

  • 宿主机网络连接

    • 网络连接属性中VMware Bridge Protocal是否勾选 (安装VMware后一般会默认勾选)
    • 确认宿主机:IP、Gateway、DNS
  • 虚拟机网络设置

    • 编辑虚拟机设置->网络适配器->Bridged/桥接模式
  • 虚拟机网卡配置:网卡配置文件方式参见config_file

    • IP地址要和宿主机IP在同一网段
    • Gateway默认网关要和宿主机一致

NAT

Network Address Translation:网络地址转换,借助 虚拟NAT设备虚拟DHCP服务器,使得虚拟机能够联网

  • 网络结构

    • 主机网卡与虚拟NAT设备相连
    • 虚拟NAT设备、虚拟DHCP服务器、虚拟机共同连接在虚拟 交换机VMnet8上
    • VMnet8通过虚拟网卡VMware Network Adapter VMnet8和 宿主机相连,宿主机成为双网卡主机,同时参与宿主网络 和虚拟网络
  • 网络连通性

    • 借助虚拟NAT设备连通宿主机网卡、虚拟机,实现了 虚拟机通过宿主机网卡联网,所以虚拟机在外部网络 不可见
    • VNAV8连通宿主机、虚拟机,使得宿主机可以和虚拟机连通 ,要注意此时宿主机双网卡,连通虚拟局域网的网卡是虚拟 网卡
    • 虚拟网卡只是起连通虚拟机、宿主机的作用,卸载不影响 虚拟机连通外网
  • 机器网络配置

    • 由于虚拟DHCP服务器的存在,虚拟机无需特殊配置,只需要 启用虚拟机网卡DHCP服务即可

vmware_nat

适用场景

  • 虚拟系统介入互联网简单,不需要其他配置,只需要宿主机能 访问网络即可
  • 网络ip资源紧缺,且需要虚拟机能够联网

网络配置

  • 宿主机服务设置

    • 检查宿主机VMware DHCP ServiceVMware NAT Service 服务是否启动(VMware安装一般默认启动此服务)
  • Virtual Network Eidtor配置

    • VMnet8虚拟交换机默认为NAT模式
    • 配置VMnet8->子网IPVMnet8->子网掩码
    • 配置VMnet8->NAT设置VMnet8->DHCP参数
  • 虚拟机网络配置

    • 编辑虚拟机设置->网络适配器->NAT模式
  • 虚拟机网卡配置

    • NAT虚拟网络有DHCP服务,只需要修改BOOTPRPOTO=dhcp, 使用DHCP协议即可
    • 也可以设置静态ip,但是需要注意要在DHCP范围内

Host-Only

仅主机模式:将虚拟机与外网隔开,使得虚拟机成为独立系统,只和 主机相互通讯

  • 网络结构:类似于NAT模式

    • NAT模式去除了虚拟NAT设备
    • 使用VMware Network Adapter VMnet1虚拟网卡连接宿主机 、VMnet1交换机
    • 虚拟局域网可以认为是单独从属当前宿主机的私有网络
  • 连通性

    • 虚拟机网络、真实网络相互隔离,两者不相互连通
    • 宿主机、虚拟机相互通过虚拟网卡VNAV1相互连接
    • 事实上,可以在宿主机中设置,通过将主机网卡共享给 虚拟网卡VNAV1实现虚拟机联网

vmware_host_only

适用场景

  • 特殊的网络调试环境下,要求真实环境、虚拟环境隔离开

网络设置

  • 虚拟机网络设置

    • 编辑虚拟机设置->网络适配器->Host-only/仅主机模式
  • Virtual Network Eidtor配置:类似于NAT模式,只是VMnet1 虚拟交换机才默认为Host-only模式

  • 虚拟机网卡配置:类似NAT模式

共享宿主机网卡

Host-only模式下下,虚拟局域网默认无法联网,需要将宿主机网卡 共享给给虚拟网卡VNAV8才能实现联网

  • 网络连接->属性->共享->选择VMAV1

  • 共享宿主机网卡可能会要强制修改虚拟网卡VMAV1的ip地址, 需要根据提示在虚拟网络编辑其中修改虚拟网络的DHCP参数 host_only_network_sharing

  • 然后修改虚拟网卡Gateway、DNS为VMAV1的ip地址

Windows Linux Subsystem

说明

WSL是一个兼容层,类似反过来的Wine,但更底层

  • Linux、Windows程序不兼容,是因为二者内核提供的接口不同

    • ls/dir命令
      • 在Linux下调用getdents内核调用
      • 在Windows下调用NtQueryDirectoryFile内核调用
  • WSL提供Linux内核接口,并转换为NT内核接口

    • 在WSL中执行ls仍然调用getdents
    • WSL收到请求,将系统调用转换为NT内核接口 NTQueryDirectoryFile
    • NT内核收到WSL请求,返回执行结果
    • WSL将结果包装后返回
  • 毕相较于真正Linux系统仍然有不足

    • Docker等涉及未实现的内核特性软件如法使用
    • Raw socket相关相关操作容易出错
    • I/O性能相对孱弱

Cygwin对比

wsl_architecture

  • Cygwin提供了完整的POSIX系统调用API(以运行库 Cygwin*.dll形式提供,但是仍然工作在User Mode

    • Cygwin将POSIX系统调用转换为Win32 API(因为其架设在 Win32子系统上),很多内核操作(如:fork)受限于 Win32实现

    • Linux应用程序必须链接到Cynwin*.dll,需要修改源码 重新编译后才能执行,这样应用程序才不会直接请求内核, 而是调用Cygwin运行库,且编译出的可执行文件为 Win32 PE格式封装,只能在Windows下执行

  • WSL中Linux应用程序进程被包裹在Pico Process中,其发出的 所有系统调用会被直接送往Kernel Mode中的 lxcore.syslxss.sys

    • WSL将POSIX系统调用转换为更底层的NP API调用(WSL和 Win32平行,直接架设在NT内核上)

    • 可以直接执行ELF格式封装的Linux可执行程序

启用

  • 控制面板 ->
  • 程序和功能 ->
  • 启用或关闭windows功能 ->
  • 适用于Linux的Windows子系统

其他

使用

进入WSL

除在图形界面中点击图标,以默认参数启动,还可以在terminal (cmd/powershell等)自定义进入WSL参数

  • wsl.exe:打开默认发行版中默认shell
  • distroname.exe:打开指定发行版中默认shell
  • bash.exe:打开默认发行版中bash shell
  • 这些应用程序默认在path中,可以直接执行

版本管理

  • wslconfig.exe可以用于管理多个子系统的发行版

WSL、Windows互操作

文件

  • Windows所有盘符挂载在WSL中/mnt目录下

  • WSL中所有数据存放在%HOME%/AppData/Local/Packages/{linux发行包名}/LocalState/rootfs

    • 不要在Windows下直接修改,造成权限错误

命令

  • 在cmd中直接调用WSL命令
    1
    2
    PS> wsl [-e] ls -al
    // wsl带参数执行
  • 在WSL中调用Windows命令行程序(在$PATH中)

    1
    2
    $ which ipconfig.exe
    $ ipconfig.exe
  • 在WSL中启动Windows应用(在$PATH中)

    1
    $ notepad.exe
  • 通过pipes通信

    1
    2
    $ cat foo.txt | clip.exe
    PS> ipconfig | wsl grep IPv4

端口、环境变量

  • WSL与Windows共享端口(NT内核?)
  • WSL继承Windows的部分环境变量,如:PATH

Terminal推荐

  • wsl-terminal: 专为WSL开发的终端模拟器,基于minttywslbridge,稳定 易用

  • ConEmu:老牌终端模拟器, 功能强大

  • Hyper:基于Electron的跨平台 终端模拟器

WSL-Terminal

  • WSL-Terminal中包含一些快捷工具

    • tools目录中包含一些脚本,可以通过wscripts.exe 执行修改注册列表,添加一些功能
      • 添加WSL中vim、emacs等打开到右键菜单
      • 添加在WSL中打开文件夹到右键菜单
    • run-wsl-file.exe可以用于在快捷执行wsl脚本,只需要 将其选择为文件打开方式
    • vim.exe可以用WSL中vim打开任何文件,当然一般是配合 tools/中脚本在右键注册后使用
  • 配置

    • 配置文件etc/wsl-terminal.conf
    • 主题文件etc/themes/
    • mintty配置文件etc/mintty

其他问题

文件权限问题

  • 在WSL中,windows实现了两种文件系统用于支持不同使用场景

VolFs

VolFs:着力于在windows文件系统上提供完整的linux文件系统特性 ,通过各种手段实现了对InodesDirectory EntriesFile ObjectsFile DescriptorsSpecial File Types 的支持

  • 为支持Inodes,VolFS会把文件权限等信息保存在 NTFS Extended Attributes

    • 在Windows中新建的文件缺少此扩展参数,有些编辑器也会 在保存文件是去掉这些附加参数
    • 所以不要在Windows中修改WSL文件,否则VolFs无法正确 获得文件metadata
  • WSL中/就是VolFs文件系统

DrvFs

DrvFs:着力提供于Windows系统的互操作性,从Windows的文件权限 (即文件->属性->安全选项卡中的权限)推断出文件对应Linux权限

  • 所有windows盘符挂在在WSL中/mnt是都使用DrvFs文件系统

  • 由于DrvFs文件权限继承机制很微妙,结果就是所有文件权限 都是0777

    • 所以ls结果都是绿色的
    • 早期DrvFs不支持metadata,在Build 17063之后支持 文件写入metadata,但是需要重新挂载磁盘
  • 可以通过设置DrvFs metadata设置默认文件权限

    1
    2
    3
    4
    5
    $ sudo umount /mnt/e
    $ sudo mount -t drvfs E: /mnt/e -o metadata
    // 此时虽然支持文件权限修改,但默认权限仍然是*0777*
    $ sudo mount -t drvfs E: /mnt/e -o metadata,uid=1000,gid=1000,umask=22,fmask=111
    // 此时磁盘中默认文件权限为*0644*
  • 更合适的方式是通过/etc/wsl.conf配置DrvFs自动挂载属性

AutoMatically Configuring WSL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 # `/etc/wsl.conf`
[automount]
# 是否自动挂载
enabled = true
# 是否处理`/etc/fstab`文件
mountFsTab = true
# 挂载路径
root = /mnt/
# DrvFs挂载选项,若需要针对不同drive配置,建议使用`/etc/fstab`
options = "metadata,umask=023,dmask=022,fmask=001"
[network]
generateHosts = true
generateResolvConf = true
[interop]
# 是否允许WSL载入windows进程
enabled = true
appendWindowsPath = true
  • 如果需要给不同盘符设置不同挂载参数,需要修改 /etc/fstab

    1
    E: /mnt/e drvfs rw,relatime,uid=1000,gid=1000,metadata,umask=22,fmask=111 0 0