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,功能正常