<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>轩辕阁</title><link>https://blog.tianjinkun.com/</link><description>轩楼男孩的博客</description><item><title>在域控制器中设置域内计算机的默认浏览器</title><link>https://blog.tianjinkun.com/post/120.html</link><description>&lt;p&gt;可以通过下发组策略来覆系统的默认浏览器设置，操作如下：&lt;/p&gt;&lt;p&gt;在系统中新建一个目录，并创建一个DefautlChrome.xml的文件，这里我在C盘创建了Config目录：&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697944453686117.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;DefaultChrome.xml文件内容如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;DefaultAssociations&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Association&amp;nbsp;Identifier=&amp;quot;.htm&amp;quot;&amp;nbsp;ProgId=&amp;quot;ChromeHTML&amp;quot;&amp;nbsp;ApplicationName=&amp;quot;Google&amp;nbsp;Chrome&amp;quot;&amp;nbsp;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Association&amp;nbsp;Identifier=&amp;quot;.html&amp;quot;&amp;nbsp;ProgId=&amp;quot;ChromeHTML&amp;quot;&amp;nbsp;ApplicationName=&amp;quot;Google&amp;nbsp;Chrome&amp;quot;&amp;nbsp;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Association&amp;nbsp;Identifier=&amp;quot;http&amp;quot;&amp;nbsp;ProgId=&amp;quot;ChromeHTML&amp;quot;&amp;nbsp;ApplicationName=&amp;quot;Google&amp;nbsp;Chrome&amp;quot;&amp;nbsp;/&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;lt;Association&amp;nbsp;Identifier=&amp;quot;https&amp;quot;&amp;nbsp;ProgId=&amp;quot;ChromeHTML&amp;quot;&amp;nbsp;ApplicationName=&amp;quot;Google&amp;nbsp;Chrome&amp;quot;&amp;nbsp;/&amp;gt;
&amp;lt;/DefaultAssociations&amp;gt;&lt;/pre&gt;&lt;p&gt;设置刚才创建的文件夹为共享文件夹，域内计算机/用户可读权限：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;text-wrap: wrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697944851743638.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;该文件夹的网络共享路径为：&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697944942134977.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;那么我们的这个XML文件的地址就是：&lt;/p&gt;&lt;p&gt;\\AD\Config\DefaultChrome.xml&lt;/p&gt;&lt;p&gt;接下来打开组策略管理器，定位到林&amp;gt;域&amp;gt;你的域名下的Defaullt Domain Policy，右键编辑：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697945337601270.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;在打开的组策略管理编辑器中定位到&lt;span style=&quot;color: #FF0000;&quot;&gt;计算机配置&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;策略&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;管理模板&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;Windows组件&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;文件资源管理器&lt;/span&gt;，双击或右键&amp;quot;设置默认关联配置文件&amp;quot;进行编辑：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697945813510864.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;启用配置并设置配置文件位置即可：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697945980812928.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;重启域内计算机重新下发组策略就可以生效了。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 07 Oct 2023 16:09:48 +0800</pubDate></item><item><title>为VMware Horizon云桌面用户配置自动提权到本地Administrator权限</title><link>https://blog.tianjinkun.com/post/119.html</link><description>&lt;p&gt;通常来说，云桌面用户都需要管理员权限以便于在云桌面系统中安装软件或运行一些需要管理员权限运行的程序，但又必须限制在分配给用户的那台电脑上，不能在域控中直接赋予管理员权限，因为赋了域控管理员权限后，域管理员可以通过远程桌面(RDP)登录任意一台域内的计算机，必须限定在分配给用户的那一台上计算机上，使其只拥有这一台计算机的管理员权限，怎么做呢，可以用组策略来做。&lt;/p&gt;&lt;p&gt;打开组策略管理，定位到&lt;span style=&quot;color: #FF0000;&quot;&gt;林&lt;/span&gt;&amp;gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;域&lt;/span&gt;&amp;gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;你的域名&lt;/span&gt;，在你的域名上右键，唤出菜单栏并新建组织单位。&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697942121374234.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697942473106795.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;在创建好的组织上右键唤出菜单栏，创建GPO应在此处链接：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697942649147069.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697943054426124.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;创建完成后编辑刚刚创建的GPO：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697943152342839.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;在弹出的组策略管理编辑器中，定位到&lt;span style=&quot;color: #FF0000;&quot;&gt;用户配置&lt;/span&gt;&amp;gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;首选项&lt;/span&gt;&amp;gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;控制面板设置&lt;/span&gt;&amp;gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;本地用户和组&lt;/span&gt;，新建本地组：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697943208873371.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;组名选择Administrators(内置)，动作为添加当前用户：&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310221697943275381683.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;至此，组策略的设置已经结束，打开域控的用户和组，可以看到多出了一个刚才新建的组织AutoAdminUser，在这个组织下面新建用户，并在Horizon Admin中选择为此组织下面的用户分配计算机，即可实现普通用户在登录云桌面后自动获取管理员权限。需要注意的是，用户首次登录计算机是以域控中的普通用户登录的，登录后系统会下发组策略配置给这台计算机，用户注销会话后重新登录即可生效。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 07 Oct 2023 16:09:25 +0800</pubDate></item><item><title>为VMware Horizon 云桌面设置60Hz刷新率</title><link>https://blog.tianjinkun.com/post/118.html</link><description>&lt;p&gt;VMware Horizon 在安装部署完成之后默认的桌面刷新率为30Hz，在使用的过程中还是会有些许的卡顿感觉，可以在域控中设置刷新频率。具体操作如下：&lt;/p&gt;&lt;h4&gt;下载扩展包&lt;/h4&gt;&lt;p&gt;在VMware官网的Horizon产品下载页面中，与连接服务器等部署文件一起的，有一个VMware-Horizon-Extras-Bundle的扩展包，把他下载下来，解压之后可以看到很多的admx文件和一些zh-CN等文件夹，把这些文件夹和admx文件，上传到域控服务器的C:\Windows\PolicyDefinitions\文件夹中。&lt;/p&gt;&lt;h4&gt;编辑组策略&lt;/h4&gt;&lt;p&gt;在域控服务器中找到组策略管理器，定位到域下面的Default Domain Policy，右键编辑。&lt;br/&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310211697898070579491.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;在打开的组策略管理编辑器中定位到&lt;span style=&quot;color: #FF0000;&quot;&gt;计算机配置&lt;/span&gt;&amp;gt;策略&amp;gt;管理模板&amp;gt;VMware Blast&amp;gt;最大帧速率，双击打开编辑。&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310211697898387756727.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;从未配置改为已启用，并设置最大帧速率为60。&lt;/p&gt;&lt;p style=&quot;text-align: center;&quot;&gt;&lt;img src=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310211697898467736585.png&quot; alt=&quot;image.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;同样的，&lt;span style=&quot;text-wrap: wrap;&quot;&gt;在打开的组策略管理编辑器中定位到&lt;span style=&quot;text-wrap: wrap; color: #FF0000;&quot;&gt;用户配置&lt;/span&gt;&amp;gt;策略&amp;gt;管理模板&amp;gt;VMware Blast&amp;gt;最大帧速率，用户侧也要配置一下最大帧速率，配置后就完成了。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Sat, 07 Oct 2023 16:08:54 +0800</pubDate></item><item><title>Clover，让旧电脑支持NVMe启动</title><link>https://blog.tianjinkun.com/post/116.html</link><description>&lt;p class=&quot;ue-upload&quot; style=&quot;line-height: 16px;&quot;&gt;手上有一些X79的旧服务器，想使用NVMe硬盘做系统盘，但是BIOS太老，没有做NVMe启动的支持，有些大火的主板如广达的双子星，因为用户基数大，有大佬扒出了BIOS固件，注入了NVMe的驱动实现了BIOS级别的支持，但还有很多的老电脑是没有这个待遇的，可以用Clover，Clover是一个很小的引导程序，把他写入U盘，设置电脑从U盘启动，Clover内置了NVMe驱动，在BIOS将启动流程引导至Clover后，Clover会使用自己的NVMe驱动将NVMe硬盘进行初始化，并发现NVMe磁盘上的操作系统，讲系统的启动流程引导到NVMe磁盘的引导程序中。&lt;/p&gt;&lt;p class=&quot;ue-upload&quot; style=&quot;line-height: 16px;&quot;&gt;附上Clover引导程序：&lt;/p&gt;&lt;p class=&quot;ue-upload&quot; style=&quot;line-height: 16px;&quot;&gt;&lt;img style=&quot;vertical-align: middle; margin-right: 2px;&quot; src=&quot;https://blog.tianjinkun.com/zb_system/image/filetype/zip.png&quot;/&gt;&lt;a style=&quot;font-size:12px; color:#0066cc;&quot; href=&quot;https://blog.tianjinkun.com/zb_users/upload/2023/10/202310211697875360314183.zip&quot; title=&quot;Clover.zip&quot;&gt;Clover.zip&lt;/a&gt;&lt;/p&gt;</description><pubDate>Mon, 30 Jan 2023 15:59:57 +0800</pubDate></item><item><title>Golang中exec.Command执行系统命令后Stderr错误重定向的详细研究</title><link>https://blog.tianjinkun.com/post/115.html</link><description>&lt;p&gt;经常用Golang中的exec.Command去调用系统命令，像这样：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;:=&amp;nbsp;exec.Command(&amp;quot;showmount&amp;quot;,&amp;nbsp;&amp;quot;-e&amp;quot;,&amp;nbsp;&amp;quot;192.168.1.5&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;cmd.Output()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err.Error())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(string(result))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;来运行&amp;quot;showmount -e&amp;nbsp;192.168.1.5&amp;quot;这个命令，命令执行正常则从result中取出结果就可，但如果运行不正常呢？大部分的程序都是将错误信息打印到标准错误输出，也就是stderr，在终端中，如果执行命令出现了stderr，会将其打印在屏幕上，但其不是stdout，golang中无法从result中获取错误信息，err.Error也无法获取，因为它只返回错误代码，像这样：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@program&amp;nbsp;~]#&amp;nbsp;showmount&amp;nbsp;-e&amp;nbsp;192.168.1.5
Export&amp;nbsp;list&amp;nbsp;for&amp;nbsp;192.168.1.5:
/nfs&amp;nbsp;&amp;nbsp;192.168.0.0/255.255.0.0
[root@program&amp;nbsp;~]#&amp;nbsp;showmount&amp;nbsp;-e&amp;nbsp;192.168.1.6
clnt_create:&amp;nbsp;RPC:&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;receive
[root@program&amp;nbsp;~]#&amp;nbsp;go&amp;nbsp;run&amp;nbsp;main.go&amp;nbsp;#192.168.1.6
exit&amp;nbsp;status&amp;nbsp;1&lt;/pre&gt;&lt;p&gt;这时候，老手应该会想起来用2&amp;gt;&amp;amp;1把stderr重定向stdout，比较这是编写shell脚步经常用到的。你可能会这样写：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;:=&amp;nbsp;exec.Command(&amp;quot;showmount&amp;quot;,&amp;nbsp;&amp;quot;-e&amp;quot;,&amp;nbsp;&amp;quot;192.168.1.6&amp;quot;,&amp;nbsp;&amp;quot;2&amp;gt;&amp;amp;1&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;cmd.Output()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err.Error())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(string(result))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;但是，这样做并不可取，这样写会将‘2&amp;gt;&amp;amp;1&amp;#39;作为一个参数直接传给了showmount，他并不是showmount支持的参数，各种程序对输入的参数验证强度不一，轻则无法实现重定向，重则像showmount一样直接退出运行。2&amp;gt;&amp;amp;1是Shell解释器的参数，如果要用，则应该调用shell解释器运行，像这样写：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;:=&amp;nbsp;exec.Command(&amp;quot;/bin/bash&amp;quot;,&amp;nbsp;&amp;quot;-c&amp;quot;,&amp;nbsp;&amp;quot;showmount&amp;nbsp;-e&amp;nbsp;192.168.1.6&amp;nbsp;2&amp;gt;&amp;amp;1&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result,&amp;nbsp;err&amp;nbsp;:=&amp;nbsp;cmd.Output()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;err&amp;nbsp;!=&amp;nbsp;nil&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(err.Error())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Println(string(result))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;[root@program&amp;nbsp;~]#&amp;nbsp;go&amp;nbsp;run&amp;nbsp;main.go&amp;nbsp;#192.168.1.6
clnt_create:&amp;nbsp;RPC:&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;receive&lt;/pre&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;这样一来虽然实现了想要的功能，但是还要套一层shell解释器并且多写一个2&amp;gt;&amp;amp;1，能不能在程序层面重定向stderr呢？&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;我尝试了cmd.Stderr 和&amp;nbsp;cmd.StderrPipe() 要么报错要么比调shell复杂，还是用shell了最终&lt;/p&gt;&lt;p style=&quot;white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Sat, 03 Dec 2022 15:58:02 +0800</pubDate></item><item><title>MySQL报错Prepared statement needs to be re-prepared的解决办法</title><link>https://blog.tianjinkun.com/post/114.html</link><description>&lt;p&gt;近期设计的程序，有一个用到了视图，可能是逻辑上有点复杂了吧，用数据库工具调试表的时候没有什么问题，程序运行起来就报错Prepared statement needs to be re-prepared。&lt;/p&gt;&lt;p&gt;只要修改table_definition_cache值，调大一点就可以了。&lt;/p&gt;&lt;p&gt;mysql&amp;gt; set&amp;nbsp;table_definition_cache 16384;&lt;/p&gt;&lt;p&gt;具体原因是table_definition_cache定义了打开视图时缓存多少打开表的文件具柄数量，我这个视图逻辑复杂了点，就超出了缓存定义的空间，故而报错。把他调大就好了。&lt;/p&gt;</description><pubDate>Sun, 13 Nov 2022 17:45:42 +0800</pubDate></item><item><title>GoLang中的strings.TrimRight()和strings.TrimSuffix()</title><link>https://blog.tianjinkun.com/post/112.html</link><description>&lt;p&gt;TrimRight()和TrimSuffix()字面上都是删除字符串右侧的字符，但是二者还是有很大的不同的，先看一下我写的Bug吧，用来当作错误示范。&lt;/p&gt;&lt;p&gt;期望的功能：有域名test.com，有全限定域名full.info.test.com. 我需要把域名从fqdn中去除，得到主机名，使用TrimRight函数实现的代码如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;func&amp;nbsp;main()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fqdn&amp;nbsp;:=&amp;nbsp;&amp;quot;full.info.test.com.&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;host&amp;nbsp;:=&amp;nbsp;strings.TrimRight(fqdn,&amp;nbsp;&amp;quot;.test.com.&amp;quot;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;fqdn:%v\n&amp;quot;,[]byte(fqdn))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;fqdn:%v\n&amp;quot;,fqdn)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;host:%v\n&amp;quot;,[]byte(host))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fmt.Printf(&amp;quot;host:%v\n&amp;quot;,host)
}&lt;/pre&gt;&lt;p&gt;输出结果：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;fqdn:[102&amp;nbsp;117&amp;nbsp;108&amp;nbsp;108&amp;nbsp;46&amp;nbsp;105&amp;nbsp;110&amp;nbsp;102&amp;nbsp;111&amp;nbsp;46&amp;nbsp;116&amp;nbsp;101&amp;nbsp;115&amp;nbsp;116&amp;nbsp;46&amp;nbsp;99&amp;nbsp;111&amp;nbsp;109&amp;nbsp;46]
fqdn:full.info.test.com.
host:[102&amp;nbsp;117&amp;nbsp;108&amp;nbsp;108&amp;nbsp;46&amp;nbsp;105&amp;nbsp;110&amp;nbsp;102]
host:full.inf&lt;/pre&gt;&lt;p&gt;可以看到，这段代码并没有按我所期望的运行，输出了“host:full.inf“，而不是”host:full.info“&lt;/p&gt;&lt;p&gt;到pkg.go.dev看源码，发现TrimRight 返回字符串 s 的一个切片，其中包含在 cutset 中的所有尾随 Unicode 代码点都被删除。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-go&quot;&gt;//&amp;nbsp;TrimRight&amp;nbsp;returns&amp;nbsp;a&amp;nbsp;slice&amp;nbsp;of&amp;nbsp;the&amp;nbsp;string&amp;nbsp;s,&amp;nbsp;with&amp;nbsp;all&amp;nbsp;trailing
//&amp;nbsp;Unicode&amp;nbsp;code&amp;nbsp;points&amp;nbsp;contained&amp;nbsp;in&amp;nbsp;cutset&amp;nbsp;removed.
//
//&amp;nbsp;To&amp;nbsp;remove&amp;nbsp;a&amp;nbsp;suffix,&amp;nbsp;use&amp;nbsp;TrimSuffix&amp;nbsp;instead.
func&amp;nbsp;TrimRight(s,&amp;nbsp;cutset&amp;nbsp;string)&amp;nbsp;string&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;s&amp;nbsp;==&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;||&amp;nbsp;cutset&amp;nbsp;==&amp;nbsp;&amp;quot;&amp;quot;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;s
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;len(cutset)&amp;nbsp;==&amp;nbsp;1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;cutset[0]&amp;nbsp;&amp;lt;&amp;nbsp;utf8.RuneSelf&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;trimRightByte(s,&amp;nbsp;cutset[0])
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;as,&amp;nbsp;ok&amp;nbsp;:=&amp;nbsp;makeASCIISet(cutset);&amp;nbsp;ok&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;trimRightASCII(s,&amp;nbsp;&amp;amp;as)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;trimRightUnicode(s,&amp;nbsp;cutset)
}&lt;/pre&gt;&lt;p&gt;所以，删除后缀一定要用TrimSuffix()而不是TrimRight()&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 07 Nov 2022 10:25:01 +0800</pubDate></item><item><title>Nginx alias 设置别名将站点子目录重定向到其他目录</title><link>https://blog.tianjinkun.com/post/109.html</link><description>&lt;p&gt;通常来说，Nginx配置中使用root字段来配置站点的根目录，URL中的子目录会映射到对应站点根目录下的子目录，但如果想要映射到其他地方怎么办，用alias&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;server
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen&amp;nbsp;80;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;server_name&amp;nbsp;my.domain.com;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;index&amp;nbsp;index.php&amp;nbsp;index.html&amp;nbsp;index.htm&amp;nbsp;default.php&amp;nbsp;default.htm&amp;nbsp;default.html;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root&amp;nbsp;/www/wwwroot/;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/data/&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp;/opt/my/data/;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;location&amp;nbsp;/library/&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;alias&amp;nbsp;/opt/my/data/library/;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;当访问my.domain.com/index.html、my.domain.com/user/等URL时，对应的文件目录就是&lt;span style=&quot;text-wrap: wrap;&quot;&gt;&amp;nbsp;/www/wwwroot/ ；而当访问my.domain.com/data/my.jpg时，则由&lt;span style=&quot;text-wrap: wrap;&quot;&gt;/opt/my/data/提供资源。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 19 Sep 2022 11:02:27 +0800</pubDate></item><item><title>JetBrains全家桶在CentOS下无法正常使用中文输入法的解决办法</title><link>https://blog.tianjinkun.com/post/107.html</link><description>&lt;p&gt;在CentOS\Ubuntu等Linux系统下使用GoLand、PyCharm、IDEA等JetBrains全家桶软件时，中文输入法全拼输入1个汉字以上时，就无法输入了。解决办法是：&lt;/p&gt;&lt;p&gt;在软件菜单栏点Help&amp;gt;Edit Custom VM options…&lt;/p&gt;&lt;p&gt;添加&amp;nbsp;-Drecreate.x11.input.method=true 到最后一行，保存，重启软件即可。&lt;/p&gt;</description><pubDate>Mon, 19 Sep 2022 08:52:36 +0800</pubDate></item><item><title>Linux Shell脚本的具名传参</title><link>https://blog.tianjinkun.com/post/106.html</link><description>&lt;p&gt;在linux shell中编写的脚本，在需要传参的时候，通常是在脚本后面用空格隔开各个参数，从而实现把参数传到脚本里面：&lt;/p&gt;&lt;p&gt;[root@public ~]# bash myscript.sh param1&amp;nbsp;param2&amp;nbsp;param3&lt;/p&gt;&lt;p&gt;在脚本中通过$1、$2、$3这样一个美元符号加数字获取参数&lt;/p&gt;&lt;p&gt;#!/bin/bash&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;echo&amp;nbsp;&amp;quot;param1&amp;nbsp;is&amp;nbsp;$param1&amp;quot;
echo&amp;nbsp;&amp;quot;param2&amp;nbsp;is&amp;nbsp;$param2&amp;quot;
echo&amp;nbsp;&amp;quot;param3&amp;nbsp;is&amp;nbsp;$param3&amp;quot;&lt;/pre&gt;&lt;p&gt;可以看出，这种传参方式是强顺序相关的，当需要的参数多了之后，使用体验就会变的很糟糕。&lt;/p&gt;&lt;p&gt;可以使用getopts进行具名获取&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#!/bin/bash
while&amp;nbsp;getopts&amp;nbsp;&amp;quot;:sn:i:d:p:&amp;quot;&amp;nbsp;opt;&amp;nbsp;do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;$opt&amp;nbsp;in
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;n)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;选项-$opt的值是$OPTARG&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;s)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;选项-$opt&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;选项-$opt的值是$OPTARG&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;选项-$opt的值是$OPTARG&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;选项-$opt的值是$OPTARG&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;选项-$OPTARG后面需要一个参数值&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;?)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&amp;quot;无效的选项&amp;nbsp;-$OPTARG&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&amp;nbsp;2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esac
done&lt;/pre&gt;&lt;p&gt;注意getopts是shell内建命令，支持从单字符的传参，如-u parameter1，如果是-url&amp;nbsp;parameter1则不支持。可以换用getopt。&lt;/p&gt;</description><pubDate>Thu, 15 Sep 2022 15:28:14 +0800</pubDate></item></channel></rss>