解决Mac iTerm2使用rz和sz不支持expect命令问题

1.问题

用的Mac,iterm2 登录服务器,写的脚本登录服务器,里面用到了expect命令。
Mac和服务器都安装了sz rz 工具,但是用sz从服务器下载文件,一直处于假死的状态,虽然提示了文件传输成功,但是到本地文件夹也没找到。

使用item2配置了登录生产跳板机的配置

 

login-jumper.exp脚本

#!/usr/bin/expect
#set host 0.0.0.0 #这里写需要连接的服务器Ip

# 设置一个变量,传入的参数,0 表示第一个参数,同时也为了复用,毕竟不只是管理一台服务器

set TERMSERV xxxxxx
set PORT xxxxx
set USER xxxxx
set PASSWORD xxxx
#set UATUN
#set UATPWD 456

# 登录跳板机
spawn ssh -p $PORT -l $USER $TERMSERV

# expect是expect环境的一个内部命令,判断上一个指令输入之后的得到输出结果是否包含""双引号里的字符串,比如后面的"*password:*",表示上一个输出结果包含password:*通配符表示前后可以是任意字符

#类似于编程中的 switch语句,exp_continue相当于 continue
expect {
        "yes/no" {send "yes\r";exp_continue;}
         "*Password:*" { send "$PASSWORD\r" }
        }
# 登录内网
#expect "*$USER@*" {send #"ssh -l $UATUN $host\r"}
#expect {
#        "yes/no" {send "yes\r";exp_continue;}
#        "*password:*" { send "$UATPWD\r" }
#        }
interact
# 执行完成后保持交互状态,把控制权交给控制台

使用rz命令上传文件,显示上传成功,但是无法查看到文件

 原因:使用expect自动登录后,不支持使用rz和sz命令

2.解决方案

增加一个脚本,脚本开头可以加入:export LC_CTYPE=en_US

将本地的LC_CTYPE环境变量设置成en_US,这样再用expect脚本自动登录,登录成功就可以使用rz 和sz传输文件了

推荐:将此变量放在脚本里设置,这样只是影响当前连接远程机器但session,如果设置在.bash_profile脚本里,则可能会有中文显示乱码问题。

新增脚本login.sh(可共用)

#!/bin/sh
basepath=$(cd `dirname $0`; pwd)
export LC_CTYPE=en_US
#expect脚本所在位置
filepath=$1
if [ -f $filepath ]; then
  expect $filepath
else
  echo "$filepath not exits"
fi

$1:可执行expect脚本文件路径

3.配置iterm2-profiles文件

4.验证结果

重新连接,验证rz/sz,功能正常 

猜你喜欢

转载自blog.csdn.net/weixin_38023225/article/details/106467873