暂时未有相关云产品技术能力~
1、使用场景让本地局域网的跑的应用可以被外网访问2、常用内网穿透工具能实现内网穿透的工具也挺多,下面列出了几个Ngrok 一个通过任何NAT或防火墙为您的本地主机服务器提供即时访问、安全的URL的命令。类似花生壳,分为服务端和客户端,也可以自己搭建服务端(也是我们今天采用的工具)Ssh、autosshNatapp:基于ngrok的国内收费内网穿透工具,类似花生壳Frp :frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。Lanproxy :lanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿透工具,目前仅支持tcp流量转发Spike :Spike是一个可以用来将你的内网服务暴露在公网的快速的反向代理,基于ReactPHP,采用IO多路复用模型。采用Php实现花生壳:比较稳定,收费贵,一般都是企业使用3、Ngrok免费实现内网穿透3.1. 注册、并登陆账号官方地址:http://www.ngrok.cc/3.2. 开通隧道我们注册好账号后登陆后可以看到如下首页界面在右侧菜单栏选择隧道管理–》开通隧道。这里呢我们选择免费的,找到如下图所示服务器并点击购买,如果要绑定域名的话就需要根据需要购买对应服务器3.3. 填写隧道相关信息当我们点击上一步选择购买的服务器之后,会跳转到如下隧道信息填写界面。填写好相关信息3.4. 下载客户端工具上一步我们填写隧道信息并开通之后,会跳转到隧道管理页面。此页面会有一个客户端下载链接地址。如下图所示3.5. 解压下载的客户端工具,并运行批处理启动找到下载的客户端工具并解压,双击运行批处理文件【Sunny-Ngrok启动工具.bat】启动双击之后会到一个启动界面,如下我们找到刚才开通的隧道id,并将id填入3.6. 查看启动状态接上一步回车之后如果出现如下界面则证明启动成功3.7. 建立web应用,并启动本地服务怎么建立web应用这里就不细说了,可以参考idea环境下建立web应用本地访问:http://localhost:8080/web/hello外网访问:http://xiezr.free.idcfengye.com/web/hello大功告成!!!
前言上一篇中已经预告,我们这篇主要说一说Linux中用户相关的命令。可能各位小伙伴用的Windows会比较多一点,在Windows操作系统中,我们知道有Administrator用户,Administrator 是Windows系统中的管理员用户,有着最高的权限。用户登录Administrator后可以创建Gust等用户,修改密码并且给Gust用户分配相应的权限。同样的在Linux中,root就相当于Administrator用户,具有着最高权限。登录root 用户可以创建用户、修改用户密码、给用户分配角色等等。下面思维导图中列出了我们需要掌握的19个命令useradd 创建用户1、简介useradd 命令用户创建新的用户或者更改用户信息2、原理3、语法格式useradd [参数选项] [用户名] 或 useradd -D [参数选项] 4、参数说明① 不加选项-D参数参数选项参数说明-c comment加上备注信息,会保存到passwd备注栏中(第五列)-d home_dir新用户每次登录时使用的家目录-e expire_date用户终止日期-f inactive_days用户过期几日后永久停权-g initial_group指定用户对应的用户组。用户组必须是系统现在已存在的名词-G group,[…]定义此用户为多个不同组的成员。每个用户组使用逗号(,)分割-m用户目录如不存在则自动建立-M不建立家目录,优先于、etc/login.defs文件设定。【创建虚拟用户时一般不需要建立家目录,部署应用服务时则需要创建虚拟用户】n默认情况下用户的用户组和用户名称是相同的。通过该参数,就不会生成与用户名一样的用户组了-s shell用户登录后使用的Shell名称。默认不填写,系统会使用配置文件(/etc/default/useradd)中的预设值-u uid用户ID值。这个值是唯一的② 加-D选项参数参数选项参数说明-b defalut_home定义用户家目录的基本目录,当用户家目录不存在时,此目录将作为家目录生效-e defalut_expire_date用户账号停止日期-f defalut_inactive用户过期几日后停权-g defalut_group新用户起始用户组名或ID。用户组名必须为现已存在的名称-s default_shell用户登录后使用Shell名称5、实践操作① 不加任何参数添加用户# 创建xiezhrspace 用户 [root@xiezhr ~]# useradd xiezhrspace # /home/ 路径下新生成一个xiezhrspace 目录。这个就是xiezhrspace用户的家目录 [root@xiezhr ~]# ls -ld /home/xiezhrspace drwx------ 2 xiezhrspace xiezhrspace 4096 Aug 29 23:05 /home/xiezhrspace 在前面我们说过创建一个新用户会在/etc/shadow、/etc/group 和/etc/gshsdow 文件中生成相关信息,具体是不是这样的呢?我们去看一看(●’◡’●)# 在创建用户时候没有指定密码,但是shadow还是生成了一行信息 [root@xiezhr ~]# grep -w xiezhrspace /etc/shadow xiezhrspace:!!:19233:0:99999:7::: # 创建用户时,默认会创建与用户名同名的用户组 [root@xiezhr ~]# grep -w xiezhrspace /etc/group xiezhrspace:x:1002: #组密码文件中也会增加一条信息 [root@xiezhr ~]# grep -w xiezhrspace /etc/gshadow xiezhrspace:!:: ② 创建一个组,并将新建用户归于这个组# 创建一个gid 为808 的用户组 [root@xiezhr ~]# groupadd -g 808 xiezhrgroup # 创建一个uid为908的用户xietest,并将用户归于xiezhrgroup组 [root@xiezhr ~]# useradd -g xiezhrgroup -u 908 xietest # 查看用户信息 [root@xiezhr ~]# id xietest uid=908(xietest) gid=808(xiezhrgroup) groups=808(xiezhrgroup) ③ -M -s参数的使用(在生产环境中部署Nginx、MySQL等服务经常使用)# -M 不创建见目录 # -s 指定登录后的Shell # /sbin/nologin 表示禁止登陆 [root@xiezhr ~]# useradd -M -s /sbin/nologin xiaofang [root@xiezhr ~]# ls -ld /home/xiaofang ls: cannot access /home/xiaofang: No such file or directory [root@xiezhr ~]# grep -w xiaofang /etc/passwd xiaofang:x:1003:1003::/home/xiaofang:/sbin/nologin /etc/passwd 文件说明xiaofangx10031003/home/xiaofang/sbin/nologin用户名称账号密码账号UID账号组GID用户说明用户家目录shell解释器usermod 修改用户信息1、简介usermod 命令用于修改系统已经存在的用户账号信息2、语法格式usermod [参数选项] [用户名]3、参数选项参数参数说明-c comment修改用户password文件中用户的说明栏,与useradd -c 功能相同-d home_dir修改用户的家目录 与useradd -d 功能相同-e expire_date修改用户终止日期 与useradd -e 功能相同-f inactive_days修改用户过期后几日永久停权 与useradd -f 功能相同-g initial_group修改用户对应的用户组 与useradd -g 功能相同-G group,[…]修改此用户为多个不同组的成员 与useradd -G功能相同-m用户目录如果不存在则自动建立-M不建立用户家目录。一般创建虚拟用户时不建立家目录。不是nginx、redis等服务是需要创建虚拟用户-n默认情况下,用户的用户组与用户的名称相同-s shell修改用户登入后使用的Shell名称 与useradd -s 功能相同-u uid修改用户的ID值 与useradd -u 功能相同-a追加用户到用户组 仅与-G参数连用-l修改用户账号名称-L锁定用户密码,不让用户改密码-U解除密码锁定4、实践操作将前面创建的xiezhr 用户的用户注释修改为“测试用户”,UID 修改为888,归属修改为用户组root、xiezhr 成员,其Shell类型为/sbin/nologin,设置家目录为/home/xiezhr 用户过期时间为2022-10-02 ,过期后15天停权[root@xiezhr ~]# usermod -u 888 -s /sbin/nologin -c "测试用户" -G root -e "2022/10/02" -f 30 -d /home/xiezhr xiezhr [root@xiezhr ~]# grep -w xiezhr /etc/passwd xiezhr:x:888:1001:测试用户:/home/xiezhr:/sbin/nologin [root@xiezhr ~]# id xiezhr uid=888(xiezhr) gid=1001(xiezhr) groups=1001(xiezhr),0(root) [root@xiezhr ~]# grep -w xiezhr /etc/shadow xiezhr:!!:19233:0:99999:7:30:19267: [root@xiezhr ~]# chage -l xiezhr Last password change : Aug 29, 2022 Password expires : never Password inactive : never Account expires : Oct 02, 2022 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 userdel 删除用户1、简介userdel 命令用户删除指定的用户及与该用户相关的文件2、语法格式userdel [参属选项] [用户名]3、参数选项参数参数说明-f强制删除用户,即使用户当前登录-r删除用户的同时,删除与用户相关的所有文件4、实践操作① 不加参数删除用户[root@xiezhr home]# tail -4 /etc/passwd xiezhr:x:888:1001:测试用户:/home/xiezhr:/sbin/nologin xiezhrspace:x:1002:1002::/home/xiezhrspace:/bin/bash xietest:x:908:808::/home/xietest:/bin/bash xiaofang:x:1003:1003::/home/xiaofang:/sbin/nologin [root@xiezhr home]# ll /home/xietest/ -ld drwx------ 2 xietest xiezhrgroup 4096 Aug 29 23:16 /home/xietest/ [root@xiezhr home]# userdel xietest [root@xiezhr home]# grep -w xietest /etc/passwd [root@xiezhr home]# ll /home/xietest/ -ld drwx------ 2 908 xiezhrgroup 4096 Aug 29 23:16 /home/xietest/ ② 加 -r 参数删除用户及加目录[root@xiezhr home]# ls -ld /home/xiezhr001/ drwx------ 2 xiezhr001 xiezhr001 4096 Sep 4 19:50 /home/xiezhr001/ [root@xiezhr home]# grep -w xiezhr001 /etc/passwd xiezhr001:x:1005:1005::/home/xiezhr001:/bin/bash [root@xiezhr home]# userdel -r xiezhr001 [root@xiezhr home]# grep -w xiezhr001 /etc/passwd [root@xiezhr home]# ls -ld /home/xiezhr001/ ls: cannot access /home/xiezhr001/: No such file or directory 注意在实际工作中,尽量不要使用userdel删除用户,只需要在/etc/passwd里注释用户就可以了。在使用**-r**参数一定要慎重,-r参数会将家目录下所有文件和目录都删除,该过程是不可逆的groupadd 创建新的用户组groupadd 用于创建新的用户组。实际工作中一般也不用,因为useradd命令在创建用户的时候也会创建一个同名的用户组2、语法格式groupadd [参数选项] [用户组]3、参数选项参数参数说明-g gid指定用户组的gid,除非接-o参数,否则ID值唯一且不为负,如果不指定-g参数,则gid从500开始-f新增一个账户,强制覆盖一个已存在的组账号4、实践操作指定gid添加用户组# 添加GID为123的test1用户组 [root@xiezhr ~]# groupadd -g 123 test [root@xiezhr ~]# tail -l /etc/group test:x:123: [root@xiezhr ~]# tail -l /etc/gshadow test:!:: groupdel 删除用户组1、简介groupdel 命令用户删除指定的用户组,一般不用2、语法格式groupdel [用户组]3、实践操作删除test用户组[root@xiezhr ~]# groupdel test [root@xiezhr ~]# grep -w test /etc/grouppasswd 修改用户密码1、简介passwd 命令用于修改用户密码及密码过期使劲啊等,工作中会经常用到。普通用户和超级用户都可以运行passwd命令,普通用户只能更改自身密码,超级用户root则可以设置或修改所有用户的密码2、语法格式passwd [参数选项] [用户名]3、参数选项参数参数说明-k为密码已经过期的用户更新有效期-l锁定用户,被锁定的用户不能登录。仅root用户有此权限–stdin从标准输入读取密码字符串-u解除对用户的锁定,仅root用户有此权限-d删除用户密码,使密码为空。仅root用户有此权限-e是用户密码立即过期,将用户下次登录时强制要求用户修改密码。仅root用户有此权限-n设置修改该密码的最短天数 。仅root用户有此权限-x设置修改密码的最长天数。仅root用户有此权限-w设置用户在密码过期前收到警告信息的天数。仅root用户有此权限-i设置密码过期多少天后禁用账户。仅root用户有此权限-S显示用户密码相关的简单描述。仅root用户有此权限4、实践操作① 修改用户自身密码[root@xiezhr ~]# passwd # 修改root用户自身密码 Changing password for user root. New password: # 输入修改的密码,系统不会显示 Retype new password: # 再次输入密码 passwd: all authentication tokens updated successfully. # 设置成功了 ② 设置及修改普通用户密码[root@xiezhr ~]# passwd xiezhr Changing password for user xiezhr. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. ③ 显示账号密码信息[root@xiezhr ~]# passwd -S xiezhr xiezhr PS 2022-09-05 0 99999 7 30 (Password set, MD5 crypt.) ④一条命令修改密码[root@xiezhr ~]# echo "123456"|passwd --stdin xiezhr Changing password for user xiezhr. passwd: all authentication tokens updated successfully. ⑤ 设置xiezhr用户7天内不能更改密码,60天以后必须修改密码,过期10天通知用户,过期30天后禁止用户登录[root@xiezhr ~]# passwd -n 7 -x 60 -w 10 -i 30 xiezhr Adjusting aging data for user xiezhr. passwd: Success chage 修改用户密码有效期1、简介chage 命令用于查看或修改用户密码有效期2、语法格式chage [参数选项] [用户名]3 、参数选项参数参数说明-d设置上一次密码更改的日期-E账号过期的日期。日期格式:YYYY-MM-DD-I设置密码过期多少天后禁用账户-l显示账号有效期信息-m密码可更改的最小天数。默认为0,即任何时候都可以修改-M密码保持有效的最大天数-W密码到期前,提前收到警告信息天数4、实践操作设置xiezhr用户7天内不能更改密码,60天以后必须修改密码,过期10天通知xiezhr 用户,过期30天后禁止用户登录[root@xiezhr ~]# chage -m 7 -M 60 -W 10 -I 30 xiezhr批量更新用户密码1、简介chpasswd 命令用于从标准输入中读取一定格式的用户名、密码来批量更新用户的密码,格式为“用户名:密码“2、语法格式chpasswd [参数选项]3、参数选项参数参数说明-c默认格式是明文密码,使用-e参数则需要加密的密码4、实践操作批量修改密码[root@xiezhr ~]# chpasswd # 输入chpasswd后,回车 xiezhr:123456 # 格式为用户名:密码 testxiezhr:123456 # 一行一个 # 新行按Ctrl+D 结束 su 切换用户1、简介su 命令用户将当前用户切换到指定用户或以指定用户的身份执行命令或程序2、语法格式su [参数选项] [用户名]3、参数选项参数参数说明-, -l, --login切换用户的同时,将用户的家目录/系统环境等重新按切换后的用户初始化-c向Shell 传递单个命令4、实践操作① 切换到普通用户# 切换到testxiezhr用户,不用输入密码即可切换 [root@xiezhr ~]# su - testxiezhr ②切换到root用户# 虽然已经切换到了root用户,但是家目录还是testxiezhr。环境变量还是testxiezhr用户的,**这种切换问题很严重** [testxiezhr@xiezhr ~]$ su root Password: # 普通用户切换到root用户需要输入密码 [root@xiezhr testxiezhr]# pwd /home/testxiezhr # 正确切换方式 [root@xiezhr testxiezhr]# exit exit [testxiezhr@xiezhr ~]$ su - root Password: # 需要输入密码 Last login: Mon Sep 5 21:13:39 CST 2022 on pts/3 [root@xiezhr ~]# pwd /root 注意:[x] “su 用户名” 虽然能切换到对应用户,但切换后的环境变量信息还是切换之前用户的[√] ** ”su - 用户名“ 不但可以切换到对应用户,还能将环境变量一起切换**visudo 编辑sudoers文件1、简介visudo命令是专门用来编辑 /etc/sudoers这个文件的,同时提供语法检查等功能。 /etc/sudoers文件是sudo命令的配置文件。sudo命令在下一个命令你会看到。而为什么不用vi/vim来直接编辑/etc/sudoers文件呢? 因为如果使用vim 编辑sudoer文件时没有语法校验,编辑错了会导致授权无法生效2、语法格式visudo [参数选项] 3、参数选项参数参数说明-c手动执行语法检查4、实践操作①将xiezhr用户提权为root身份,testxiezhr 用户具有添加和删除用户的权限# 以下命令相当于 vim /etc/sudoers 进行编辑sudoers文件 [root@xiezhr ~]# visudo #在/etc/sudoers 文件中添加如下权限 xiezhr ALL=(ALL) ALL # 此行时将xiezhr用户提权为root身份 testxiezhr ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel # 授予可以以root身份添加和删除用户权限 上面操作说明待授权的用户或组机器=(授权角色)可以执行的命令testxiezhrALL=(ALL)/usr/sbin/useradd,/usr/sbin/userdel② 通过-c参数校验语法是否正确通过① 我们已经对xiezhr用户和testxiezhr用户做了不同的授权,那么怎么判断授权的语法是否正确呢[root@xiezhr ~]# visudo -c /etc/sudoers: parsed OK /etc/sudoers.d/90-cloud-init-users: parsed OK 直接root用户下操作不就可以了么?为什么要通过sudo授权呢?我们希望一个用户具有root权限去干活,但是又不希望这个用户威胁系统安全。sudo 以另一个用户身份执行命令1、简介sudo 命令可以让普通用户拥有超级用户的权限去执行指定的命令或程序。普通用户不需要知道root密码就可以得到授权,授权我们在上面已经说过2、语法格式sudo [参数选项]3、参数选项参数参数说明-l列出当前用户可以执行的命令。只有在sudoers 文件里的用户才能使用该选项-h列出使用方法,并退出-H将环境变量中的HOME(家目录)指定为要变更身份的使用者家目录-V显示版本信息,并退出-vsudo在第一次执行时,或者在N分钟内没有执行,则会询问密码,参数用于重新做一次确认-u以指定用户的身份执行命令-k清除时间戳上的实践,下次再次使用sudo时要再此输入密码-K与k类似,同时还删除时间戳文件-b在后台执行指定命令-p更改询问密码时的提示语-e不执行命令,而是修改文件,相当于sudo edit4、sudo 工作原理5、实践操作创建一个testuser 用户,并对testuser进行sudo授权管理。授权完成后sudo操作# 1、创建testuser 用户 [root@xiezhr ~]# useradd testuser # 2、将testuser 用户密码修改为****** [root@xiezhr ~]# passwd testuser Changing password for user testuser. New password: BAD PASSWORD: The password is shorter than 8 characters Retype new password: passwd: all authentication tokens updated successfully. # 3、执行以下命令后添加 `testuser ALL=(ALL) ALL ` 对testuser用户进行sudo授权 参照下图 [root@xiezhr ~]# visudo testuser ALL=(ALL) ALL # 4、登录testuser 用户,查看 当前用户被授予的sudo权限集合 [testuser@xiezhr ~]$ sudo -l Matching Defaults entries for testuser on xiezhr: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User testuser may run the following commands on xiezhr: (ALL) ALL # 5、登录testuser用户,执行ls /root 发现时没有权限的 [testuser@xiezhr ~]$ ls /root ls: cannot open directory /root: Permission denied # 6、当加上sudo 后 再执行ls /root (第一次需要输入testuser用户密码,上面原理图介绍过),发现可以访问/root 路径了,此时testuser 具有了 [testuser@xiezhr ~]$ sudo ls /root We trust you have received the usual lecture from the local System Administrator. It usually boils down to these three things: #1) Respect the privacy of others. #2) Think before you type. #3) With great power comes great responsibility. [sudo] password for testuser: bdcdb84c414c2493e5856597b89be9f0.gif 6、 sudo 小结对用户进行sudo授权后,所有用户执行命令 格式为 sudo + [命令]sudo - l 命令可以查看当前用户被授予的sudo权限集合当我们在授权用户下执行sudo时,如果需要输入密码。此时输入密码是当前用户的密码id 显示用户与用户组信息1、简介id 命令可以显示指定用户的ID(UID)和组ID(GID)等有效信息2、语法格式id [参数选项] [用户名]3、参数选项参数参数说明-g显示用户所属群组的ID-G显示用户所属附加群组的ID-n显示用户,所属群组或附加群组的名称-r显示实际ID-u显示用户ID4、实践操作显示用户的UID和GID# id 后不跟用户,默认时当前登录用户 [root@xiezhr home]# id uid=0(root) gid=0(root) groups=0(root) # 显示指定用户信息 [root@xiezhr home]# id testxiezhr uid=1006(testxiezhr) gid=1006(testxiezhr) groups=1006(testxiezhr) # 显示当前登录用户名称 [root@xiezhr home]# id -gn root # 显示当前登录用户GID [root@xiezhr home]# id -g 0 # 显示当前登录用户UID [root@xiezhr home]# id -u 0 w 显示已登录用户信息1、简介w命令可以显示已经登录系统的用户,并显示用户正在执行的命令2、语法格式w [参数选项] [用户]3、参数选项参数参数说明-h不显示前两行标题信息-u忽略执行程序的名称以及CPU时间信息-s使用短输出格式4、实践操作① 显示已登录用户信息[testuser@xiezhr ~]$ w 21:21:42 up 609 days, 7 min, 4 users, load average: 2.66, 2.99, 3.17 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 39.130.60.62 20:33 48:22 0.02s 0.02s -bash root pts/1 39.130.60.62 20:55 13:10 0.07s 0.02s -bash root pts/2 39.130.60.62 21:04 16:54 0.02s 0.02s -bash root pts/3 39.130.60.62 21:21 6.00s 0.04s 0.00s w w命令执行结果说明第一行依次显示当前的系统时间、系统从启动到现在已经运行的时间、登录到系统中的用户数和系统平均负载列名含义USER登录系统的用户TTY用户使用的TTY名称FROM用户从哪里登录进来,一般显示远程登录主机的IP地址或主机名LOGIN@用户登录的日期和时间IDLE显示终端空闲的时间JCPU表示该终端上的所有进程及子进程使用系统的总时间PCPU当前活动进程使用的系统时间WHAT当前用户执行的进程名称和选项② -h 参数[root@xiezhr ~]# w -h root pts/0 39.130.60.62 20:33 1:04m 0.02s 0.02s -bash root pts/1 39.130.60.62 20:55 28:55 0.07s 0.02s -bash root pts/2 39.130.60.62 21:04 32:39 0.02s 0.02s -bash root pts/3 39.130.60.62 21:21 15:51 0.04s 0.02s -bash root pts/4 39.130.60.62 21:37 3.00s 0.02s 0.00s w -h 显示已登录用户信息1、简介who 命令用于显示已经登录系统的用户,以及系统的启动时间等信息2、语法格式who [参数选项]3、参数选项参数参数说明-a显示所有信息-b显示系统启动时间-d显示已结束的进程-H显示标题,默认是不显示的-l显示登录进程4、实践操作① 不带参数显示所有信息[root@xiezhr ~]# who root pts/0 2022-09-11 20:33 (39.130.60.62) root pts/1 2022-09-11 20:55 (39.130.60.62) root pts/2 2022-09-11 21:04 (39.130.60.62) root pts/3 2022-09-11 21:21 (39.130.60.62) root pts/4 2022-09-11 21:37 (39.130.60.62) root pts/5 2022-09-11 22:19 (39.130.60.62) ② 显示系统启动时间[root@xiezhr ~]# who -b system boot 2021-01-10 21:14③ 显示已结束的进程[root@xiezhr ~]# who -d④ 显示标题[root@xiezhr ~]# who -H NAME LINE TIME COMMENT root pts/0 2022-09-11 20:33 (39.130.60.62) root pts/1 2022-09-11 20:55 (39.130.60.62) root pts/2 2022-09-11 21:04 (39.130.60.62) root pts/3 2022-09-11 21:21 (39.130.60.62) root pts/4 2022-09-11 21:37 (39.130.60.62) root pts/5 2022-09-11 22:19 (39.130.60.62) ⑤ 显示带标题的所有信息 [root@xiezhr ~]# who -H -a NAME LINE TIME IDLE PID COMMENT EXIT system boot 2021-01-10 21:14 run-level 3 2021-01-10 21:14 LOGIN ttyS0 2021-01-10 21:14 1009 id=tyS0 LOGIN tty1 2021-01-10 21:14 1008 id=tty1 root + pts/0 2022-09-11 20:33 01:50 23396 (39.130.60.62) root + pts/1 2022-09-11 20:55 01:15 27638 (39.130.60.62) root + pts/2 2022-09-11 21:04 01:19 29660 (39.130.60.62) root + pts/3 2022-09-11 21:21 01:02 405 (39.130.60.62) root + pts/4 2022-09-11 21:37 00:46 3587 (39.130.60.62) root + pts/5 2022-09-11 22:19 . 11675 (39.130.60.62) 以上显示的各项含义名称 [状态] 线路 时间 [活动] [进程标识] (主机名)列名说明NAME名称: 用户登录名状态:表示线路对用户是否都是可写的LINE线路: pts/0 pts/1等等TIME时间:用户登录系统的时间IDLE活动:某用户最后一次活动到现在的时间;. 表示一分钟内线路活动PID进程表示:用户进程idCOMMENT主机名users 显示已登录用户1、简介users 命令用于显示已经登录的用户。一个用户登录多次则会显示多次2、实践操作[root@xiezhr ~]# users root root root root root rootwhoami 显示当前登录的用户1、简介whoami 命令用于显示当前登录的用户。是英文who am i 的简写2、实践操作[root@xiezhr ~]# whoami root [root@xiezhr ~]# su - testuser Last login: Sun Sep 11 21:21:40 CST 2022 on pts/3 [testuser@xiezhr ~]$ whoami testuser last 显示用户登录列表1、简介last命令用于显示最近登录的用户列表2、语法格式last [参数选项]3、参数选项参数参数说明- num指定显示结果的行数4、实践操作① 不加参数显示[root@xiezhr ~]# last root pts/6 39.130.60.62 Sun Sep 11 22:42 still logged in root pts/0 39.130.60.62 Sun Sep 11 22:37 still logged in root pts/1 39.130.60.29 Sun Nov 29 09:09 - down (01:02) root pts/0 39.130.60.29 Sun Nov 29 08:49 - down (01:23) root pts/0 112.112.17.172 Fri Nov 6 12:50 - 15:45 (02:55) wtmp begins Fri Nov 6 12:50:41 2020 ② -num 参数,显示指定显示行数[root@xiezhr ~]# last -5 root pts/6 39.130.60.62 Sun Sep 11 22:42 still logged in root pts/0 39.130.60.62 Sun Sep 11 22:37 still logged in root pts/5 39.130.60.62 Sun Sep 11 22:19 still logged in root pts/4 39.130.60.62 Sun Sep 11 21:37 still logged in root pts/3 39.130.60.62 Sun Sep 11 21:21 still logged in wtmp begins Fri Nov 6 12:50:41 2020 lastb 显示用户登录失败的记录1、简介lastb命令用于显示用户登录失败的记录2、语法格式lastb [参数选项]3、参数说明参数参数说明-num指定显示结果的行数4、实践操作[root@xiezhr ~]# lastb -5 ssh:notty 159.75.56.103 Sun Sep 11 21:18 - 21:18 (00:00) ltecl4r0 ssh:notty 45.141.84.126 Sun Sep 11 20:33 - 20:33 (00:00) ltecl4r0 ssh:notty 45.141.84.126 Sun Sep 11 20:33 - 20:33 (00:00) 1admin0 ssh:notty 45.141.84.126 Sun Sep 11 20:32 - 20:32 (00:00) 1admin0 ssh:notty 45.141.84.126 Sun Sep 11 20:32 - 20:32 (00:00) btmp begins Thu Sep 1 03:31:03 2022 lastlog 显示所有用户最近登录记录1、简介lastlog 命令用于显示用户最近登录的记录,便于查看系统是否异常2、实践操作[root@xiezhr ~]# lastlog Username Port From Latest root pts/6 Sun Sep 11 22:45:57 +0800 2022 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** test **Never logged in** testxiezhr pts/0 Thu Sep 8 21:53:58 +0800 2022 testuser pts/6 Sun Sep 11 22:42:24 +0800 2022 注意:当有从不登录的用户突然登录系统了,就要考虑是不是有用户入侵系统了这期内容就到这,下期根据思维导图就到Linux磁盘与文件系统相关命令的使用了。涉及到的命令有: fdisk、df、mount、dd、unmount、sync、等等敬请期待哦(●’◡’●)
0. 前言由于学习或工作需要,我们经常需要和他人或其他电脑共享文件,在这之前我们普遍的做法是用U盘来回拷贝文件,但这样就存在着一个风险,①U盘容易中毒;②容易把U盘上的病毒带到别的电脑上。不管哪个风险都是我们不愿看到的,为了尽可能规避以上风险,我们就想到了ftp服务。为什么我们不在自己服务器上搭建一个ftp服务呢?只要我们控制好权限,哪些用户可以上传文件,哪些用户只可以下载文件。这不就给我们共享文件带来了很大方便么,同事也规避了一些风险。只要将我们需要共享的文件放到服务器上,只要网络正常,我们就很容易从服务器上拉取文件,或者将我们的文件共享给其他小伙伴。说干就干,接下来我们就行动起来呗。搭建一个属于自己的ftp服务。1.ftp简介在搭建ftp服务前呢,我们先来了解下ftp协议和ftp服务器ftp协议: 一种文件传输协议。在本地和服务器之间进行文件传输。ftp服务器:支持ftp传输协议的服务器。一般windows都带有ftp服务,只是默认情况下都没启动。ftp相关软件也比较多,其中运用比较广泛的有Server-U、FileZilla、VsFTP、apache旗下的FtpServer。今天我们就来介绍一个开源的ftp服务器,Apache FTPServerFtpServer也就这次的主角,Apache FTPServer是一个100%纯Java的FTP服务器。FTPServer可独立运行作为Windows服务或Unix/ Linux后台程序或是被嵌入在Java应用程序中。接下来我们就以FtpServer为例,搭建ftp服务。2.下载Apache FTPServer可以到官网下载:http://mina.apache.org/ftpserver-project/downloads.html 目前最新版本是Apache FtpServer 1.1.1 Release,出于稳定考虑我这里下载的就是1.0.6版本3.下载并解压压缩包将下载下来的压缩包解压到本地,我的是放在D盘根目录下,其目录结构如下图:4.修改配置文件4.1 修改users.properties配置文件配置文件路径:D:\apache-ftpserver-1.0.6\res\conf\users.properties在此配置文件中可以增加用户,如果不希望匿名登录的话,可以将匿名用户这个配置注释掉# Password is "admin" ftpserver.user.admin.userpassword=admin ftpserver.user.admin.homedirectory=./res/home ftpserver.user.admin.enableflag=true ftpserver.user.admin.writepermission=true ftpserver.user.admin.maxloginnumber=0 ftpserver.user.admin.maxloginperip=0 ftpserver.user.admin.idletime=0 ftpserver.user.admin.uploadrate=0 ftpserver.user.admin.downloadrate=0 ftpserver.user.anonymous.userpassword= ftpserver.user.anonymous.homedirectory=./res/home ftpserver.user.anonymous.enableflag=true ftpserver.user.anonymous.writepermission=false ftpserver.user.anonymous.maxloginnumber=20 ftpserver.user.anonymous.maxloginperip=2 ftpserver.user.anonymous.idletime=300 ftpserver.user.anonymous.uploadrate=4800 ftpserver.user.anonymous.downloadrate=4800 #密码 配置新的用户 ftpserver.user.lxw.userpassword=123456 #主目录 ftpserver.user.lxw.homedirectory=./res/home #当前用户可用 ftpserver.user.lxw.enableflag=true #具有上传权限 ftpserver.user.lxw.writepermission=true #最大登陆用户数为20 ftpserver.user.lxw.maxloginnumber=20 #同IP登陆用户数为2 ftpserver.user.lxw.maxloginperip=2 #空闲时间为300秒 ftpserver.user.lxw.idletime=300 #上传速率限制为480000字节每秒 ftpserver.user.lxw.uploadrate=48000000 #下载速率限制为480000字节每秒 ftpserver.user.lxw.downloadrate=48000000 4.2 修改ftpd-typical.xml配置文件配置文件路径:D:\apache-ftpserver-1.0.6\res\conf\ftpd-typical.xml<server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://mina.apache.org/ftpserver/spring/v1 http://mina.apache.org/ftpserver/ftpserver-1.0.xsd " id="myServer"> <listeners> <!-- 默认端口是2121,可以修改为自己的端口 --> <nio-listener name="default" port="2121"> <ssl> <keystore file="./res/ftpserver.jks" password="password" /> </ssl> </nio-listener> </listeners> <file-user-manager file="./res/conf/users.properties" encrypt-passwords="clear"/> <!-- 添加encrypt-passwords="clear",将密码加密方式修改给clear --> </server> 5.启动FTPServer打开CMD命令窗口,切换到D:\apache-ftpserver-1.0.6\bin这个目录下 输入以下命令:service install ftpd.bat res/conf/ftpd-typical.xml 注意:由于ftpserver是纯java编写的,所以第二条命令的执行需要在环境变量中配置java环境JAVA_HOME。java环境此处省去,不会可以自行百度输入完命令之后如下图所示,当出现FtpServer started 出现即启动成功6.访问FTP在游览器中,输入ftp://ip:2121进行访问,如果端口修改了,要换成对应的端口,ip就是FTP所在的服务器的ip,访问如下图所示:当然我们也能通过工具直接访问,进行上传和下载文件操作下面提供一个比较好用的免安装工具给大家,大家可以放心食用。winscp553 百度云下载链接 提取码:sncs7.ftp 的启动与关闭将dos命令窗口关掉,ftp服务即关闭那么我们怎么样启动ftp服务呢,可以根据前面所提到的命令启动,切换到D:\apache-ftpserver-1.0.6\bin这个目录下 输入以下命令:service install ftpd.bat res/conf/ftpd-typical.xml 可以把启动命令制作成bat文件,内容为:d: cd D:\apache-ftpserver-1.0.5\bin ftpd.bat res/conf/ftpd-typical.xml
IntelliJ IDEA简介IDEA,全称IntelliJ IDEA,是 Java 语言的集成开发环境, IDEA 在业界被公认为是最好的 java 开发工具之一,一旦用上了就会上瘾。尤其在智能代码助手、代码自动提示、重构、 J2EE支持、 Ant、 JUnit、 CVS 整合、代码审查、创新的 GUI 设计等方面的功能可以说是超常的。IDEA在官网是这样解释自己的Excel at enterprise, mobile and web development with Java, Scala and Groovy,with all the latest modern technologies and frameworks available out of thebox.简明翻译: IntelliJ IDEA 主要用于支持 Java、 Scala、 Groovy 等语言的开发工具,同时具备支持目前主流的技术和框架,擅长于企业应用、移动应用和 Web 应用的开发IntelliJ IDEA 相比于Eclipse的优势强大的整合能力。比如: Git、 Maven、 Spring 等提示功能的快速、 便捷提示功能的范围广好用的快捷键和代码模板精准搜索IntelliJ IDEA 下载安装1.下载地址https://www.jetbrains.com/idea/download/#section=windowsDEA 分为两个版本: 旗舰版(Ultimate)和社区版(Community)。旗舰版:收费(限 30 天免费试用),功能全面,插件丰富,但是收费,按年收费;社区版:免费试用,功能相对而言不是很丰富,但是不影响开发使用。软硬件要求(官方要求)以现目前最新版为例(现在最新版是idea-2021.3.2)操作系统: 64-bit versions of Microsoft Windows 10, 8内存:2 GB RAM minimum, 8 GB RAM recommended硬盘:2.5 GB hard disk space, SSD recommended屏幕:1024x768 minimum screen resolutionJRE:JRE 1.8 is bundled with the IntelliJ IDEA distribution. You do not need to install Javaon your computer to run IntelliJ IDEA.JDK A standalone JDK is required for Java development个人建议配置: 内存 8G 或以上, CPU 最好 i5 以上, 最好安装块固态硬盘(SSD),将 IDEA安装在固态硬盘上,这样流畅度会加快很多3.安装过程双击下载好的exe文件进行无脑安装即可4.激活淘宝,你懂的。目录结构介绍1.安装目录介绍bin:容器,执行文件和启动参数等idea64.exe.vmoptions 是比较重要的配置文件,这里以我个人电脑为例(win10 64位 16G内存)-Xms512m # 设置初始的内存数,增加该值可以提高 Java 程序的启动速度 -Xmx1500m #设置最大内存数,提高该值,可以减少内存 Garage 收集的频率,提高程序性能 -XX:ReservedCodeCacheSize=512m #保留代码占用的内存容量 -XX:+IgnoreUnrecognizedVMOptions -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:CICompilerCount=2 -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -ea -Dsun.io.useCanonCaches=false -Djdk.http.auth.tunneling.disabledSchemes="" -Djdk.attach.allowAttachSelf=true -Djdk.module.illegalAccess.silent=true -Dkotlinx.coroutines.debug=off help:快捷键文档和其他帮助文档jbr: 咱们在介绍intellij idea安装之前的准备时就给大家说过硬件和软件上的一个要求,如果你只是想运行java程序,那么你就用不着再去装jre了,因为intellij idea已经绑定好了。在jbr目录中,大家就能够看到它已经提供好了java的运行环境,当然,如果你要是想开发java程序的话,那么就得需要独立安装jdk了lib: idea 依赖的类库license:各个插件许可plugin:插件2.设置目录介绍路径C:\Users\用户.IntelliJIdea2019.3这是 IDEA 的各种配置的保存目录。 这个设置目录有一个特性,就是你删除掉整个目录之后,重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置,所以很多时候如果你把 IntelliJ IDEA 配置改坏了,删掉该目录,一切都会还原到默认值① config 目录此目录为IDEA最重要的目录。目录主要记录了: IDE 主要配置功能、自定义的代码模板、自定义的文件模板、自定义的快捷键、 Project 的 tasks 记录等等个性化的设置② system目录system 目录是 IntelliJ IDEA 系统文件目录,是 IntelliJ IDEA 与开发项目一个桥梁目录, 里面主要有:缓存、索引、容器文件输出等等创建Java工程,实现Hell World创建工程Create New Project:创建一个新的工程Create New Project:创建一个新的工程Import Project:导入一个现有的工程Open:打开一个已有工程。比如:可以打开 Eclipse 项目。Check out from Version Control:可以通过服务器上的项目地址 check out Github上面项目或其他 Git 托管服务器上的项目这里选择 Create New ProjectIntelliJ IDEA 没有类似 Eclipse 的工作空间的概念( Workspaces),最大单元就是Project。 这里可以把 Project 理解为 Eclipse 中的 Workspace。选择jdk版本,框架选择模板设置项目路径及项目名称项目界面工程下的 src 类似于 Eclipse 下的 src 目录, 用于存放代码工程下的.idea 和 project01.iml 文件都是 IDEA 工程特有的。类似于 Eclipse 工程下的.settings、 .classpath、 .project 等创建package和class在src目录下创建一个package在刚建的package下新建class在HelloWorld类里声明主方法,控制台打印Hello World! 到此成功完成模块(Module)简介在 Eclipse 中我们有 Workspace(工作空间)和 Project(工程)的概念,在 IDEA中只有 Project(工程)和 Module(模块)的概念① Eclipse 中 workspace 相当于 IDEA 中的 Project②Eclipse 中 Project 相当于 IDEA 中的 Moduleeclipse在同一窗口可以管理 n 个项目,这在IntelliJ IDEA 是无法做到的。IntelliJ IDEA 提供的解决方案是打开多个项目实例,即打开多个项目窗口。 即: 一个 Project 打开一个 Window 窗口在 IntelliJ IDEA 中 Project 是最顶级的级别,次级别是 Module。 一个 ProjectIntelliJ IDEA 的安装、 配置与使用可以有多个 Module。目前主流的大型项目都是分布式部署的, 结构都是类似这种多 Module 结构下图为若依项目模块截图,根据model命名可以看出,他们之间处于同一项目下,彼此之间有着不可分割的业务关系相比多个Module项目,小项目就没这么复杂,IntelliJ IDEA创建项目的时候默认的就是单Module结构的.IntelliJ IDEA 中一个项目是以Module为单位的,那么,下面我们就来看看建立和删除Module① 怎么建立Module?之后,我们可以在 Module 的 src 里写代码,此时 Project 工程下的 src 就没什么用了。可以删掉。② 如何删除一个Module呢?remove Moduledelete Module直到第二步完成,Module将彻底从磁盘上删除查看项目配置IDEA 常用配置file–>Settings 进入设置界面Appearance & Behavior① 设置主题默认有如下三种主题,根据自己喜好设置即可② 设置窗体及菜单的字体及大小Editor - General① 设置鼠标滚轮修改字体大小② 设置鼠标悬浮提示③ 设置自动导包Add unambiguous imports on the fly:自动导入不明确的结构Optimize imports on the fly: 自动帮我们优化导入的包④ 设置显示行号和方法间的分隔符如上图红圈所示, 可以勾选 Show line numbers:显示行数。 建议勾上,好定位代码如上图红圈所示, 可以勾选 Show method separators: 显示方法分隔线。建议勾上,单一个方法代码比较多时,好区分一个方法到哪结束⑤ 忽略大小写提示IntelliJ IDEA 的代码提示和补充功能默认是区分大小写的。我们输入stringb是没有提示的按照上图,我们把Match case 前的勾去掉后代码提示就不区分大小写了。输入stringb后就会有提示⑥ 设置取消单行显示 tabs 的操作在打开很多文件的时候, IntelliJ IDEA 默认是把所有打开的文件名 Tab 单行显示的。如果需要多行显示文件,超出部分不折叠,则按照上图设置即可Editor – Font① 设置默认的字体、字体大小、字体行间距Editor – Color Scheme① 修改代码中注释的字体颜色Doc Comment – Text: 修改文档注释的字体颜色Block comment: 修改多行注释的字体颜色Line comment: 修改当行注释的字体颜色Editor – File and Code Templates① 修改类头的文档注释信息/** @author xiezhr @create ${YEAR}-${MONTH}-${DAY} ${TIME} */ 6.Editor – File Encodings① 设置项目文件编码格式7.Build,Execution,Deployment① 设置自动编译Intellij Idea 默认状态为不自动编译状态, Eclipse 默认为自动编译。若你是刚才eclipse转过来的,这里需要设置下。8.设置代码水平或垂直显示快捷键设置1.相信不少小伙伴是刚才eclipse转过来的,习惯了eclipse的快捷键,没问题Intellij Idea中支持将快捷键设置成eclipse快捷键。2.导入快捷键设置3.常用快捷键(标⭐的为常用)① 编辑类快捷键快捷键说明Ctrl + Space补全代码,由于经常与操作系统的输入法的切换冲突,所以实际很少用。一般直接在 idea 中开启输入自动补全机制Ctrl + Shift + Space在列出的可选项中只显示出你所输入的关键字最相关的信息。⭐Ctrl + Shift + Enter代码补全后,自动在代码末尾添加分号结束符Ctrl + P在某个方法中,调用该按键后,会展示出这个方法的调用参数列表信息Ctrl + Q展示某个类或者方法的 API 说明文档Ctrl + mouse跳进到某个类或者方法源代码中进行查看⭐Alt + Insert自动生成某个类的 Getters, Setters, Constructors, hashCode/equals, toString 等代码 ⭐Ctrl + O展示该类中所有覆盖或者实现的方法列表Ctrl + Alt + T自动生成具有环绕性质的代码,比如:if…else,try…catch, for, synchronized 等等,使用前要先选择好需要环绕的代码块⭐Ctrl + /对单行代码,添加或删除注释。分为两种情况:如果只是光标停留在某行,那么连续使用该快捷键,会不断注释掉下一行的代码;如果选定了某行代码(选定了某行代码一部分也算这种情况),那么连续使用该快捷键,会在添加或删除该行注释之间来回切换⭐Ctrl + Shift + /对代码块,添加或删除注释。它与 Ctrl + / 的区别是,它只会在代码块的开头与结尾添加注释符号⭐Ctrl + W选中当前光标所在的代码块,多次触发,代码块会逐级变大⭐Ctrl + Shift + W是 Ctrl + W 的反向操作,多次触发,代码块会逐级变小,最小变为光标Alt + Q展示包含当前光标所在代码的父节点信息,比如在 java 方法中调用,就会展示方法签名信息Alt + Enter展示当前当前光标所在代码,可以变化的扩展操作Ctrl + Alt + L格式化代码⭐Ctrl + Alt + O去除没有实际用到的包,这在 java 类中特别有用⭐Ctrl + Alt + I按照缩进的设定,自动缩进所选择的代码段ab / Shift + Tab缩进或者不缩进一次所选择的代码段⭐Ctrl + X 或 Shift Delete剪切当前代码⭐Ctrl + C 或 Ctrl + Insert拷贝当前代码⭐Ctrl + V 或 Shift + Insert粘贴之前剪切或拷贝的代码Ctrl + Shift + V从之前的剪切或拷贝的代码历史记录中,选择现在需要粘贴的内容⭐Ctrl + D复制当前选中的代码⭐Ctrl + Y删除当前光标所在的代码行⭐Ctrl + Shift + J把下一行的代码接续到当前的代码行Ctrl + Enter当前代码行与下一行代码之间插入一个空行,原来所在的光标不变⭐Shift + Enter当前代码行与下一行代码之间插入一个空行,原来光标现在处于新加的空行上⭐Ctrl + Shift + U所选择的内容进行大小写转换⭐Ctrl + Shift + ]/[从当前光标所在位置开始,一直选择到当前光标所在代码段起始或者结束位置Ctrl + Delete删除从当前光标所在位置开始,直到这个单词的结尾的内容Ctrl + NumPad(+/-)展开或收缩代码段⭐Ctrl + Shift + NumPad(+)展开所有代码段Ctrl + Shift + NumPad(-)收缩所有代码段Ctrl + F4关闭当前标签页Shift + F6修改名字⭐② 查找替换快捷键快捷键说明Ctrl + F在当前标签页中进行查找,还支持正则表达式⭐F3如果找到了多个查找结果,每调用一次就会跳到下一个结果,很方便哦Shift + F3是 F3 的反向操作,即每调用一次就会跳到上一个结果Ctrl + R在当前标签页中进行替换操作⭐Ctrl + Shift + F通过路径查找⭐Ctrl + Shift + R通过路径替换⭐图示说明向上箭头就是 快捷键【Shift + F3】,每调用一次就会跳到上一个结果向下箭头就是 快捷键【F3】,每调用一次就会跳到下一个结果加号符号把当前的高亮项加入到选中的列表中减号符号把当前的高亮项从选中的列表中移除勾选符号把所有的查找结果同时选中,这很适合批量操作文本内的向上箭头打开查询结果列表面板两个框加一个向下箭头更多选项Match Case是否大小写敏感Regex正则表达式Words匹配单词x matchesx 表示的是找到的记录数④ 查看使用情况快捷键快捷键说明Alt + F7在当前项目中的使用情况,会打开一个使用情况面板Ctrl + F7在当前文件中的使用情况,找的内容会低亮显示Ctrl + Shift + F7在当前文件中的使用情况,找的内容会高亮显示Ctrl + Alt + F7打开使用情况列表⭐④ 编译运行快捷键快捷键说明Ctrl + F9编译项目(如果之前有编译过,那么只会编译那些修改的类或者依赖的包⭐Ctrl + Shift + F9编译选中的范围(如果在某个类中,那么只会编译当前类)Alt + Shift + F10会打开一个已经配置的运行列表,让你选择一个后,再运行Alt + Shift + F9会打开一个已经配置的运行列表,让你选择一个后,再以调试模式运行Shift + F10立即运行当前配置的运行实例,这个在单元测试中特别好用⭐Shift + F9立即以编译模式运行当前配置的运行实例⭐Ctrl + Shift + F10按照编辑器绑定的文件类型,运行相关的程序。比如一个 html 页面,调用后,会直接打开一个浏览器⑤ 调试快捷键快捷键说明F8跳到当前代码下一行⭐F7跳入到调用的方法内部代码⭐Shift + F7会打开一个面板,让你选择具体要跳入的类方法,这个在复杂的嵌套代码中特别有用Shift + F8跳出当前的类,到上一级⭐Alt + F9让代码运行到当前光标所在处,非常棒的功能⭐Alt + F8打开一个表达式面板,然后进行进一步的计算F9结束当前断点的本轮调试(因为有可能代码会被调用多次,所以调用后只会结束当前的这一次);如果有下一个断点会跳到下一个断点中⭐Ctrl + F8在当前光标处,添加或者删除断点Ctrl + Shift + F8打开当前断点的面板,可以进行条件过滤哦⑥ 导航快捷键快捷键说明Ctrl + N打开类查询框⭐Ctrl + Shift + N打开文件查询框⭐Ctrl + Alt + Shift + N打开文本查询框Alt + 右箭头/左箭头跳到下一个/上一个编辑器标签F12如果当前在编辑窗口,触发后,会跳到之前操作过的工具栏上ESC从工具栏上,再跳回原来的编辑窗口,一般与 F12 配合使用Shift + ESC隐藏最后一个处于活跃状态的工具窗口Ctrl + Shift + F4同时关闭处于活动状态的某些工具栏窗口Ctrl + G跳转至某一行代码⭐Ctrl + E打开曾经操作过的文件历史列表Ctrl + Alt + 右箭头/左箭头在曾经浏览过的代码行中来回跳Ctrl + Shift + Backspace跳转到最近的编辑位置(如果曾经编辑过代码)Alt + F1打开一个类型列表,选择后会导航到当前文件或者内容的具体与类型相关的面板中Ctrl + B 或 Ctrl + 鼠标左键如果是类,那么会跳转到当前光标所在的类定义或者接口;如果是变量,会打开一个变量被引用的列表⭐Ctrl + Alt + B跳转到实现类,而不是接口⭐Ctrl + Shift + I打开一个面板,里面包含类代码Ctrl + Shift + B打开变量的类型所对应的类代码,只对变量有用Ctrl + U打开方法的超类方法或者类的超类,只对有超类的方法或者类有效Alt + 上/下箭头在某个类中,跳到上一个/下一个方法的签名上Ctrl + ]/[移动光标到类定义的终止右大括号或者起始左大括号Ctrl + F12打开类的结构列表⭐Ctrl + H打开类的继承关系列表Ctrl + Shift + H打开某个类方法的继承关系列表Ctrl + Alt + H打开所有类的方法列表,这些方法都调用了当前光标所处的某个类方法⭐F2/Shift + F2在编译错误的代码行中来回跳F4打开当前光标所在处的方法或类源码Alt + Home激活包路径的导航栏F11把光标所处的代码行添加为书签或者从书签中删除⭐Ctrl + F11把光标所处的代码行添加为带快捷键的书签或者从快捷键书签中删除。Shift + F11打开书签列表⭐Ctrl + N (打开类查询框)键入类名的关键字,会自动出现相关的类,很强大Alt + F1(打开一个类型列表)模板设置模板包含Live Templates 和 Postfix Completion二者的区别: Live Templates 可以自定义,而 Postfix Completion 不可以Live Templates(实时代码模板)配置一些常用代码字母缩写,在输入简写时可以出现你预定义的固定模式的代码,使得开发效率大大提高.Java 中输入 sout 会出现 System.out.println();已有的常用模板举例① psvmpsvm 可生成 main 方法② soutsout 可生成 System.out.println()③ forifori:可生成 for 循环iter:可生成增强 for 循环itar:可生成普通 for 循环④ list.forlist.for 可生成集合 list 的 for 循环List list = new ArrayList();输入: list.for 即可输出for(String s:list){}⑤ ifnifn 可生成 if(xxx = null)inn:可生成 if(xxx != null)xxx.nn 或 xxx.null⑥ prsfprsf 可生成 private static finalpsf 可生成 public static finalpsfi 可生成 public static final intpsfs 可生成 public static final String3.如果对已有的模板不习惯,可以修改4.如果对已有的模板不习惯,也可以定义自己的模板,步骤如下① 定义一个模板的组② 在上一步定义的模板组下定义一个模板③ 选择应用范围关联数据库1.关联数据库IntelliJ IDEA 的 Database 最大特性就是对于 Java Web 项目来讲,常使用的 ORM 框架,如 Hibernate、Mybatis 有很好的支持,比如配置好了 Database 之后,IntelliJ IDEA 会自动识别 domain 对象与数据表的关系,也可以通过 Database 的数据表直接生成 domain 对象等等2.常用操作图标 1:同步当前的数据库连接。这个是最重要的操作。配置好连接以后或通过其他工具操作数据库以后,需要及时同步。图标 2:配置当前的连接。图标 3:断开当前的连接。图标 4:显示相应数据库对象的数据图标 5:编辑修改当前数据库对象版本控制不管是个人开发还是团队开发,都离不开版本控制,IntelliJ IDEA也集成了版本控制工具。注:IntelliJ IDEA 虽然默认对这些版本控制工具提供插件支持,但是还需要我们自己安装版本控制客户端滴Git是我们常用的版本控制工具,是目前世界上最先进的分布式版本控制系统(没有之一)。我们这里就以Git为例,说一说IntelliJ IDEA怎么配置和使用Git① 下载和安装Git客户端官网下载地址:https://git-scm.com/downloads全部无脑下一步安装即可默认安装完成后,右键出现下图所示图标即表示安装成功安装完成后,还需要最后一步设置,在命令行输入:# 注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置 $ git config --global user.name "Your Name" $ git config --global user.email "email@example.com" 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址② 关联 git.exe③ 关联 GitHub 上的账户,并测试连接④ 在 GitHub 上创建账户下的一个新的仓库作为测试⑤ 从当前github 账号上checkout项目获取GitHub上项目路径,并将项目路径填入其中按照以上步骤,在GitHub上的项目即克隆到了本地。是不是很简单哦⑥ Git常用操作clone:拷贝远程仓库 commit:本地提交 push:远程提交 pull:更新到本地上面只提了最最最常用的命令,如果你想更加深入的了解git,建议参考廖雪峰的Git教程注:即使我们没有使用任何版本控制工具,IntelliJ IDEA也为我们提供了历史版本查看功能断点调试功能debug 模式设置设置 Debug 连接方式,默认是 Socket。Shared memory 是 Windows 特有的一个属性,一般在 Windows 系统下建议使用此设置,内存占用相对较少常用断点调试说明图标显示说明step over进入下一步,如果当前行断点是一个方法,则不进入当前方法体内step into进入下一步,如果当前行断点是一个方法,则进入当前方法体内force step into进入下一步,如果当前行断点是一个方法,则进入当前方法体内step out跳出resume program恢复程序运行,但如果该断点下面代码还有断点则停在下一个断点上stop停止view breakpoints查看所有断点条件断点在实际项目中,我们会遇到这样一种场景。我们已经定位问题(bug)就出在这个循环里,但是确定不了循环到第几次的时候报错,当循环次数比较少,是3次或5次的时候,我们可以一次一次的调试。但当循环次数是100次,甚至1000次呢?这个时候我们就需要用到条件断点了。在循环里增加条件判断,能大大提高我们的效率我们在需要设置断点的语句前单击,当出现红色断点时,右键出现如下图所示,即可加入条件debug程序,程序在i=10的时候停止配置maven1.Java项目构成在介绍maven 前,我们先了解下一个Java项目需要哪些东西。如果我们需要log4j,就需要吧log4j相关的jar包放到classpath中,如果我们需要fastjson,就需要把fastjson相关的jar包放到classpath中。这就是依赖包的管理我们要确定项目的目录结构。例如,src目录存放Java源码,resources目录存放配置文件,bin目录存放编译生成的.class文件我们还需要配置环境,例如JDK的版本,编译打包的流程需要对代码进行编译,才能够让项目在一个独立的服务器上编译、测试、部署2.maven 简介这些工作难度不大,但是非常琐碎且耗时。如果每一个项目都自己搞一套配置,肯定是费时费力。我们需要的是一个标准化的Java项目管理和构建工具Maven就是是专门为Java项目打造的管理和构建工具,Maven有以下功能提供了一套标准化的项目结构提供了一套标准化的构建流程(编译,测试,打包,发布……)提供了一套依赖管理机制3.Maven 项目结构4.Maven构建流程5.IntelliJ IDEA 配置Maven6.新建Maven项目① 新建项目②选择Maven项目③设置项目参数④配置本地Maven设置⑤初始化项目⑥项目构建完成添加第三方jar包mysql 是我们日常开发中常用的数据库,这里我们以导入MySQL驱动包为例①当我们执行App.java中代码时,由于没加mysql驱动包,所以会报如下错误②修改pom.xml文件,添加如下内容<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.20</version> </dependency> 注:dependency标签中的内容我们不用死记,我们只需要到https://mvnrepository.com/查询,然后复制即可③ 等待驱动下载完成④ 再次运行,成功创建web项目并配置tomcat新建maven web项目① 创建项目②选择Maven webapp格式③填写项目参数④ 配置本地Maven相关参数⑤配置java源代码目录maven web项目默认是没有java源代码目录的,所以需要手动创建,并设置其为源代码目录右键main目录-> New->Directory->输入java->右键java->Mark Directory as-> Sources Root这样就创建了存放java源文件的目录了⑥ 新建servletpackage com.xiezhr; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; @WebServlet(name = "HelloServlet") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().println("<h1>Hello Servlet! Hello xiezhr!</h1>"); response.getWriter().println(new Date().toLocaleString()); } } ⑦修改web.xml<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.xiezhr.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> ⑧pom.xml添加servlet包依赖<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> 配置tomcat① 打开tomcat配置,并选择tomcat 路径② 设置部署③ 运行项目④ 测试成功
序言个人采用hexo搭建了博客,博客也刚上线不久,博客地址:https://www.xiezhrspace.cn 。 欢迎小伙伴访问,疯狂暗示来关注来访问(‐^▽^‐)。虽然放到了云服务器上,但是由于博客上传的图片等资源越来越多,请求的资源也越来越多,博客访问速度越来越慢,简直不忍直视。愁了好久,一直在想办法优化,自己在网上也找资料,在和博客交流群的小伙伴交流后便有了解决方案,【使用cdn加速】。但是呢问题又来了,很多云服务提供商的cdn加速都是要根据流量花钱的。虽然网站访问量不多,但是呢能白嫖当然是最好的了。在小伙伴推荐后有了两种白嫖方案 1、jsDelivr+Github 2、又拍云(需要申请账号加入又拍云联盟,个人的申请还未下来)。都说又拍云加速会更好一些,但是自己的申请还没办好,而博客访问优化又迫在眉睫,固先采用了第一个方案:jsDelivr+Github 的方案。下面就以jsDelivr+Github 实现免费cdn加速为例,记录自己优化过程。1 cdn简介cdn 全称Content Delivery Network即内容分发网络。CDN是一组分布在多个不同地方的WEB服务器,可以更加有效的向用户提供资源,会根据距离的远近来选择 。使用户能就近的获取请求数据,解决网络拥堵,提高访问速度,解决由于网络带宽小,用户访问量大,网点分布不均等原因导致的访问速度慢的问题。2 cdn请求分发原理(1)用户向浏览器提供需要访问的域名;(2)浏览器调用域名解析库对域名进行解析,由于CDN对域名解析过程进行了调整,所以解析函数库一般得到的是该域名对应的CNAME记录,为了得到实际的IP地址,浏览器需要再次对获得的CNAME域名进行解析以得到实际的IP地址;在此过程中,使用的全局负载均衡DNS解析。如根据地理位置信息解析对应的IP地址,使得用户能就近访问;(3)此次解析得到CDN缓存服务器的IP地址,浏览器在得到实际的ip地址之后,向缓存服务器发出访问请求;(4)缓存服务器根据浏览器提供的要访问的域名,通过Cache内部专用DNS解析得到此域名的实际IP地址,再由缓存服务器向此实际IP地址提交访问请求;(5)缓存服务器从实际IP地址得到内容以后,一方面在本地进行保存,以备以后使用,二方面把获取的数据放回给客户端,完成数据服务过程;(6)客户端得到由缓存服务器返回的数据以后显示出来并完成整个浏览的数据请求过程。3 jsDelivr简介是一个免费、快速和可信赖的CDN加速服务,声称它每个月可以支撑680亿次的请求。服务在Github上是开源的,jsDelivr地址 。目前,它提供了针对npm、Github和WordPress的加速服务,只需要一行代码就可以获得加速效果。只要我们的项目中用到了第三方的静态资源,譬如JavaScript脚本,css样式表,图片,图标,Flash等静态资源文件都应该考虑接入到CDN中4.jsDelivr 的简单使用我们以加载jQuery和Bootstrap 为例// load jQuery v3.2.1 https://cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js // load bootstrap v4.4.1 https://cdn.jsdelivr.net/npm/bootstrap@4.4.1/dist/js/bootstrap.jsjsDelivr + Github便是免费且好用的CDN,非常适合博客网站使用5 jsDelivr + Github 的具体实现5.1 新建Github仓库5.2 使用git clone 命令将仓库克隆到本地在要放仓库的本地目录右键 Git Bash Here(如果没有安装git的需要提前安装下,都是默认安装即可),并输入以下命令git clone https://github.com/xiezhr/mycdn.git$ git clone https://github.com/xiezhr/mycdn.git Cloning into 'mycdn'... remote: Enumerating objects: 3, done. remote: Counting objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (3/3), done. 5.3 将需要cdn加速的资源上传到github仓库需要用到的命令如下git add . //添加所有文件到暂存区 git status //查看状态 git commit -m '第一次提交' //把文件提交到仓库 -m 后面的是备注信息 git push //推送至远程仓库个人采用的是hexo博客框架,该框架的静态资源(css、js、图片等)都是放在source目录下面,所以呢我是将source目录真个上传上去,这样的好处是路径跟原来的保持一致,后面在调用的时候比较方便。git 窗口输入如上命令之后,文件都上传到了github仓库5.4 点击release 发布版本自定义发布版5.5 通过jsDelivr引用资源通过如下地址应用资源https://cdn.jsdelivr.net/gh/你的用户名/你的仓库名@发布的版本号/文件路径举个栗子,获取source/bgimg路径下的back-rain.pnghttps://cdn.jsdelivr.net/gh/xiezhr/mycdn/source/bgimg/back-rain.png ## 获取最新资源 https://cdn.jsdelivr.net/gh/xiezhr/mycdn@1.0/source/bgimg/back-rain.png ## 获取1.0版本的资源注意: 版本号不是必需的,是为了区分新旧资源,如果不使用版本号,将会直接引用最新资源,除此之外还可以使用某个范围内的版本,查看所有资源等,具体使用方法如下:// 加载任何Github发布、提交或分支 https://cdn.jsdelivr.net/gh/user/repo@version/file // 加载 jQuery v3.2.1 https://cdn.jsdelivr.net/gh/jquery/jquery@3.2.1/dist/jquery.min.js // 使用版本范围而不是特定版本 https://cdn.jsdelivr.net/gh/jquery/jquery@3.2/dist/jquery.min.js https://cdn.jsdelivr.net/gh/jquery/jquery@3/dist/jquery.min.js // 完全省略该版本以获取最新版本 https://cdn.jsdelivr.net/gh/jquery/jquery/dist/jquery.min.js // 将“.min”添加到任何JS/CSS文件中以获取缩小版本,如果不存在,将为会自动生成 https://cdn.jsdelivr.net/gh/jquery/jquery@3.2.1/src/core.min.js // 在末尾添加 / 以获取资源目录列表 https://cdn.jsdelivr.net/gh/jquery/jquery/6 将hexo中用到静态资源的地方换成cdn加速# 使用到的前端库,可按需替换成对应的CDN地址,如果下面未指定具体的版本号,使用最新的版本即可. # 注:jsdelivr可以自动帮你生成.min版的js和css,所以你在设置js及css路径中可以直接写.min.xxx libs: css: matery: https://cdn.jsdelivr.net/gh/xiezhr/mycdn/source/css/matery.css mycss: https://cdn.jsdelivr.net/gh/xiezhr/mycdn/source/css/my.css fontAwesome: https://cdn.jsdelivr.net/gh/xiezhr/mycdn/source/libs/awesome/css/all.css # V5.11.1 materialize: https://cdn.jsdelivr.net/gh/xiezhr/mycdn/source/libs/materialize/materialize.min.css # 1.0.0 aos: https://cdn.jsdelivr.net/gh/xiezhr/mycdn/source/libs/aos/aos.css都换好之后,执行如下命令hexo cl & hexo g & hexo s浏览器地址栏输入 http://localhost:4000 访问博客,你会发下博客访问速度快了很多。到此大功告成!!!
第一个mybatis程序,实现增删改查CRUDmybatis 介绍mybatis 本是apache的一个开源项目iBatis,2010年这个项目由apache迁移到了googlecode,并且改名为MyBatis,2013年11月迁移到Github。MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(普通的 Java对象)映射成数据库中的记录Mybatis官方文档 :http://www.mybatis.org/mybatis-3/zh/index.htmlGitHub :https://github.com/mybatis/mybatis-3代码演示1.所需环境jdk1.8.0_91mysql-5.7.29apache-maven-3.6.32.创建数据库CREATE DATABASE `mybatis`; USE `mybatis`; DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(20) NOT NULL, `name` varchar(30) DEFAULT NULL, `pwd` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`name`,`pwd`) values (1,'张三','123456'),(2,'李四','abcdef'),(3,'王五','987654'); 3.使用idea创建项目并导入导入mybatis所需jar包<dependencies> <!--mysql驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--mybatis包--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.2</version> </dependency> <!--junit 测试包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> 4.编写mybatis核心配置文件该配置文件主要是配置连接mysql的基本信息及注册mapper(具体配置参考官方文档)<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/xiezhr/Dao/UserMapper.xml"></mapper> </mappers> </configuration> 5.编写mybatis工具类查看官方文档,我们这里要封装一个工具类生成SqlSession对象,SqlSession用于后面的执行sqlpackage com.xiezhr.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MysqlUtil { private static SqlSessionFactory sqlSessionFactory; static { String resource = "mybatis-config.xml"; InputStream inputStream = null; try { inputStream = Resources.getResourceAsStream(resource); } catch (IOException e) { e.printStackTrace(); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } } 6.创建对应数据库表的实体类各个属性得命名必须与数据库字段一一对应,具体如下所示,数据库对应字段为id,name,pwdpackage com.xiezhr.pojo; public class User { private int id; private String name; private String pwd; public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } @Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", pwd='" + pwd + '\'' + '}'; } } 7.编写Mapper接口该接口对应原来的dao,具体代码如下package com.xiezhr.dao; import com.xiezhr.pojo.User; import java.util.List; public interface UserMapper { List<User> getUserList(); } 8.编写Mapper.xml 文件由于我们使用了mybatis,所以这的xml文件相当于我们原来dao得实现类daoimpl。namespace属性对应着接口,不能写错,标签表示是个查询语句。id 属性对应着接口的方法,result Type代表返回得类型,即对应这pojo实体。具体代码如下<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.xiezhr.dao.UserMapper"> <select id="getUserList" resultType="com.xiezhr.pojo.User"> select * from mybatis.user; </select> </mapper> 9.到这一步我们第一个mybatis实现查询就基本大功告成了,接下来就要编写测试类测试我们写得代码package com.xiezhr.dao; import com.xiezhr.pojo.User; import com.xiezhr.util.MysqlUtil; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.List; public class TestUserDao { @Test public void selectUser(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); List<User> userList = mapper.getUserList(); for (User user : userList) { System.out.println(user); } } } 经过测试后输出测试结果D:\Java\jdk1.8.0_91\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=54576:D:\JetBrains\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "D:\JetBrains\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar;D:\JetBrains\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit5-rt.jar;D:\JetBrains\IntelliJ IDEA 2019.3.3\plugins\junit\lib\junit-rt.jar;D:\Java\jdk1.8.0_91\jre\lib\charsets.jar;D:\Java\jdk1.8.0_91\jre\lib\deploy.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\access-bridge-64.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\cldrdata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\dnsns.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jaccess.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\jfxrt.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\localedata.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\nashorn.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunec.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunjce_provider.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunmscapi.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\sunpkcs11.jar;D:\Java\jdk1.8.0_91\jre\lib\ext\zipfs.jar;D:\Java\jdk1.8.0_91\jre\lib\javaws.jar;D:\Java\jdk1.8.0_91\jre\lib\jce.jar;D:\Java\jdk1.8.0_91\jre\lib\jfr.jar;D:\Java\jdk1.8.0_91\jre\lib\jfxswt.jar;D:\Java\jdk1.8.0_91\jre\lib\jsse.jar;D:\Java\jdk1.8.0_91\jre\lib\management-agent.jar;D:\Java\jdk1.8.0_91\jre\lib\plugin.jar;D:\Java\jdk1.8.0_91\jre\lib\resources.jar;D:\Java\jdk1.8.0_91\jre\lib\rt.jar;F:\workspace_idea\Mybatis-test\mybatis-01\target\test-classes;F:\workspace_idea\Mybatis-test\mybatis-01\target\classes;D:\maven\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;D:\maven\repository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\maven\repository\junit\junit\4.12\junit-4.12.jar;D:\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.xiezhr.dao.TestUserDao,selectUser Tue Apr 14 22:54:48 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. User{id=1, name='张三', pwd='322334'} User{id=2, name='李四', pwd='123456'} User{id=3, name='王五', pwd='123456'} 扩展 根据id查询用户1.在UserMapper接口中添加相应的方法selectUserById(id)public interface UserMapper { //根据ID查询用户 User selectUserById(int id); }2.在UserMapper.xml 中添加相应select 语句<mapper namespace="com.xiezhr.dao.UserMapper"> <select id="selectUserById" parameterType="int" resultType="com.xiezhr.pojo.User"> select * from mybatis.user where id = #{id} </select> </mapper>3.添加测试类@Test public void selectUserByid(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectUserById(1); System.out.println(user); }测试通过Wed Apr 15 23:08:00 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. User{id=1, name='张三', pwd='322334'} 根据用户姓名密码查询用户信息1.在UserMapper接口中添加方法public interface UserMapper { //根据用户名密码查询用户信息 User selectUserByNP(@Param("name") String name,@Param("pwd") String pwd); }2.在UserMapper.xml 中添加select语句<mapper namespace="com.xiezhr.dao.UserMapper"> <select id="selectUserByNP" resultType="com.xiezhr.pojo.User"> select * from mybatis.user where name=#{name} and pwd=#{pwd} </select> </mapper>3.添加测试类 @Test public void selectUserByNP(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.selectUserByNP("张三","322334"); System.out.println(user); }测试成功Wed Apr 15 23:24:02 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification. User{id=1, name='张三', pwd='322334'}以上通过用户名和密码查询用户,传参还可以通过万能的map实现,具体代码如下1.向UserMapper接口中添加方法public interface UserMapper { //根据用户名和密码查询用户信息 User queryUserByNP(Map<String,Object> map); } 2.向UserMapper.xml 中添加select语句,其中参数类型为map<mapper namespace="com.xiezhr.dao.UserMapper"> <select id="queryUserByNP" parameterType="map" resultType="com.xiezhr.pojo.User"> select * from mybatis.user where name=#{name} and pwd=#{pwd} </select> </mapper>添加测试,在使用过程中,map的key对应着UserMapper.xml中取值,map在put值时候没有先后顺序 @Test public void queryUserByNp(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); Map<String,Object> map = new HashMap<String,Object>(); map.put("name","张三"); map.put("pwd","322334"); User user = mapper.queryUserByNP(map); System.out.println(user); } 模糊查询实现1.在Java代码中添加sql通配符string wildcardname = “%smi%”; list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”> select * from foo where bar like #{value} </select>2.在sql语句中拼接通配符,会引起sql注入string wildcardname = “smi”; list<name> names = mapper.selectlike(wildcardname); <select id=”selectlike”> select * from foo where bar like "%"#{value}"%" </select> insert1.在之前编写的UserMapper 接口中添加增加方法public interface UserMapper { //添加一条用户信息 int addUser(User user); }2.在UserMapper.xml 中写insert 语句<insert id="addUser" parameterType="com.xiezhr.pojo.User"> insert into mybatis.user values(#{id},#{name},#{pwd}) </insert>3.添加测试类 insert、update、delete 一定要提交事务,千万千万不能忘记了@Test public void addUser(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = new User(4, "大头儿子", "123456"); mapper.addUser(user); sqlSession.commit(); //增删改一定要提交事务 sqlSession.close(); }update1.在之前编写的UserMapper 接口中添加update方法public interface UserMapper { //修改一条记录 int updateUserById(int id); }2.在UserMapper.xml 中写insert 语句<update id="updateUserById" parameterType="int"> update mybatis.user set name='小头爸爸' where id=#{id} </update>3.添加测试类insert、update、delete 一定要提交事务,千万千万不能忘记了 @Test public void updateUserById(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.updateUserById(4); sqlSession.commit(); //增删改一定要提交事务 sqlSession.close(); }delete1.在之前编写的UserMapper 接口中添加delete方法public interface UserMapper { //根据ID删除一条记录 int deleteUserById(int id); } }2.在UserMapper.xml 中写insert 语句<delete id="deleteUserById" parameterType="int"> delete from mybatis.user where id=#{id} </delete>3.添加测试类insert、update、delete 一定要提交事务,千万千万不能忘记了 @Test public void deletUserById(){ SqlSession sqlSession = MysqlUtil.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); mapper.deleteUserById(4); sqlSession.commit(); //增删改一定要提交事务 sqlSession.close(); }注意所有的insert、update、delete 必须要提交事务接口中所有的普通参数尽量写上@Param 参数,尤其是多个参数的时候一定要写上有些时候由于业务需要需要可通过map传值为了规范在sql配置文件中即本例的UserMapper.xml 中select inset delete update 尽量写上Parameter参数和resultType可能出现问题说明:Maven静态资源过滤问题<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>在静态资源的过滤中,基本的元素有三种:directory:指定资源所在的目录,这个目录的路径是相对于pom.xml文件;includes:指定要包含哪些文件,其中包括inlcude子节点来指定匹配的模式;excludes:指定要排除哪些文件,其中包括exclude子节点来指定匹配的模式;filtering:指定哪些文件需要过滤,这个过滤的目的是为了替换其中的占位符${},其中的占位符属性在pom.xml文件中的中指定;
1.下载mysql下载地址:https://dev.mysql.com/downloads/mysql/5.7.html#downloads下载zip免安装版,可以省去很多事2.将下载的安装文件解压放到磁盘中3.在mysql解压缩包根目录下创建my.ini 文件(mysql主配置文件)并创建data目录(用户初始化数据库文件目录)my.ini文件内容如下[mysqld] basedir=D:\mysql-5.7.29\ datadir=D:\mysql-5.7.29\data\ port=3306 skip-grant-tables以上配置文件说明basedir–mysql目录datadir–数据路径port --端口skip-grant-tables --刚开始跳过登陆校验4.添加path环境变量5.以管理员打开命令行窗口,并进入到mysql的bin目录,安装mysql服务及初始化数据库安装服务:mysqld install初始化数据库mysqld --initialize-insecure --user=mysql6.启动mysql服务,并以跳过登陆校验的方式登陆mysqlnet start mysql7.修改密码,并刷新权限UPDATE mysql.user SET authentication_string = PASSWORD('新密码') WHERE user = 'root'; # 我的命令 UPDATE mysql.user SET authentication_string = PASSWORD('123456') WHERE user = 'root';8.将mysql根目录下的my.ini 配置文件中的跳过登陆配置注释掉basedir=D:\mysql-5.7.29\ datadir=D:\mysql-5.7.29\data\ port=3306 #skip-grant-tables9.大功告成,可以登陆mysql。登陆命令:mysql -u root -p123456最后,我们当然不希望以后写sql都在命令框中敲sql,这样很痛苦的。我找了网上也是自己在用的sqlyog图形化界面提供大家使用。由于博客上放下载地址审核会不通过,需要软件的小伙伴可以私下找我要结束语SQL的学习必须是有条理、有逻辑的由浅入深学习SQL,一定要理论+实践结合,不管你是刚入门的小白,还是曾经学过相关知识,或者有一定基础,想要继续提升能力,又或者面试前突击想刷刷真题,都可以去牛客网练习!从小白入门到某度、某音、某东的真实场景全部覆盖,只要想学习SQL,那一定不能错过牛客网!而且内容全部免费,赶紧刷起来!
1、七种文件类型普通文件类型Linux中最多的一种文件类型, 包括 纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件.第一个属性为 [-]目录文件就是目录, 能用 # cd 命令进入的。第一个属性为 [d],例如 [drwxrwxrwx]块设备文件块设备文件 : 就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 [b]字符设备字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]套接字文件这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型管道文件FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。第一个属性为 [p]链接文件类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]2、查看文件类型的三种方法①ls-l/ls-ld 或者ll [ls-l —查看文件 ls-ld —查看路径 ll ----跟ls -l 一样] ll anaconda-ks.cfg //看第一个字符 -rw-------. 1 root root 2460 6月 1 23:37 anaconda-ks.cfg [root@localhost log]# ls -ld /etc drwxr-xr-x. 81 root root 4096 Jan 29 03:25 /etc②file 命令[root@localhost data]# file a.txt a.txt: ASCII text③stat 命令[root@localhost data]# stat a.txt //查看文件的详细属性(其中包括文件时间属性) File: `a.txt' Size: 3 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 544365 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-01-28 20:56:01.965885036 +0800 Modify: 2018-01-28 20:55:27.181876154 +0800 Change: 2018-01-28 20:55:27.181876154 +08003、Linux中文件扩展名windows里通过扩展名来区分文件类型的。linux里文件扩展名和文件类型没有关系。但为了容易区分和兼容用户使用windows的习惯,我们还是会用扩展名来表示文件类型。举例如下:● 源码.tar、.tar.gz、.tgz、.zip、.tar.bz表示压缩文件,创建命令一般为tar,gzip,zip等。● .sh表示shell脚本文件,通过shell语言开发的程序。● .pl表示perl语言文件,通过perl语言开发的程序。● .py表示python语言文件,通过python语言开发的程序。● .html、.htm、.php、.jsp、.do表示网页语言的文件。● .conf表示系统服务的配置文件。● .rpm表示rpm安装包文件。4、文件属性[root@localhost /]# ls -lhi total 90K 12 dr-xr-xr-x. 2 root root 4.0K Jan 28 18:30 bin 2 dr-xr-xr-x. 5 root root 1.0K Aug 7 2016 boot 4 drwxr-xr-x. 18 root root 3.7K Jan 29 01:29 dev 652802 drwxr-xr-x. 81 root root 4.0K Jan 29 03:25 etc 130563 drwxr-xr-x. 3 root root 4.0K Jan 29 00:57 home 13 dr-xr-xr-x. 12 root root 4.0K Jan 28 18:30 lib 391685 dr-xr-xr-x. 9 root root 12K Jan 28 18:30 lib64 11 drwx------. 2 root root 16K Aug 7 2016 lost+found 130564 drwxr-xr-x. 2 root root 4.0K Sep 23 2011 media 391689 drwxr-xr-x. 2 root root 4.0K Sep 23 2011 mnt 130565 drwxr-xr-x. 3 root root 4.0K Aug 7 2016 opt 1 dr-xr-xr-x. 97 root root 0 Jan 29 2018 proc 391682 dr-xr-x---. 2 root root 4.0K Jan 28 21:08 root 130566 dr-xr-xr-x. 2 root root 12K Jan 28 18:30 sbin 1 drwxr-xr-x. 7 root root 0 Jan 29 2018 selinux 15 drwxr-xr-x. 2 root root 4.0K Sep 23 2011 srv 1 drwxr-xr-x. 13 root root 0 Jan 29 2018 sys 522242 drwxrwxrwt. 5 root root 4.0K Jan 29 05:15 tmp 522244 drwxr-xr-x. 14 root root 4.0K Jan 28 20:04 usr 261121 drwxr-xr-x. 20 root root 4.0K Aug 7 2016 var544365 -rw-r–r–. 1 root root 3 Jan 28 20:55 a.txtinode 索引节点编号:544365文件类型 :文件类型是’-',表示这是一个普通文件文件权限:rw-r–r-- 表示文件可读、可写、可执行,文件所归属的用户组可读可执行,其他用户可读可执行硬链接个数 表示a.txt这个文件没有其他的硬链接,因为连接数是1,就是他本身文件属主 表示这个文件所属的用户,这里的意思是a.txt文件被root用户拥有,是第一个root文件属组 表示这个文件所属的用户组,这里表示a.txt文件属于root用户组,是第二个root文件大小 文件大小是3个字节文件修改时间 这里的时间是该文件最后被更新(包括文件创建、内容更新、文件名更新等)的时间可用如下命令查看文件的修改、访问、创建时间[root@localhost data]# stat a.txt File: `a.txt' Size: 3 Blocks: 8 IO Block: 4096 regular file Device: 803h/2051d Inode: 544365 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-01-28 20:56:01.965885036 +0800 ----------访问时间 Modify: 2018-01-28 20:55:27.181876154 +0800 ----------修改时间 Change: 2018-01-28 20:55:27.181876154 +0800 ----------创建时间索引节点inode硬盘分区,格式化、创建文件系统被格式化的磁盘分为两部分:第一部分是Inode 第二部分是blockblock是用来存储实际数据用的,例如:照片、视频等普通文件数据inode是用来存储这些数据的属性的(也就是ls-l的结果)inode包含的属性信息有文件大小、属主、归属的用户组、读写权限、问价类型、修改时间,还有指向文件实体指针的功能(inode节点----block的对应关系),但是唯独不包含文件名访问一个文件【通过文件名找到inode---->block 】查看inode 大小[root@localhost ~]# dumpe2fs /dev/sda1|grep -i "Inode size" dumpe2fs 1.41.12 (17-May-2010) Inode size: 128
1.1 SecureCRT工具介绍SecureCRT是一款支持SSH(SSH1和SSH2)协议的终端仿真软件,常被用来运行于Windows下远程登录UNIX或Linux服务器。SecureCRT软件功能强大,不仅仅支持SSH协议,同时还支持Telnet、RLogin、Serial和TAPI等协议,它有非常多的功能,这里就不一一介绍了,常用功能可见下文介绍。与SecureCRT类似功能的SSH软件还有Xshell、Putty等。SecureCRT、Xshell、Putty等都仅仅是客户端软件,一般用于Windows客户端计算机,因此,无论选择哪款客户端SSH工具都是可以的。1.2 SecureCRT工具安装由于是在Windows下安装,安装步骤简单,按提示一路下一步就可以安装完成。这提供SecureCRT5.1.3下载地址。链接:http://pan.baidu.com/s/1c2OwWqW 密码:qe4e。注意:SecureCRT需要注册之后才能使用 具体注册码在下载文件的 说明.txt1.3配置SecureCRT连接Linux主机①安装SecureCRT之后打开,并且单击快速链接按钮如图1.1所示②选在协议SSH2,然后填入Linux主机IP,端口号,用户名③以上三步骤如果顺利的话就可以连接到LInux主机1.4调整SecureCRT终端显示和回滚缓冲区大小为了更加方便的使用SecureCRT,首先得对终端进行一些调整,步骤如下:通过SecureCRT顶端菜单中的“选项”→“会话选项”,打开会话选项窗口,然后单击左侧菜单“终端”→“仿真”,并勾选右边的“ANSI颜色”,再到终端右边选择“Linux”,最后设置缓冲区大小,单击“确定”完成设置具体调整参数如下① 调整“终端”→“仿真”的ANSI颜色,并且最终将终端选为Linux(也可以选择Xterm)目的是让Linux命令行看起来更舒服,如果是开发Shell、Python程序,更有利于代码展示。② 调整回滚区的目的是为了当操作内容过多时,想看操作过得记录,可以向上翻得更远一些1.5调整字体及光标颜色通过SecureCRT顶端菜单中的“选项”→“会话选项”,打开会话选项窗口,然后单击左侧菜单“终端”→“外观”在上图中单击“颜色”,在基本颜色出选择光标颜色,这儿选择绿色,利于保护眼睛1.6 配置记录SSH操作日志及输出设置在SecureCRT中记录执行命令及屏幕输出日志,可以更加方便的查看过去操作过的配置、命令及结果输出(日志文件格式可以设置为%H_%Y%M%D.log,这样设置之后,日志文件名将以主机IP_年、月、日的形式记录)。具体设置如下图配置说明① 在上图中一定要勾选“在连接上启动记录”,如果不勾选则不会记录② 要勾选“追加到文件”1.7 配置本地机器上传和下载目录在会话管理界面,单击左侧菜单“Xmodem/Zmodem”,然后可在右侧目录中设置上传和下载目录(上传和下载目录可以是同一个,但必须是系统中有的目录)设置完毕之后就可以通过SecureCRT的命令行实现客户端计算机和Linux主机的文件上传。下面是相关上传和下载命令的使用① rz、sz命令的安装*安装 系统时选择包含rz、sz命令包组、即(Dial-up networking Support)*安装系统之后执行yum install lrzsz -y或yum groupinstall"Dial-up Networking Support"-y 命令来安装②上传命令rz上传文件时,执行rz命令,如果希望是覆盖服务器上的同文件内容,可以加-y参数,输入rz -y 后回车,会打开一个上传文件的窗口,然后选择文件上传即可③下载命令sz下载文件时,执行sz filename,如果希望覆盖本地同名文件,则可以输入-y参数控制sz -y filename,默认下载地址即为刚才配置的下载路径④使用rz、sz命令注意事项只能上传和下载文件,不能上传和下载目录,如果是上传和下载目录需要打包成文件之后再传上传文件可以是计算机里任意文件、下载文件会下载到SecureCRT配置的对应路径执行rz命令按钮回车后出现的窗口中,一定不要勾最下方的“以ASCII方式上传文件”,否则会遇到问题1.8 调整命令行颜色方案(目录和注释)默认情况下命令行界面目录和文件内容注释都是深蓝色的,看不清楚,这时候就需要我们调整颜色“选项”→“全局选项”,然后在全局选项左侧单击“ANSI颜色”,右侧就出现相应颜色,将右边颜色选为浅蓝色
2023年02月