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

通过Shell脚本SSH连接后,脚本结束时如何进入Docker容器终端?

解决SSH远程执行脚本后进入Docker容器的TTY问题

问题原因

通过SSH远程执行docker exec -it时,即便SSH使用了-t参数,远程会话的TTY传递仍可能不充分,导致容器无法分配交互式终端,进而出现the input device is not a TTY错误。

修复方案

1. 强制SSH分配TTY

将SSH的-t参数替换为-tt,强制为远程会话分配TTY,哪怕本地终端并非交互式环境。

2. 简化Docker exec命令

优化docker exec的写法,减少不必要的shell嵌套,确保终端交互性正常传递。

修改后的完整脚本如下:

#!/bin/bash

sshpass -p 'password' ssh -tt user@host <<'ENDSSH'

timeout 10s echo "password" | sudo -S chmod a+rwx -R /path/to/folder || echo "Timeout reached"

echo "password" | sudo -S chmod a+rwx -R /path/to/folder2

cd /path/to/folder3
docker compose up -d
docker exec -it image_name bash -c "cd /path/to/folder4 && exec bash"
ENDSSH

也可以用更简洁的方式,直接指定bash初始化时切换目录:

#!/bin/bash

sshpass -p 'password' ssh -tt user@host <<'ENDSSH'

timeout 10s echo "password" | sudo -S chmod a+rwx -R /path/to/folder || echo "Timeout reached"

echo "password" | sudo -S chmod a+rwx -R /path/to/folder2

cd /path/to/folder3
docker compose up -d
docker exec -it image_name bash --init-file <(echo "cd /path/to/folder4")
ENDSSH

关键说明

  • -tt参数:解决远程会话TTY分配不足的问题,让docker exec -it能正常获取交互式终端。
  • 简化命令结构:避免多层bash嵌套,确保终端的交互性可以从本地一直传递到容器内的shell。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:12:13