Kubernetes v1.25脚本执行报tty错误,v1.22正常求助
问题分析与解决方案
问题根源
核心原因是脚本中通过管道给sudo -S传递密码的方式,破坏了TTY终端的传递链:
- 手动执行时,
sudo直接从终端读取密码,stdin关联的是真实终端,后续kubectl exec -it能正常获取TTY资源; - 脚本里用
echo '$password' | sudo -S时,sudo的stdin被替换为管道(非终端),sudo会切换到非交互式模式,导致后续kubectl exec -it无法获取有效的TTY,从而抛出unable to use a tty错误。
解决方案
方案1:使用sudo的ASKPASS机制传递密码(无需修改sudoers)
通过sudo的-A参数配合自定义脚本传递密码,避免占用终端stdin,保留TTY给kubectl:
- 在目标Kubernetes机器上创建
/usr/local/bin/sudo_askpass.sh脚本:
#!/bin/sh echo "$SUDO_PASSWORD"
- 给脚本添加执行权限:
chmod +x /usr/local/bin/sudo_askpass.sh
- 修改本地执行脚本:
sshpass -p $password ssh -t $kubernetes-login "export SUDO_PASSWORD='$password' && export SUDO_ASKPASS=/usr/local/bin/sudo_askpass.sh && pwd && sudo -A kubectl exec -it $pod -c $container -n $namespace -- /bin/sh"
方案2:配置sudo免密执行kubectl(更简洁)
如果环境允许,调整目标机器的sudoers配置,让登录用户执行kubectl时无需输入密码:
- 在目标机器执行
visudo,添加一行(替换your_login_user为实际登录用户名):
your_login_user ALL=(ALL) NOPASSWD: /usr/bin/kubectl
- 修改本地脚本,去掉管道传密码的逻辑:
sshpass -p $password ssh -t $kubernetes-login "pwd && sudo kubectl exec -it $pod -c $container -n $namespace -- /bin/sh"
对疑问的回应
- sudo导致TTY冲突?:不是sudo本身的问题,是脚本中管道传密码的方式破坏了TTY传递。手动执行时sudo从终端读密码,stdin是真实终端,所以TTY能正常传递给kubectl;
- exec -i正常但-it不行?:
-i只需要标准输入,不需要TTY资源;而-it需要同时关联stdin和TTY,必须保证kubectl能拿到有效的终端环境; - pwd正常说明登录没问题?:是的,登录、密码验证环节都正常,问题出在sudo与kubectl的TTY传递环节。
内容的提问来源于stack exchange,提问作者Michael Norton
相关产品推荐
相关产品推荐

