TeraTerm ttl脚本登录wsl

目录

  • [一. 需求](#一. 需求)
  • [二. 配置免密码启动ssh](#二. 配置免密码启动ssh)
  • [三. 获取wsl的ip的powershell脚本](#三. 获取wsl的ip的powershell脚本)
  • [四. 登录脚本](#四. 登录脚本)

一. 需求

🔷当配置完成wsl之后,可以在Windows Terminal的设置中进行如下配置后快速进入wsl。

但是Windows Terminal并没有办法保存执行过程中的log,对日开发一般使用TeraTerm作为ssh工具,TeraTerm自带记录操作log的功能。

本文介绍如何使用TeraTermttl脚本登录wsl。

🔷思路

  • 先启动wsl的ssh功能
  • 再获取wsl的ip地址
    • 使用powershell获取
    • 由于ttl脚本无法获取powershell的执行结果,因此使用powershell先将ip地址保存到临时文件中
    • 然后使用ttl脚本读取临时文件,获取ip地址
  • 然后使用ttl脚本登录

二. 配置免密码启动ssh

🔷wsl中的linux系统的ssh默认是关闭的,需要使用sudo service ssh start来启动。但是使用ttl脚本调用启动命令的时候,没有办法自动输入密码。因此需要先在wsl中配置免密码使用启动命令。

  • service ssh start放入NOPASSWD对应组即可
  • sudo的详细讲解,请参考这篇文章 → Linux sudo命令
bash 复制代码
apluser@FengYeHong-HP:~$ ls -l /etc/sudoers.d/
total 12
-r--r----- 1 root root  655 Dec 30 08:48 01-config
-r--r----- 1 root root  233 Dec 20 11:33 30-io-logging
-r--r----- 1 root root 1096 Feb  8  2022 README
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ sudo cat /etc/sudoers.d/01-config
# ---------------------------
# 禁止的命令
# ---------------------------
Cmnd_Alias FORBIDDEN = \
    /usr/bin/sh, \
    /usr/bin/bash, \
    /bin/rm, \
    /usr/bin/vi, \
    /usr/bin/vim, \
    /usr/bin/nano, \
    /usr/sbin/visudo, \
    /usr/bin/cp

# ---------------------------
# 允许的命令
# ---------------------------
Cmnd_Alias ALLOW = \
    /usr/bin/grep, \
    /usr/bin/ls, \
    /usr/bin/cat, \
    /usr/sbin/service ssh start

# 但是只允许执行无密码执行特定的命令
apluser ALL=(ALL) NOPASSWD:ALLOW

# 禁止指定的命令
apluser ALL=(ALL) !FORBIDDEN
apluser@FengYeHong-HP:~$

三. 获取wsl的ip的powershell脚本

🔷02-get_wsl_ip_address.ps1

💥注意:

  • 文件一定不能有bom字符,否则ttl脚本在读取的时候,会把bom字符也当做ip地址的一部分,从而导致登录失败。
  • windows电脑自带的Powershell5Out-File并不支持保存文件为无bom的utf-8
  • 因此使用下面这种方式将文件保存为无bom的utf-8格式。
powershell 复制代码
param(
    [string]$WSL_NAME,
    [string]$tmp_wsl_ip_address_full_temp_path
)

# 根据wsl的名称获取wsl的ip地址
$wsl_ip_address = (wsl -d "$WSL_NAME" -e hostname -I).Trim();
[System.IO.File]::WriteAllText(
    "$tmp_wsl_ip_address_full_temp_path",
    "$wsl_ip_address",
    # $false 表示不使用BOM
    (New-Object System.Text.UTF8Encoding($false))
)

四. 登录脚本

bash 复制代码
; 定义连接服务器的变量参数
WSL_NAME = 'Ubuntu_22.04'
USERNAME = 'apluser'
PASSWORD = 'apluser'

; 创建保存wsl的ip地址的文件路径
call create_save_wsl_ip_address_temp_filepath

; 创建存储wsl的ip地址的临时文件
call create_wsl_ip_address_temp_file

; 读取wsl的ip地址到变量中
call read_wsl_ip_address_to_var

;=====================================================================
; 开启wsl中的ssh服务
;   "hide"
;       执行时隐藏窗口
;   1
;       启动中的程序执行完毕之前, 等待
;       程序启动完毕之后, 会把结束code保存到系统变量result中
;=====================================================================
sprintf2 start_wsl_ssh "wsl -d %s -- sudo service ssh start" WSL_NAME
exec start_wsl_ssh 'hide' 1

; 格式化连接服务器的命令
sprintf2 COMMAND "%s:22 /ssh /2 /auth=password /user=%s /passwd=%s" HOSTADDR USERNAME PASSWORD

; 连接服务器
connect COMMAND
wait '$'

; 结束当前ttl脚本
end

; 创建保存wsl的ip地址的临时文件
:create_save_wsl_ip_address_temp_filepath
    ; 随机生成0到1000的随机数
    random tmp_file_random_num1 1000
    random tmp_file_random_num2 1000

    ; 拼接存放ip地址的文件路径
    sprintf2 tmp_wsl_ip_address_name 'wsl_ip_address_%d_%d.txt' tmp_file_random_num1 tmp_file_random_num2
    ; 从环境变量中获取临时文件的路径
    getenv 'TEMP' tmp_folder_path
    sprintf2 tmp_wsl_ip_address_full_temp_path '%s\%s' tmp_folder_path tmp_wsl_ip_address_name
return

; 创建存储wsl的ip地址的临时文件
:create_wsl_ip_address_temp_file
    ; 获取当前ttl脚本的文件夹
    getdir ttl_folder_path
    ; 拼接powershell脚本所在的绝对路径
    sprintf2 ps_file_path '%s\%s' ttl_folder_path '02-get_wsl_ip_address.ps1'

    ; 指定powershell脚本, 获取wsl的ip地址, 并把ip地址存储到临时路径中
    sprintf2 get_wsl_ip_cmd 'powershell -NoProfile -ExecutionPolicy RemoteSigned -File "%s" -WSL_NAME "%s" -tmp_wsl_ip_address_full_temp_path "%s"' ps_file_path WSL_NAME tmp_wsl_ip_address_full_temp_path
    exec get_wsl_ip_cmd 'hide' 1
return

; 读取wsl的ip地址到变量中
:read_wsl_ip_address_to_var
    ; 指针在文件开头
    ; 只读模式打开文件
    fileopen wsl_ip_address_handle tmp_wsl_ip_address_full_temp_path 0 1

    ; 读取文件的第一行
    filereadln wsl_ip_address_handle line
    HOSTADDR = line

    ; 关闭文件句柄
    fileclose wsl_ip_address_handle

    ; 删除临时存放wsl的ip地址的文件
    filedelete tmp_wsl_ip_address_full_temp_path
return
相关推荐
乌托邦的逃亡者2 小时前
Linux中如何检测IP冲突
linux·运维·tcp/ip
一曦的后花园2 小时前
linux搭建promethes并对接node-exporter指标
linux·运维·服务器
乌托邦的逃亡者3 小时前
CentOS/Openeuler主机中,为一个网卡设置多个IP地址
linux·运维·网络·tcp/ip·centos
念恒123063 小时前
进程控制---自定义Shell
linux·c语言
风曦Kisaki4 小时前
# Linux Shell 编程入门 Day02:条件测试、if 判断、循环与随机数
linux·运维·chrome
李日灐4 小时前
< 6 > Linux 自动化构建工具:makefile 详解 + 进度条实战小项目
linux·运维·服务器·后端·自动化·进度条·makefile
嵌入式×边缘AI:打怪升级日志4 小时前
嵌入式Linux开发:开源组件、第三方库与许可证详解
linux
计算机安禾5 小时前
【Linux从入门到精通】第34篇:搭建FTP与Samba——跨平台文件共享解决方案
linux·运维·服务器
日取其半万世不竭5 小时前
用 Netdata 实时监控服务器,比 Prometheus + Grafana 轻量得多
linux·服务器·网络·系统架构·负载均衡·zabbix·grafana