通过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
相关产品推荐
相关产品推荐

