scp拷贝文件报错

问题现象:

scp拷贝文件时报错,文件传输被取消。报错信息如下:

“tput: No value for $TERM and no -T specified”

image

 问题原因:

前段时间在系统上/etc/profile.d/目录下新增了一个脚本,修改了PS1变量。脚本内容如下:

red=$(tput setaf 1)
green=$(tput setaf 2)
blue=$(tput setaf 4)
reset=$(tput sgr0)
PS1='\[$red\]\u\[$reset\]@\[$green\]\h\[$reset\]:\[$blue\]\w\[$reset\]\$ '

这段代码的本意是对PS1中的内容进行着色,理论上仅需要在交互式shell中生效。但上述写法会导致总是生效。

scp登录时,不需要启动交互式bash,所以环境变量TERM没有被设置。

 

解决方案:

将上述脚本修改如下:

#判断是否是交互式bash,仅在交互式bash下执行
if shopt -q login_shell; then
    red=$(tput setaf 1)
    green=$(tput setaf 2)
    blue=$(tput setaf 4)
    reset=$(tput sgr0)
    PS1='\[$red\]\u\[$reset\]@\[$green\]\h\[$reset\]:\[$blue\]\w\[$reset\]\$ '
fi

还有另一种判断方式:

#判断是否是交互式bash,仅在交互式bash下执行
#下列命令中,判断bash的设置中是否包含"i",包含则表示是交互式bash。
#将"i"之前的字符串,一直到"i"删除,然后判断是否和"$-"的原始值是否相等。
if [ "${-#*i}" != "$-" ]; then red=$(tput setaf 1) green=$(tput setaf 2) blue=$(tput setaf 4) reset=$(tput sgr0) PS1='\[$red\]\u\[$reset\]@\[$green\]\h\[$reset\]:\[$blue\]\w\[$reset\]\$ ' fi

 

再次执行scp命令,拷贝文件成功。

image

 

参考资料:

scp gives the warning "TERM environment variable not set" - Red Hat Customer Portal

 

posted @ 2025-09-08 18:35  苍然满关中  阅读(18)  评论(0)    收藏  举报