• 鸟哥的linux私房菜


    第五章、在线求助 man page

    X window与文本模式的切换

    Ctrl+Alt+F1~F6:文字接口登入tty1~tty6终端机;

    Ctrl+Alt+F7:图形接口桌面。

    注销当前用户:exit

    文本模式下指令的下达

    开始下达指令

    command [-options] parameter1 parameter2 ...

    说明:
    0. 一行指令中第一个输入的部分绝对是『指令(command)』或『可执行文件案』
    1. command 为指令的名称,例如变换路径的指令为 cd 等等;
    2. 中刮号[]并不存在于实际的指令中,而加入选项设定时,通常选项前会带 -号,例如 -h;有时候会使用选项的完整全名,则选项前带有 -- 符号,例如 --help;
    3. parameter1 parameter2.. 为依附在选项后面的参数,或者是 command 的参数;
    4. 指令, 选项, 参数等这几个咚咚中间以空格来区分,不论几个空格 shell 都规为一格;
    5. 按下[Enter]按键后,该指令就立即执行。[Enter]按键代表着一行指令的开始启劢。
    6. 指令太长的时候,可以使用反斜杠 () 来跳脱[Enter]符号,使指令连续到下一行。
    注意!反斜杠后就立刻接特殊字符,才能跳脱!

    语系的支持

    a. 显示当前语系:echo $LANG

    b. 修改语系为英文语系:$LANG=en_US

    基础指令的操作

    a. 显示日期与时间的指令:data

    b. 显示日历:cal

    c. 计算机:bc  离开bc:quit

    总结,在指令模式下达指令的两种情况:

    a. 该指令会直接显示结果后回到命令提示符等待下一个指令的输入;

    b. 进入到该指令的环境,直到结束指令才回到命令提示符环境。

    重要的几个热点[Tab],[Ctrl]+c,[Ctrl]+d

    Tab:接在一串指令的第一个字后面,为命令补全;接在一串指令的第二个字后面,为档案补齐。

    Ctrl+c:中断正在运行的指令。

    Ctrl+d:键盘输入结束(End of file,EOF 或 End of input);也可取代exit的输入。

    错误讯息察看

    如果下达了错误的指令,可根据屏幕显示的讯息解决问题。

    通常出现[command not found]可能原因:

    a. 指令不存在,因为该软件没安装。解决方法安装该软件。

    b. 指令所在的目录目前的用户并没有将它加入指令搜寻路径中,参考bash的PATH说明。

    c. 打错字。

    Linux系统的在线求助 man page 与 info page

    man page (manul)

    man page 的数据通常放在 .usr/share/man 这个目录。进入man指令后,[空格键]往下翻页,[q]离开man环境。

    man page第一行,指令后面的数字代表的意义:

    man page 内容

    man page 常用按键:

    info page

    查询指令的用法或者档案的格式。info page将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的『超链接』来跳到各不同的页面中,每个独立的页面也被称为一个节点(node)。 所以,你可以将info page想成是文本模式的网页显示数据啦! 

    不过你要查询的目标数据的说明文件必须要以info的格式来写成才能够使用info的特殊功能(例如超链接)。 而这个支持info指令的文件默认是放置在/usr/share/info/这个目录当中的。

    info page 常用按键:

    其他有用的文件(documents): /usr/share/doc 目录下。

    正确关机方法

    开机过程的问题排解

    第六章 Linux的档案权限与目录配置

    使用者和群组: User Group Others

    系统上的账号与一般身份使用者,还有root相关信息:记录在 /etc/passwd 档案中;

    个人密码:纪录在 /etc/shadow 档案中;

    linux所有组名:纪录在 /etc/group。

    Linux档案权限

    Linux文件属性

    显示档案的文件名与相关属性:ls

    列出所有的档案详细的权限与属性 (包含隐藏文件,就是文件名第一个字符为『 . 』的档案):ls -al

    第一栏:档案的类型和权限(permission)
    a. 第一个字符代表这个档案是『目彔、档案或链接文件等等』:
    a1. 当为[ d ]则是目彔
    a2. 当为[ - ]则是档案
    a3. 若是[ l ]则表示为连结档(link file)
    a4. 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置)
    a5. 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次怅读取装置)
    b. 接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。
    b1. 第一组为『档案拥有者的权限』
    b2. 第二组为『同群组的权限』
    b3. 第三组为『其他非本群组的权限』

    第二栏:有多少档名连结到此节点(i-node):
    每个档案都会将他的权限与属性记彔到文件系统的i-node中,不过,我们使用的目彔树却是使用文件名来记彔, 因此每个档名就会连结到一个i-node啰!这个属性记彔的,就是有多少不同的档名连结到相同的一个i-node号码去就是了
    第三栏:档案(或目彔)的『拥有者账号』
    第四栏:档案的所属群组
    第五栏:档案的容量大小,默认单位为bytes
    第六栏:档案的建档日期或者是最近的修改日期
    第七栏:档案的档名(如果档名前多一个『 . 』,则代表这个档案为『隐藏档』)

    如何改变文件属性与权限

    改变所属群组,chgrp

    被改变的组名必须在/etc/group档案内存在,否则报错。

    语法: chgrp [-R] groupname dirname/filename

    -R:进行递归(recursive)的持续变更,即连同次目录下的所有档案/目录都更新为这个群组。常用在要变更某一目录下所有档案。

    eg: chgrp students a.txt

    改变档案的拥有者,chown

    注意:用户必须是已经存在系统中的账号,也就是在 /etc/passwd 档案中有记录的用户名。

    chown 还能顺便修改群组的名称。

    语法: chown [-R] 账号名 档案或目录

          chown [-R] 账号名:组名 档案或目录

    eg: chown user2 test.txt

      chown root:root install.log

    chown 也能单独修改组名: chown :root install.log 或者 chown .root install.log

    when 什么时候需要使用chown 或 chgrp ?常见的是在复制档案给你之外的其他人时。

    语法: cp 来源档案 目标文件

    eg: cp .bashrc .bashrc_test

    复制(cp)会复制执行者的属性和权限。

    改变权限,chmod

    a. 使用类型改变档案权限

    linux档案的基本权限有9个,分别是 owner/group/others 三种身份各有得read/write/execute权限

    语法: chmod [-R] xyz 档案或目录

    eg: 修改 test.txt 的权限为 owner=rwx=4+2+1=7, group=rwx=4+2+1, others=---=0+0+0=0

      chmod 770 test.txt

    我们用 vim 编辑一个shell 的文字批处理文件后,它的权限通常为 -rw-rw-r-- 也就是664,如果将该档案变为可执行文件,并且不要让其他人修改此档案,则需要 -rwxr-xr-x 权限,此时需要下达: chmod 755 test.sh 

    如果有些档案不希望被其他人看见,那么权限应设为 -rwxr----- ,下达: chmod 740 filename

    b. 符号类型改变档案权限

    九个权限分别是(1)user (2)group (3)others三种身份,那我们就可以藉由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那举读写的权限就可以写成r, w, x。

    eg: 设定档案的权限为 -rwxr-xr-x : chmod u=rwx,go=rx test.txt

    增加 test.txt 的每个人的写入权限: chmod a+w test.txt

    去掉全部人的可执行权限: chmod a-x test.txt

    目录与档案权限意义:

    权限对档案的重要性

    档案是实际包有数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件(binary program)等等。 因此,权限对二档案来说,他的意义是这样的:
      r (read):可读取此一档案的实际内容,如读取文本文件的文字内容等;
      w (write):可以编辑、新增戒者是修改该档案的内容(但不含删除该档案);
      x (eXecute):该档案具有可以被系统执行的权限。

    权限对目录的重要性

    目录主要的内容在记录文件名列表,文件名与目录有强烈的关连。所以如果是针对目录时,那个 r, w, x 对目录是什么意义呢?

      r(read contens in directory): 具有读取目录结构列表的权限。当你具有读取(r)一个目录的权限时,你可以查询该目录下文件名数据。所以可以用 ls 指令将目录的内容列表显示出来。

      w(modify contents of directory): 表示你具有异动该目录结构列表的权限:

        建立新的档案和目录;

        删除已经存在的档案与目录(无论该档案的权限为何);

        将已经存在的档案或目录进行更名;

        搬移该目录内的档案或目录位置。

      x(access directory): 用户能否进入该目录称为工作目录(用 cd 进入该目录)。

    要开放目录给任何人浏览时,至少也要r和x权限,但w权限不能随便给。

    linux档案种类与扩展名

    档案种类

    正规档案(regular file):第一个字符为 - 

    a.纯文本档(ASCII)

    b.二进制文件(binary)

    c. 数据格式文件(data)  

    目录(directory):第一个字符为 d

    连接档(link):类似windows下的快捷方式。第一个属性为 l

    设备与装置文件(device): 与系统周边存储等相关的一些档案,通常集中在 /dev 目录。通常又分为两种:

      区块(block)设备档 :就是一些储存数据, 以提供系统随机存取的接口设备,举例来说,硬盘不软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种装置就是成组设备。你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ];

      字符(character)设备文件:亦即是一些串行端口的接口讴备, 例如键盘、鼠标等。这些设备的特色就是『一次性读取』的,不能够截断输出。举例来说,你不可能让鼠标『跳到』另一个画面,而是『滑劢』到另一个地方啊!第一个属性为 [ c ]。

    资料接口文件(sockets): 这种类型的档案通常被用在网络上的数据承接了。我们可以启动一个程序来监听客户端的要求, 而客户端就可以透过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/var/run这个目彔中看到这种文件类型。

    数据输送文件(FIFO, pipe): FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个档案所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为[p] 。

    linux目录配置

    linux目录配置的依据——FHS(Filesystem Hierarchy Standard):规范每个特定的目录下应该要放置什么样的数据。

    亊实上,FHS是根据过去的经验一直再持续的改版的,FHS依据文件系统使用的频繁与否 与 是否允讲使用者随意更劢, 而将目彔定义成为四种交互作用的形态,用表格来说有点像底下这样:

    亊实上,FHS针对目彔树架构仅定义出三层目彔底下应该放置什么数据而已,分别是底下这三个目彔的定义:
    a. / (root, 根目彔):与开机系统有关;
    b. /usr (unix software resource):与软件安装/执行有关;
    c. /var (variable):与系统运作过程有关。

    根目录(/)的意义与内容

    FHS标准建议:根目彔(/)所在分割槽应该越小越好, 且应用程序所安装的软件最好不要与根目彔放在同一个分割槽内,保持根目彔越小越好。 如此不但效能较佳,根目彔所在的文件系统也较不容易发生问题。
    FHS定义出根目彔(/)底下应该要有底下这些次目彔的存在才好:

    亊实上FHS针对根目彔所定义的标准就仅有上面的,不过我们的Linux底下还有讲多目彔你也需要了解一下的。 底下是几个在Linux当中也是非常重要的目彔:

    根目彔下与开机过程有关的目彔, 就不能够与根目彔放到不同的分割槽去:
      /etc:配置文件
      /bin:重要执行档
      /dev:所需要的装置档案
      /lib:执行档所需的函数库与核心所需的模块
      /sbin:重要的系统执行文件

    /usr 的意义不内容:

    依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动的(shareable, static), 如果你知道如何透过网络进行分割槽的挂载(例如在朋务器篇会谈到的NFS朋务器),那举/usr确实可以分享给局域网络内的其他主机来使用。

    很多读者都会误会/usr为user的缩写,其实usr是Unix Software Resource的缩写, 也就是『Unix操作

    系统软件资源』所放置的目彔,而不是用户的数据。 FHS建议所有软件开发者,应该将他们的数据合理的分别放置到这个目彔下的次目彔,而不要自行建立该软件自己独立的目彔。

    因为是所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr底下,因此这个目彔有点类似Windows 系统的『C:Windows + C:Program files』这两个目彔的综合体,系统刚安装完毕时,这个目彔会占用最多的硬盘容量。 一般来说,/usr的次目彔建议有底下这些:

    /var 的意义与内容:

    如果/usr是安装时会占用较大硬盘容量的目彔,那么/var就是在系统运作后才会渐渐占用硬盘容量的目彔。 因为/var目彔主要针对常态性变动的档案,包括快取(cache)、登彔档(log file)以及某些软件运作所产生的档案, 包括程序档案(lock file, run file),或者例如MySQL数据库的档案等等。常见的次目彔有:

    针对FHS,各家distributions的异同

    目录树(directory tree)

    在Linux底下,所有的档案不目彔都是由根目彔开始的。那是所有目彔与档案的源头~ 然后再一个一个的分支下来,有点像是树枝状,因此,我们也称这种目彔配置方式为:『目彔树(directory tree)』 这个目彔树有什举特怅呢?他主要的特性有:
      目彔树的启始点为根目彔 (/, root);
      每一个目彔不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说, 可以利用 Network File System (NFS) 朋务器挂载某特定目彔等。
      每一个档案在此目彔树中的文件名(包含完整路径)都是独一无事的。

    CentOS的观察

    察看distribution 使用的是那个 Linux 标准 (Linux Standard Base)

    语法: uname -r

    第七章: Linux档案与目录管理

    目录与路径

     目录的相关操作:

    特殊目录:

      . 此层目录

      .. 上一层目录

      - 前一个工作目录

      ~ 目前用户身份所在的home目录

      ~account account这个用户的home目录(account是账号名)

    cd(change directory) 变换目录

    语法: cd 相对路径或绝对路径

    eg: cd ~user1  代表/home/user1

      cd ~  代表回到用户的home目录

      cd   代表回到用户的home目录

      cd ..  代表回到上层目录

      cd -  代表回到刚刚那个目录

    pwd(Print Working Direcroty) 显示目前所在目录

    语法: pwd [-P]

      -P : 显示出确实的路径,而非使用链接(link)路经。

    mkdir(make directory) 建立新目录

    语法: mkdir [-mp] 目录名称

      -m : 配置文件的权限。直接设定,不需要看预设(umask)的脸色

      -p : 将所需目录递归建立

    eg: mkdir -p test1/test2

      mkdir -m 711 test1

    rmdir(remove dierctory) 删除 空 目录

    语法: rmdir [-p] 目录名称

      -p : 连同上层 空的 目录也一起删除

    关于执行文件路径的变量: $PATH

    查询文件属性的指令 ls 完整的文件名为: /bin/ls 。为什么在任何目录输入 ls 就一定可以显示出一些信息,而不会是找不到该指令呢? 这是因为环境变量 PATH 所致。

    当我们在执行指令时,比如 ls ,系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为 ls 的可执行文件,如果有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行。

    下达 [echo $PATH] 察看PATH下定义的目录。

    档案与目录管理:

    档案与目录的检视: ls

     

    复制 删除与移动: cp rm mv

    cp(复制档案或目录)

    不同身份者执行这个指令会有不同的结果产生,尤其是 -a, -p 选项,对于不同身份,差异非常大。

    cp的功能很多。如果我们去复制别人的数据(必须有read权限)时,总是希望复制到的数据最后是我们自己的,所以,在预设的条件中,cp的来源与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。

    由于具有这个特性,因此当我们进行备份时,某些需要特别注意的特殊权限档案,例如密码文件(/etc/shadow)以及一些配置文件,就不能直接以cp来复制,必须加上 -a 或者 -p 等可以完整复制档案权限的选项。如果想要复制档案给其他的使用者,必须注意档案的权限,否则,其他人无法针对你给的档案进行修订动作。

    由于cp 的文件属性与权限的特性,所以,在复制时,必须清楚了解:

      是否需要完整的保留来源档案的信息?

      来源档案是否为联结档(symbolic link file)?

      来源档是否为特殊档案,例如 FIFO, socket?

      来源文件是否为目录?

    rm 移出档案或目录

    指令前加上反斜杠,可以忽略掉 alias 的制定选项。

    避免首字符为"-",加上本目录 [rm ./-test.txt] 即可。[rm -- -text.txt] 也可以。

    mv 移动档案或目录,或更名

    取得路径的文件名与目录名称

    档案内容查询:

    直接检视档案内容

    直接查阅档案的内容可以使用 cat/tac/nl。

    cat (concatenate 连续):

    主要功能是将一个档案的内容连续打印在屏幕上。

    tac 反向显示

    cat 第一行到最后一行连续显示, tac 最后一行到第一行连续显示。

    nl 添加行号打印

    可翻页检视

    前面提到的nl与cat,tac等,都是一次性将数据一口气显示到屏幕上面,那有没有可以进行一页一页翻动的指令呢?让我们可以一页一页的观察,才不会前面的数据看不到,有的那就是
    more 与 less

    more 一页一页翻动

    语法: more 档案

    在more这个程序运行过程中,有几个按键可以用:

      空格键(space):向下翻一页;

      Enter : 向下翻一行;

      /字符串 : 在这个显示的内容中,向下搜寻【字符串】这个关键字;

      :f : 立刻显示出文件名以及目前显示的行数;

      q :立刻离开 more , 不再显示该档案的内容;

      b 或 ctrl+b :往回翻页,不过这个动作只对档案有用,对管线无用。

    less 一页一页翻动

    less 的用法比 more 更有弹性。man 这个指令就是呼叫 less 来显示说明文件的内容。

    less 常用按键:

      空格键 :向下翻动一页;

      [pagedown]:向下翻动一页;

      [pageup] :向上翻动一页;
      /字符串 :向下搜寻『字符串』的功能;
       ?字符串 :向上搜寻『字符串』的功能;
       n :重复前一个搜寻 (不 / 戒 ? 有关!)
       N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
       q :离开 less 这个程序;

    资料撷取

     我们可以将输出的资料作一个最简单的撷取,那就是取出前面 (head)与取出后面(tail)文字的功能。不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取的。

    head 取出前面几行

    语法:head [-n number] 档案

      -n :后面接数字,代表显示几行。如果没有此选项,默认显示10行。

    tail 取出后面几行

    eg:显示 /etc/man.config 的第11到第20行?  head -n 20 /etc/man.config | tail -n 10

    非纯文本文档:od

    可以将data file或者binary file的内容数据读取出来。

     修改档案时间或建立新档案:touch

    每个档案在linux底下都会记录许多时间参数,有三个主要的变动时间:

    modification time (mtime) : 当档案的内容数据变更时,会更新这个时间。内容数据指档案的内容,而不是档案的属性或权限。

    status time (ctime) : 当该档案的状态(status)改变时,更新该时间。比如权限或属性的修改。

    access time (atime) : 当该档案的内容被取用时,更新这个读取时间(access)。比如使用cat读取 /etc/man.config。

    eg: ls -l /etc/man.config  默认显示的是mtime

      ls -l --time=atime /etc/man.config

      ls -l --time=ctime /etc/man.config

    如果发现一个档案来至未来,如何修改让该档案的时间变成现在呢?

    touch指令最常被使用的情况:

      建立一个空档案;

      将某个档案日期修订为目前(mtime 和 atime)

    档案与目录的默认权限与隐藏权限

    档案预设权限:umask

    档案隐藏属性:

    档案特殊权限:SUID, SGID, SBIT

    查看文件类型:file

    eg: file ~/.bashrc

    指令与档案的搜寻:

    脚本文件名的搜寻:

    which 寻找【执行档】:指令根据PATH环境变量规范的路径,去搜寻【执行档】的档名

    语法:which [-a] command

      -a : 将所有由PATH目录中可以找到的指令均列出,而不止第一个被找到到的指令名称

    档案档名的搜索:

    通常 find 不很常用。因为
    速度慢之外, 也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,
    才以 find 来搜寻! 为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快
    速,而且并没有实际的搜寻硬盘, 比较省时间。

    whereis 寻找特定的档案

    locate

    find

    第九章、档案与文件系统的压缩和打包

    Linux系统常见的压缩指令:

    常见压缩为键扩展名:

    Linux上常见的压缩指令为 gzip 和 bzip2。这些指令通常仅能针对一个档案来压缩与解压缩,如此一来,每次压缩与解压缩都要一大堆档案。此时,【打包软件,tar】就显得很重要。tar 可以将很多档案打包成一个档案。不过,单纯的 tar 功能仅是打包,并没有提供压缩功能,后来,GNU计划中,将整个tar与压缩功能结合在一起,提供更方便更强大的压缩和打包功能。

    compress

    eg: compress -v /tmp/etc/man.config  在预设情况下,被compress压缩的源文件不见,压缩文件被建立

      umcompress man.comfig.Z  解压后,压缩文件不见

    如果想要保留源文件又要建立压缩文件,可以使用 -c 语法:

    -c 选项,会将压缩过程的数据输出到屏幕上,而不是写成 *.Z 的压缩文件。所以可以通过数据流重导向的方法将数据输出为另一个档名。

    eg: compress -c man.config > man.config.back.Z 

    gzip, zcat

    gzip可以解开 compress, zip, gzip 等软件压缩的档案。gzip建立的压缩文件为 *.gz 档名。

    zcat可以读取纯文本文档被压缩后的压缩文件。

    bzip2, bzcat

    打包指令:tar

    tar

    其实最简单的使用 tar 就只要记忆底下的方式即可:
      压 缩:tar -jcv -f filename.tar.bz2 要被压缩的档案或目录名称
      查 询:tar -jtv -f filename.tar.bz2
      解压缩:tar -jxv -f filename.tar.bz2 -C 欲解压缩的目录

    那个 filename.tar.bz2 是我们自己取的档名,tar 并不会主劢产生建立的档名。我们要自定义,
    所以扩展名就显的很重要了!如果不加 [-j|-z] 的话,档名最好取为 *.tar 即可。如果是 -j 选顷,代表有
    bzip2 的支持,因此档名最好就取为 *.tar.bz2 ,因为 bzip2 会产生 .bz2 癿扩展名。如果是
    加上了 -z 的 gzip 的支持,那档名最好取为 *.tar.gz。

    另外,由于『 -f filename 』是紧接在一起癿,过去很多文章常会写成『-jcvf filename』,这样是对
    的, 但由与选顷的顺序理论上是可以变换的,所以很多读者会认为『-jvfc filename』也可以~事实
    上这样会导致产生的档名变成 c ! 因为 -fc ,所以,建议您在学习 tar 时,将『 -f filename 』与
    其他选顷独立出来,会比较不容易发生问题。

    eg: tar -jpcv -f /root/etc.tar.gz /etc  使用tar加入 -j 或 -z 参数备份 /etc/ 目录

      tar -jtv -f /root/etc.tar.bz2  查看tar档案的数据内容(可查看文件名),,与备份文件名有否根目录

      tar -jxv -f /root/etc.tar.bz2  将备份的数据解压缩

      tar -jxv -f /root/etc.tar.bz2 -C /tmp  将数据解压缩到指定目录

    仅解开单一档案的方法

    打包某目录,但不包含该目录下的某些档案

    仅备份比某个时刻还要新的档案

    特殊应用:利用管线命令和数据流

    完整备份工具:dump

  • 相关阅读:
    java解决跨域
    时间格式化
    base64图片实现文件上传
    java对Base64图片的加密解密
    A5/web项目连接Oracle 12c数据库报:ORA-01017: 用户名/口令无效
    JavaScript中call如何使用?
    C# 如何让new 出来的form显示在最外层?
    因为数据库和客户端字符集不一样原因,导致显示乱码???????,解决办法
    日语键盘按键修正记录
    keybd_event 在F按键系列不起作用的解决办法
  • 原文地址:https://www.cnblogs.com/skorzeny/p/6551478.html
Copyright © 2020-2023  润新知