You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SSH远程执行脚本出现stty相关ioctl报错的原因及解决方法

报错原因
  • 你在ssh命令中添加了-t参数,该参数的作用是强制为远程SSH会话分配伪终端,但你同时使用了<< EOF(Here Document)的方式向SSH进程传递输入,这种重定向类的输入属于非交互式输入,没有关联的终端设备属性。
  • 远程服务器的shell初始化脚本(如/etc/profile、~/.bashrc等)中存在调用stty配置终端参数的逻辑,stty无法识别非终端类型的标准输入,就会抛出该错误。
  • 业务功能正常执行是因为你写的sed、echo、cat等核心命令不需要依赖终端配置,只有初始化阶段的stty调用报错,不影响后续命令运行。
解决方案

最优方案:删除多余的-t参数

你当前的执行逻辑全是非交互式的批量命令,完全不需要伪终端支持,直接删掉ssh命令中的-t参数即可彻底解决报错,修改后的脚本如下:

#!/bin/bash
echo "IP: $1"
sshpass -p 'pass' ssh -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@$1 << EOF
    cd ../
    sed -i -e 's/x=false/x=true/g' file.txt
    echo "*** x has changed! ***"
    cat file.txt
EOF

备选方案:确需保留-t参数时的处理

如果后续有特殊命令必须依赖伪终端环境,不能删除-t参数,可以选择以下两种方式处理:

  • 修改远程服务器的shell初始化脚本,在文件最开头添加非交互式判断逻辑,非交互模式下直接跳过后续配置:
    # 放在~/.bashrc或者/etc/profile的最开头
    if [ -z "$PS1" ]; then
        return
    fi
    
  • 临时屏蔽stty错误输出,在ssh命令末尾添加重定向规则,只过滤stty的报错(不推荐直接屏蔽所有错误输出,会影响正常问题排查):
    sshpass -p 'pass' ssh -t -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no root@$1 << EOF 2> >(grep -v "stty: standard input: Inappropriate ioctl for device" >&2)
        cd ../
        sed -i -e 's/x=false/x=true/g' file.txt
        echo "*** x has changed! ***"
        cat file.txt
    EOF
    

内容的提问来源于stack exchange,提问作者Yuval Froman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:06:04