美文网首页
由 Linux 转移到 windows 环境折腾小记

由 Linux 转移到 windows 环境折腾小记

作者: AIHorse | 来源:发表于2022-12-01 17:57 被阅读0次

    以前项目都是部署到Centos的Linux环境下的,所以对部署在windows server上的一些不是很熟。
    给工作带来了一些不便,总想用linux那套命令行工具,于是就有了该篇折腾记。

    该篇主要目的实际就是折腾个轻便的轻量的,能尽量用windows自带的工具实现查windows server 上的tomcat log。

    实际不够轻量的各种ssh shell工具也都可以,只是登录的是linux的话一点事的都没有。
    登录的是windows server的话,各种麻烦就来了,首当其冲就是中文乱码问题。然后就是各种直接看日志,搜索查找内容命令行都是古老的cmd 下的命令。

    大家用Linux的一般会用到bash 或Mac下的zsh ,和下边的一些命令行工具。那么windows下目前最强大的就是powershell了。
    默认win10系统的powershell 是5.1版本的。5.1和7.2.1差别很大,参考https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/differences-from-windows-powershell?view=powershell-7.2

    一、 powershell 7.2

    包管理器 winget scoop choco

    https://www.cnblogs.com/baiqiantao/p/8891301.html
    大家用Linux会用到yum 或apt 包管理命令,Mac下就是homebrew包管理命令,实际上windows上也有了以上三个包管理器了。

    经过各种测试,折腾,建议winget首选,毕竟微软自家的,scoop次选。

    scoop提供的类linux可在win环境下用的包还是很多的,常见的有如下:

    🦄  scoop list
    Installed apps:
    
      7zip 21.07 [main]
      busybox 4487-gd239d2d52 [main]
      cacert 2022-02-01 [main]
      curl 7.81.0 [main]
      gcc 11.2.0 [main]
      jq 1.6 [main]
      neovim 0.6.1 [main]
      sudo 0.2020.01.26 [main]
    
    

    curl wget(wget有独立的包,busybox也包含wget)等都是常用的。
    neovim 就是linux界的编辑神器了,完全释放你的鼠标,一顿“啪 啪 啪”敲键盘。。。

    choco 不建议。以前接触过,就是安装nodejs依赖工具,有个命令行工具

    这玩意实际就是自动给你安装上choco,然后安装扩展工具。但这个choco安装什么都需要管理员权限的powershell,不太喜欢,后续用它安装一些包也有一些问题。

    1、安装powershell最新版

    1.1 选用winget 方式来安装powershell

    https://docs.microsoft.com/zh-cn/windows/package-manager/winget/#production-recommended

      先去系统微软应用商店搜winget 安装即可。也可去github 找最新的稳定发布版安装。
    

    1.2 下图 7.2.1 既是稳定的winget微软官方源发布的,安装该版本

    image.png
    winget install --id Microsoft.Powershell --source winget 用该命令即可安装
    

    你也可以安装下上图的最新的Windows Terminal 。
    建议您先安装最新的Windows Terminal ,再在Windows Terminal 下去用winget命令行安装powershell7,然后 设置powershell7是默认启动shell,然后再去参考本文去安装其它内容。


    image.png

    1.3 必要的设置与美化

     主要是为了类似bash的提示prompt
    

    https://docs.microsoft.com/zh-cn/windows/terminal/tutorials/custom-prompt-setup
    我就直接整理给出最后正确的命令了。

    先安装字体

    https://www.nerdfonts.com/font-downloads

    image.png

    选的这个,因为vscode 、 IDEA等工具用起来也很好。
    Windows Terminal 设置中使用该字体

    安装 oh-my-posh

    https://ohmyposh.dev/docs/windows
    winget install JanDeDobbeleer.OhMyPosh

    浏览并选择一个主题
    https://ohmyposh.dev/docs/themes

    OhMyPosh主题本地存放路径
    C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes

    本地执行Get-PoshThemes浏览主题效果
    Archer@cmd  ~  Get-PoshThemes
    Please enter the themes path: C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes

    输入 PROFILE 查询你的 PowerShell Profile 文件位置: PowerShell 7 PS C:\Users\Archer>PROFILE
    C:\Users\Archer\Documents\PowerShell\Microsoft.PowerShell_profile.ps1

    PowerShell 5 也就是系统自带的
    PS C:\Users\Archer> $PROFILE
    C:\Users\Archer\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

    在 PowerShell 7 执行 notepad编辑 PROFILE
    notepad $PROFILE

    Import-Module oh-my-posh
    oh-my-posh --init --shell pwsh --config C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes/fish.omp.json | Invoke-Expression
    这样保存重启pwh后就基本上看到主题效果了

    遇到的问题:
    powershell 7 执行
    Archer@cmd  ~  . $PROFILE
    Import-Module: C:\Users\Archer\Documents\PowerShell\Microsoft.PowerShell_profile.ps1:1
    Line |
    1 | Import-Module oh-my-posh
    | ~~~~~~~~~~~~~~~~~~~~~~~~
    | The specified module 'oh-my-posh' was not loaded because no valid module file was found in any module directory.

    在powershell 7 下再执行下安装,可能7是独立的需要再执行下边命令单独安装下。
    使用 PowerShell,通过以下命令安装 Oh My Posh:Install-Module oh-my-posh -Scope CurrentUser

    其他插件:找的许多古老的资料安装了 posh-git,这里是教你如果装了怎么卸载干净。
    Oh-My-Posh 3 (目前已经是 7.多版本的了)本身已经支持 Powerline,不需要额外下载 posh-git
    Install-Module posh-git -Scope CurrentUser
    卸载掉posh-git:
    您必须从C:\Users[yourUser]\Documents\WindowsPowerShell\modules目录手动删除它。
    然后编辑 notepad $PROFILE 去掉 Import-Module posh-git

    安装 PSReadline 负责提示的插件

    https://docs.microsoft.com/zh-cn/powershell/module/psreadline/about/about_psreadline?view=powershell-7.2
    https://docs.microsoft.com/zh-cn/powershell/module/Microsoft.PowerShell.Core/about/about_history?view=powershell-7.2

    Set-PSReadLineOption -PredictionViewStyle ListView 这个配置见下效果图里的[history]历史输入提示,需要安装以下版本的PSReadLine,否则会报错。
    Install-Module -Name PSReadLine -RequiredVersion 2.2.0-beta5 -AllowPrerelease
    Import-Module PSReadLine

    安装命令行小图标显示

    Install-Module -Name Terminal-Icons -Repository PSGallery
    Import-Module -Name Terminal-Icons
    小图标效果图:


    image.png

    最后的 $Profile内容如下

    Import-Module oh-my-posh
    Import-Module PSReadLine
    Import-Module -Name Terminal-Icons
    
    #oh-my-posh --init --shell pwsh --config C:\Users\Archer\AppData\Local\Programs\oh-my-posh\themes/powerlevel10k_rainbow.omp.json | Invoke-Expression
    # Set-PoshPrompt powerlevel10k_rainbow slimfat
    Set-PoshPrompt unicorn
    
    #PSReadLine快捷键设置
    # 设置预测文本来源为历史记录
    Set-PSReadLineOption -PredictionSource History
    
    Set-PSReadLineOption -PredictionViewStyle ListView
    
    # 每次回溯输入历史,光标定位于输入内容末尾
    Set-PSReadLineOption -HistorySearchCursorMovesToEnd
    
    # 设置 Tab 为菜单补全和 Intellisense
    Set-PSReadLineKeyHandler -Key "Tab" -Function MenuComplete
    
    # 设置 Ctrl+d 为退出 PowerShell
    Set-PSReadlineKeyHandler -Key "Ctrl+d" -Function ViExit
    
    # 设置 Ctrl+z 为撤销
    Set-PSReadLineKeyHandler -Key "Ctrl+z" -Function Undo
    
    # 设置向上键为后向搜索历史记录
    Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
    
    # 设置向下键为前向搜索历史纪录
    Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
    
    

    最终效果图:


    image.png

    实际上我还 安装了一些插件如:Z
    Install-Module -Name Z -Force
    这个东西是为了快速跳转路径用的。

    powershell 微软开源后可以在各个环境下安装了win下 linux下也可以用powershell了,也提供了丰富的插件来提升你的类linux部署和命令行体验。大家有时间,可以搜下高人安装的插件来优化配置自己在win下的操作体验。

    二、tail 不中文乱码

    为了找到个靠谱的tail 可算测试了一些工具的靠谱。


    image.png

    unxutils 不靠谱,有个bug 而且年代太古老了 。unxutils 2007.03.01 ---tail.exe: write error: No space left on device 实际我的磁盘空间和权限都是好的。 卸掉!

    coreutils 不靠谱,安装完 使用直接有个错 tail.exe cannot be found, not a cmdlet 类似的。卸掉!

    scoop install busybox                                                                                                                                            ─╯
    Installing 'busybox' (4487-gd239d2d52) [64bit]
    busybox-w64-FRP-4487-gd239d2d52.exe (627.5 KB) [=============================================================================================================] 100%
    Checking hash of busybox-w64-FRP-4487-gd239d2d52.exe ... ok.
    Linking ~\scoop\apps\busybox\current => ~\scoop\apps\busybox\4487-gd239d2d52
    Creating shim for 'busybox'.
    Creating shim for 'ar'.
    Creating shim for 'arch'.
    Creating shim for 'ash'.
    Creating shim for 'awk'.
    Creating shim for 'base64'.
    Creating shim for 'basename'.
    Creating shim for 'bash'.
    Creating shim for 'bunzip2'.
    Creating shim for 'bzcat'.
    Creating shim for 'bzip2'.
    Creating shim for 'cal'.
    Creating shim for 'cat'.
    Creating shim for 'chmod'.
    Creating shim for 'cksum'.
    Creating shim for 'clear'.
    Creating shim for 'cmp'.
    Creating shim for 'comm'.
    Creating shim for 'cp'.
    Creating shim for 'cpio'.
    Creating shim for 'cut'.
    Creating shim for 'date'.
    Creating shim for 'dc'.
    Creating shim for 'dd'.
    Creating shim for 'df'.
    Creating shim for 'diff'.
    Creating shim for 'dirname'.
    Creating shim for 'dos2unix'.
    Creating shim for 'dpkg'.
    Creating shim for 'dpkg-deb'.
    Creating shim for 'du'.
    Creating shim for 'echo'.
    Creating shim for 'ed'.
    Creating shim for 'egrep'.
    Creating shim for 'env'.
    Creating shim for 'expand'.
    Creating shim for 'expr'.
    Creating shim for 'factor'.
    Creating shim for 'false'.
    Creating shim for 'fgrep'.
    Creating shim for 'find'.
    Creating shim for 'fold'.
    Creating shim for 'fsync'.
    Creating shim for 'ftpget'.
    Creating shim for 'ftpput'.
    Creating shim for 'getopt'.
    Creating shim for 'grep'.
    Creating shim for 'groups'.
    Creating shim for 'gunzip'.
    Creating shim for 'gzip'.
    Creating shim for 'hd'.
    Creating shim for 'head'.
    Creating shim for 'hexdump'.
    Creating shim for 'httpd'.
    Creating shim for 'iconv'.
    Creating shim for 'id'.
    Creating shim for 'ipcalc'.
    Creating shim for 'kill'.
    Creating shim for 'killall'.
    Creating shim for 'less'.
    Creating shim for 'link'.
    Creating shim for 'ln'.
    Creating shim for 'logname'.
    Creating shim for 'ls'.
    Creating shim for 'lzcat'.
    Creating shim for 'lzma'.
    Creating shim for 'lzop'.
    Creating shim for 'lzopcat'.
    Creating shim for 'man'.
    Creating shim for 'md5sum'.
    Creating shim for 'mkdir'.
    Creating shim for 'mktemp'.
    Creating shim for 'mv'.
    Creating shim for 'nc'.
    Creating shim for 'nl'.
    Creating shim for 'od'.
    Creating shim for 'paste'.
    Creating shim for 'patch'.
    Creating shim for 'pgrep'.
    Creating shim for 'pidof'.
    Creating shim for 'pipe_progress'.
    Creating shim for 'pkill'.
    Creating shim for 'printenv'.
    Creating shim for 'printf'.
    Creating shim for 'ps'.
    Creating shim for 'pwd'.
    Creating shim for 'readlink'.
    Creating shim for 'realpath'.
    Creating shim for 'reset'.
    Creating shim for 'rev'.
    Creating shim for 'rm'.
    Creating shim for 'rmdir'.
    Creating shim for 'rpm'.
    Creating shim for 'rpm2cpio'.
    Creating shim for 'sed'.
    Creating shim for 'seq'.
    Creating shim for 'sh'.
    Creating shim for 'sha1sum'.
    Creating shim for 'sha256sum'.
    Creating shim for 'sha3sum'.
    Creating shim for 'sha512sum'.
    Creating shim for 'shred'.
    Creating shim for 'shuf'.
    Creating shim for 'sleep'.
    Creating shim for 'sort'.
    Creating shim for 'split'.
    Creating shim for 'ssl_client'.
    Creating shim for 'stat'.
    Creating shim for 'strings'.
    Creating shim for 'su'.
    Creating shim for 'sum'.
    Creating shim for 'tac'.
    Creating shim for 'tail'.
    Creating shim for 'tar'.
    Creating shim for 'tee'.
    Creating shim for 'test'.
    Creating shim for 'time'.
    Creating shim for 'timeout'.
    Creating shim for 'touch'.
    Creating shim for 'tr'.
    Creating shim for 'true'.
    Creating shim for 'truncate'.
    Creating shim for 'ts'.
    Creating shim for 'ttysize'.
    Creating shim for 'uname'.
    Creating shim for 'uncompress'.
    Creating shim for 'unexpand'.
    Creating shim for 'uniq'.
    Creating shim for 'unix2dos'.
    Creating shim for 'unlink'.
    Creating shim for 'unlzma'.
    Creating shim for 'unlzop'.
    Creating shim for 'unxz'.
    Creating shim for 'unzip'.
    Creating shim for 'usleep'.
    Creating shim for 'uudecode'.
    Creating shim for 'uuencode'.
    Creating shim for 'vi'.
    Creating shim for 'watch'.
    Creating shim for 'wc'.
    Creating shim for 'wget'.
    Creating shim for 'which'.
    Creating shim for 'whoami'.
    Creating shim for 'whois'.
    Creating shim for 'xargs'.
    Creating shim for 'xxd'.
    Creating shim for 'xz'.
    Creating shim for 'xzcat'.
    Creating shim for 'yes'.
    Creating shim for 'zcat'.
    Running post-install script...
    INFO  creating ~/.profile
    'busybox' (4487-gd239d2d52) was installed successfully!
    

    最终这个比较靠谱,tail可以用了,但是中文是乱码。查看帮助tail --help 也没有类似控制编码的参数。 卸掉!!!实际大家可以试试busybox其他的,这个还是比较全的和稳的。可以直接在Powershell下用上这些类Linux的还是比较美的。

    最终,还是想到了git-bash,这玩意儿。。。

    这东西还是稳,自带了一些类似的linux 命令行工具。本地找了个中文的log测试了下 tail -f 是无中文乱码的。

    可以直接在powershell中切换到该bash。


    image.png

    三 查看远程windows server 上的tomcat log

    直接Powshell ssh 登录到远程某一windows server服务器。
    ssh 的配置 参考:https://cloud.tencent.com/developer/article/1420930
    ssh 默认登录的是远程机器上的cmd或terminal 需要输入Powershell 来切换到远程机器上的powershell。
    然后就可以直接用3.1节的pwh自带的 Get-Content Select-String 这些。

    3.1 直接用Powershell 自带的命令行:

     实际也排了许多坑,-Encoding utf8 比如这个 不带还是输出中文乱码的,网上有许多解决方案,都不靠谱。
    

    比如 https://www.lovesofttech.com/windows/win10CmdCharacter.html 这种都太复杂且破坏系统了,不够轻量。
    最后查到官方文档 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.2
    提供了参数 -Encoding utf8 可惜 busybox下的tail 是不提供该输出内容编码参数的,所以。。。。我卸载了busybox 和类似的coreutils。

    大家如果再轻便些,实际可以直接用以下命令来 实现tail -f grep等类似效果,就是命令太难记。
    我直接整理如下

    powershell  查看实时滚动日志:
    Get-Content .\all.log  -Tail 20 -wait   -Encoding utf8
    Get-Content .\error.log  -Tail 20 -wait   -Encoding utf8
    
    powershell 解压:
    .zip 
    Expand-Archive -Path  *.zip
    
    .gz 
    https://scatteredcode.net/download-and-extract-gzip-tar-with-powershell/   
    你们看看解压都这么麻烦,powershell下居然没有类似 tar -zxvf *.gz 的命令。
    
    powershell  搜索内容:
    
    https://blog.csdn.net/sinat_41104353/article/details/83046182
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/select-string?WT.mc_id=thomasmaurer-blog-thmaure&view=powershell-7.2
    
    文件中搜索字符串
    select-string -pattern "exception"  .\all.log
    
    匹配正则
    Select-String -Pattern "EX.*E"  .\all.log
    
    查看匹配项的前2行
    Select-String -Pattern "exception" - Context 2,0 .\all.log
    
    查看匹配项的后3行
    Select-String -Pattern "exception" -Context 0,3 .\all.log
    
    查看匹配前2行和匹配后3行
    Select-String -Pattern "exception" -Context 2,3 .\all.log
    
    匹配整个单词。给定的搜索词或字符串会部分或全部显示。 如果我们需要匹配被空格包围的整个单词,则应在搜索词前后加上空格。 我们将把exception搜索词作为一个整体进行搜索。
    Select-String -Pattern " exception " .\all.log
    
    递归搜索文件。 递归搜索将在所有当前文件夹和子文件夹中查找给定的字符串。
    Get-ChildItem -Path 文件路径 -Recurse | select-string -pattern "模式"
    Get-ChildItem c:\*.txt -Recurse | Select-String -Pattern EX
    
    Get-ChildItem -Path .\all.log  -Recurse | select-string -pattern "01-21 15:4"
    
    Get-ChildItem -Path .\all.log  -Recurse | select-string -pattern "exception"
    
    重定向输出到文件:
    select-string -pattern "exception"  .\all.log  |  Out-File exception.log -Encoding utf8
    
    select-string -pattern " Lock wait " -Context 9,9  .\all.log  |  Out-File exception.log -Encoding utf8
    select-string -pattern " exception " -Context 9,9  .\all.log  |  Out-File exception.log -Encoding utf8
    
    Get-ChildItem -Path .\all.log  -Recurse | select-string -pattern "exception"   |  Out-File exception.log -Encoding utf8 
    
    
    过滤搜索关键词:
    exception    Deadlock   Lock    timeout  
    

    3.2 用类linux 命令来查

    上述命令好是好,也满足了需求,可是比起以前的linux 的,我记不住啊。而且远程上的powershell 不可以乱部署 美化部分的内容和装一些插件。
    好就好在,远程的windows server上边有部署git,那按照二的思路,我可以在远程上的powershell 切换到远程机器上的git-bash吗?
    答案是可以的。
    见图 我由远程的ps 找到bash 就可以切换到远程机器上的bash了。


    image.png

    2022-02-14 草草编辑完。没有markdown排版。但看还是能看的。给排掉了许多坑。应该可以照抄直接用。
    目录大纲,没的选,只能选linux下边。实际应该有个 工具配置 类似的板块。管理员看到了,可以帮我转移下。

    相关文章

      网友评论

          本文标题:由 Linux 转移到 windows 环境折腾小记

          本文链接:https://www.haomeiwen.com/subject/chwhlrtx.html