之前总结过一次个人的使用习惯,包括 Terminal、Shell 及 SSH。
在这几年碰到新的工具外加逐渐优化后,已和当初有几分不一样了,是时候重新整理一下了。
 
            2025.03.17 更新 :重新优化 config 文件引用与更新。
2023.12.20 更新 :避免 GitHub Action 出现明文敏感信息。
2023.09.01 更新 :增加自动补全的颜色修改。
           
装修一下 PowerShell 之前折腾 Terminal 的文字在 这里 。
其实 Terminal 这块变动反而是最小的,随着 Windows Terminal 逐渐成熟后,从  Fluent Terminal 转到了 Windows Terminal 而已。
配置 Starship 因为一些原因,将常用的 SSH 客户端从 WSL 换成了 PowerShell,所以就将 PowerShell 装修了一下。
开始用的 oh-my-posh ,后来发现了 Starship  速度更快更高效,就换成了这个。
直接 Scoop 安装:
 
使用记事本打开配置文件:
 
加入一条内容:
1 Invoke-Expression  (&starship init powershell)
 
重启 PowerShell 即可看到新的样式。
接着安装 PSReadLine,键入以下命令:
1 2 Install-Module  PowerShellGet -scope  CurrentUser -Force  -AllowClobber Install-Module  -Force  PSReadLine -scope  CurrentUser
 
再次打开配置文件并加入新内容:
 
1 2 3 4 5 6 7 8 Import-Module  PSReadLineSet-PSReadlineKeyHandler  -Key  Tab -Function  MenuCompleteSet-PSReadLineKeyHandler  -Key  UpArrow -Function  HistorySearchBackwardSet-PSReadLineKeyHandler  -Key  DownArrow -Function  HistorySearchForwardSet-PSReadLineOption  -ShowToolTips Set-PSReadLineOption  -PredictionSource  History Set-PSReadLineOption  -HistorySearchCursorMovesToEnd 
 
            <2023.09.01 更新> 
增加自动补全的颜色修改。
           
这个自动补全的颜色太暗了我看不习惯,之前在 Zsh 那一直用 fg=6,用取色软件取了下颜色的 Hex 值为 #56b6c2,根据 Microsoft 的 PowerShell 文档  在配置文件中加了如下这条:
1 2 3 Set-PSReadLineOption  -Colors  @ {   InlinePrediction   = '#56b6c2'  }
 
还原 Linux 命令习惯 因为用习惯了 Linux 命令,所以装一个 gow  一定程度上解决精分问题:
 
但是安装后发现有一些别名已经被 PowerShell 自己占用,这要怎么办?
首先可以通过 Get-Alias 查看已经被占用的别名,然后编辑配置文件:
 
1 2 Remove-Item  alias:ls Remove-Item  alias:curl 
 
保存后重新启动终端,发现之前被占用的别名被撤掉就可以正常工作了。
我因为用 Zsh 比较多,很喜欢 ll 这个命令,但是 gow 只提供了 ls,那我们就自己造一个。
 
1 2 3 4 5 Set-Alias  ll Set-ls -a function  Set-ls-a  { 	ls  -a  }
 
我非常喜欢它!  
来认识下 SSH 工具的新朋友 之前 这篇文字  中用了点方法来让自己比较偷懒地使用 SSH,不过在这几年的时间里,我也没闲着,逐渐打磨着我的偷懒技巧。
来,瞧瞧我们的新朋友 trzsz-ssh !
选择这个工具可以让我直接少维护一个脚本,并且还可以无缝使用 trzsz  功能,更加方便地与服务器之间传输文件。
上文提到因为一些从 WSL 换到了 PowerShell,也是因为 trzsz 无法在 Windows Terminal 套 WSL 时正常工作。
询问了作者也让我在 WSL 里调用 Windows 版的 tssh 来使用,那我寻思我不如换成 PowerShell 呢,别搁这套来套去了。
安装 tssh 及解决 SSH 代理问题 安装也很简单了,还是 scoop 直接安装:
 
之前折腾的 config 也不能白折腾呀,这边直接用上,但是直接用的话会有个小问题。
在 WSL 下,对于使用代理连接都是基于 nc 来实现的,但是 Windows 没有 nc 要怎么办呢?找到了一个替代品 connect!
所以我们先安装 connect:
 
那么问题来了,使用 nc 和使用 connect 的 ProxyCommand 是不一样的,原本的 config 不能用。
但是修改的话,又会造成 WSL 环境下无法使用了,总不能维护两套吧?
是,也不是。
config 呢,还是只维护一个,只不过 Windows 用的那个版本,可以借助 GitHub Actions 帮我转换一下。
到 GitHub 的项目上,选择 Actions 选项卡,然后点击 Simple workflow,将以下内容粘贴进去:
            <2023.12.20 更新> 
避免 GitHub Action 出现明文敏感信息。
           
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 name:  Transform  config  for  Windows on:    push:      branches:        -  main jobs:    build:      runs-on:  ubuntu-latest      steps:      -  name:  Checkout        uses:  actions/checkout@v3      -  name:  Transform  file        run:  |         cp config windows-config         sed -i 's/ProxyCommand nc -X 5 -x/ProxyCommand connect -S/' windows-config         git config user.name "${{ secrets.GIT_USER_NAME }}"         git config user.email "${{ secrets.GIT_USER_EMAIL }}"         git add windows-config         git commit -m "Auto transform"         git push 
 
然后前往项目的 Settings,左侧导航栏下方 Secrets and variables - Actions,在这里可以添加 Action 中调用信息。
上面用的 Secrets 一共有 2 个,分别是 GIT_USER_EMAIL 与 GIT_USER_NAME,分别是 GitHub 的邮箱与用户名。
这样每次在更新 config 文件时,GitHub Actions 会自动执行将 config 文件中的命令转换成 Windows 下可用的版本并提交到项目中。
拉下来的时候本地也会多了这个文件,现在直接把这个文件用上。
在 PowerShell 下编辑 config 文件:
1 2 cd  ~/.ssh notepad config
 
将下面内容粘贴进去:
1 Include ~\sshconfig\windows-config
 
记得把私钥给搬过来,这样敲一下 tssh 就可以直接用了。
根据 config 自动生成  
优化一下 之前的 config 文件里 Host 都是小写的,为了打起来方便,因为毕竟常用的机器还是直接 ssh hostname 连上去了嘛。
但这样有个问题是,在 tssh 的列表中也是小写的了。
不过发现没有,上面的截图中首字母大写了,怎么做到的呢?
其实只是用了一点小技巧,在配置 config 文件的时候先写首字母大写的内容,也就是想显示给 tssh 的,然后再加小写的内容并以 * 结尾,就如下例所示:
1 2 3 4 5 6 7 # 测试平台 Host Test test*         HostName 192.168.50.167         Port 22         User root         IdentityFile ~/.ssh/id_rsa         IdentitiesOnly yes
 
tssh 会忽略掉有通配符的配置项,利用这点既保留了平常的便捷性,又保证了列表的美观。
同理对于 git 的代理也可以使用此方法在列表中隐藏:
1 2 3 4 # GitHub Host github.com*         User git         ProxyCommand nc -X 5 -x 127.0.0.1:37777 %h %p
 
最后再写个 alias 把 tssh 映射给 ssc:
 
 
顺便把 WSL 那边也维护一下,以便临时使用时保证使用习惯一致。
切换到 WSL,打开之前配置好的 Shell 配置文件(以下以 Zsh 为例):
 
删掉 ssc 的那条 alias。
            2025.03.17 更新 :重新优化 config 文件引用与更新。
           
编辑 ssh 的 config 文件使用 Include 引入配置,这样就不用脚本每次覆盖 config 文件了。
 
1 Include  /mnt/ c/Users/ 7 inaWork-Windows/sshconfig/ config
 
将上游的分发脚本修改一下,就有了下面的新脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #!/bin/sh  SHELL_FOLDER=$(cd  "$(dirname "$0 " ) " ;pwd )cd  $SHELL_FOLDER  git pullcd  ~ FIND_ZSH_FILE="./.zshrc"  FIND_BASH_FILE="./.bashrc"  FIND_STR1="sshconfig.sh"  FIND_STR2="tssh" if  [ ! -f $FIND_ZSH_FILE  ]; then          exit  1elif  [ `grep -c "$FIND_STR1 "  $FIND_ZSH_FILE ` -eq '0'  ];then          echo  "alias sshconfig='$SHELL_FOLDER /sshconfig.sh'"  >> ./.zshrcfi if  [ ! -f $FIND_ZSH_FILE  ]; then          exit  1elif  [ `grep -c "$FIND_STR2 "  $FIND_ZSH_FILE ` -eq '0'  ];then          echo  "alias ssc='/usr/bin/tssh'"  >> ./.zshrcfi if  [ `grep -c "$FIND_STR1 "  $FIND_BASH_FILE ` -eq '0'  ];then          echo  "alias sshconfig='$SHELL_FOLDER /sshconfig.sh'"  >> ./.bashrcfi if  [ `grep -c "$FIND_STR2 "  $FIND_BASH_FILE ` -eq '0'  ];then          echo  "alias ssc='/usr/bin/tssh'"  >> ./.bashrcfi 
 
当然别忘记给 WSL 里也装好 tssh,这样就没问题了。
最后如果想在 PowerShell 下更新 sshconfig,可以加一条 alias:
 
1 2 3 4 5 6 Set-Alias  sshconfig Set-sshconfig function  Set-sshconfig  { 	Set-Location  "C:\Users\7inaWork-Windows\sshconfig"  	git pull --rebase  }
 
因为改用 Include 来引用配置,只需要直接更新就 OK。
小小改造下服务器的 Zsh 这几年在服务器上经常 curl ip.fm 来查看服务器本机 IP,于是决定把 IP 写在一个随时能看到的地方。
Zsh 和 Oh My Zsh 的安装 之前  说过这里就跳过不表,我在服务器端统一使用 ys 这个主题,这次就来改造一下这个。
1 cp  ~/.oh-my-zsh/themes/ys.zsh-theme ~/.oh-my-zsh/themes/myys.zsh-theme
 
然后准备好要写上的服务器 IP:
1 ip=$(curl ip.fm | grep -o -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" )
 
如果要用内网 IP 标识的话,直接手动写:
 
然后对复制出来的主题进行操作:
1 sed -i 's/\%{\$bg\[yellow\]\%}\%{\$fg\[black\]\%/\%{\$fg\[yellow\]\%/'  ~/.oh-my-zsh/themes/myys.zsh-theme && sed -i "s/{\$fg\[green\]\%}\%m/{\$fg\[green\]\%}\%m\%{\$fg\[blue\]\%} \<$ip \>\%{\$reset_color\%}/"  ~/.oh-my-zsh/themes/myys.zsh-theme && sed -i 's/\%{\$terminfo\[bold\]\$fg\[red\]\%}\$/\%{\$terminfo\[bold\]\$fg\[green\]\%}\❯/'  ~/.oh-my-zsh/themes/myys.zsh-theme
 
最后更改下 Zsh 的主题:
1 sed -i 's/ZSH_THEME="ys"/ZSH_THEME="myys"/'  ~/.zshrc
 
初始化后即可生效。
 
效果还行吧!  
写在最后 其实之前在 WSL 上经常碰到一个问题是 Zsh 的进程无法正常消灭,卡在那里会占用不少的 CPU,并且只能通过任务管理器方式来关闭,虽然不是经常碰到,但也十分烦人。
现在这个问题随着使用习惯的更改也解决了,真好!
附上最后的配置文件,仅供参考。
    
      
      
        
          1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 Invoke-Expression  (&starship init powershell)Import-Module  PSReadLineSet-PSReadlineKeyHandler  -Key  Tab -Function  MenuCompleteSet-PSReadLineKeyHandler  -Key  UpArrow -Function  HistorySearchBackwardSet-PSReadLineKeyHandler  -Key  DownArrow -Function  HistorySearchForwardSet-PSReadLineOption  -ShowToolTips Set-PSReadLineOption  -PredictionSource  History Set-PSReadLineOption  -HistorySearchCursorMovesToEnd Set-PSReadLineOption  -Colors  @ {   InlinePrediction   = '#56b6c2'  }Remove-Item  alias:ls Remove-Item  alias:curl Set-Alias  ssc tsshSet-Alias  ll Set-ls -a function  Set-ls-a  { 	ls  -a  }Set-Alias  sshconfig Set-sshconfig function  Set-sshconfig  { 	Set-Location  "C:\Users\7inaWork-Windows\sshconfig"  	git pull --rebase  }$Env:http_proxy ="" $Env:https_proxy ="" $Env:all_proxy ="" Set-Alias  pon Set-Local -Proxy Set-Alias  pof Clear-Local -Proxy function  Set-Local-Proxy  {     $Env:http_proxy ="http://127.0.0.1:37777"      $Env:https_proxy ="http://127.0.0.1:37777"      $Env:all_proxy ="socks5://127.0.0.1:37777"      Write-Host  "------- Proxy ON! -------"  }function  Clear-Local-Proxy  {     $Env:http_proxy =""      $Env:https_proxy =""      $Env:all_proxy =""      Write-Host  "------- Proxy OFF! ------"  }