SSH远程连接脚本需按Ctrl+C才执行touch问题及修改建议
问题解决:SSH执行远程命令卡住无响应的修正方案
核心问题分析
你的脚本中ssh执行远程df -h时卡住,本质是SSH默认会从当前终端读取标准输入,导致脚本挂起等待输入,必须手动中断才能继续。添加-t -t强制分配终端反而可能在无交互场景下引发更多问题,不是正确的解决方向。
可行修改方案
方案1:禁用SSH的标准输入读取(最直接)
给SSH添加-n参数,该参数会自动将SSH的标准输入重定向到/dev/null,避免它等待输入:
#!/bin/bash if ssh -o StrictHostKeyChecking=no -n userid@serverip 'df -h'; then echo "Conn Success" # 注意:以下操作是在本地执行,如果你要操作远程目录,需看方案3 array12=( /home/uid/test /home/uid/test1 /home/uid/test/ght ) for dir in "${array12[@]}";do # 修正逻辑:目录不存在时先创建目录,否则touch会失败 if [[ ! -d "$dir" ]] then mkdir -p "$dir" && touch "$dir/testfile123.txt" else echo "Failed to create file under dir: $dir" fi done exit else echo "Failure to connect" exit 1 fi
方案2:添加超时机制,防止无限挂起
如果担心远程连接或命令执行超时,可以加上ConnectTimeout和ServerAliveInterval参数,强制超时退出:
ssh -o StrictHostKeyChecking=no -n -o ConnectTimeout=10 -o ServerAliveInterval=5 userid@serverip 'df -h'
ConnectTimeout=10:连接超时10秒ServerAliveInterval=5:每5秒发送一次存活探测,避免连接无响应挂起
方案3:修正远程目录操作逻辑(如果你的目标是远程服务器)
原脚本中的目录循环是在本地机器执行的,如果你实际想在远程服务器创建文件,需要把这部分逻辑放到SSH的远程命令中,同时修正目录不存在时的创建逻辑:
#!/bin/bash if ssh -o StrictHostKeyChecking=no -n userid@serverip ' # 远程执行df -h df -h # 远程定义目录数组 array12=( /home/uid/test /home/uid/test1 /home/uid/test/ght ) # 远程执行目录和文件操作 for dir in "${array12[@]}"; do if [[ ! -d "$dir" ]]; then # 先递归创建目录,再创建文件 mkdir -p "$dir" && touch "$dir/testfile123.txt" echo "Created file in new dir: $dir" else echo "Dir exists, skip creating file: $dir" fi done '; then echo "Remote connection and operations completed successfully" else echo "Failed to connect to remote server or execute commands" exit 1 fi
关键修正点总结
- 用
-n参数解决SSH等待输入的问题,替代-t -t - 目录不存在时必须先执行
mkdir -p创建父目录,否则touch会失败 - 明确区分本地/远程操作逻辑,避免执行位置错误
内容的提问来源于stack exchange,提问作者naikum
相关产品推荐
相关产品推荐

