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

Bash脚本sudo切换用户执行时read无法接收输入导致无限循环

问题原因

你使用<<'EOF' Here文档结构给sudo -u piggy -i传递执行脚本时,整个sudo进程的标准输入(stdin)被绑定到了Here文档的内容流,而非当前交互终端(/dev/tty)。当脚本执行到read install_to_default语句时,read尝试从stdin读取用户输入,但此时Here文档的内容已经全部读取完毕,处于EOF状态,read会直接读取失败,变量install_to_default始终为空,永远满足循环判断条件[[ -z $install_to_default || $install_to_default != [yYnN] ]],最终触发无限循环。

解决方法

方法1:指定read从交互终端读取输入

直接修改read语句的输入源为当前终端设备/dev/tty,不受当前stdin重定向影响:

sudo -u piggy -i <<'EOF'
while
    echo "Do you want to continue y/n?"
    read install_to_default < /dev/tty
    [[ -z $install_to_default || $install_to_default != [yYnN] ]]
do echo "The response is invalid. A valid response is y or n."; done
EOF

方法2:不用Here文档传递脚本,直接通过sudo执行命令字符串

避免用Here文档占用stdin,改为用bash -c传递要执行的脚本内容,stdin默认保留为当前终端:

sudo -u piggy -i bash -c '
while
    echo "Do you want to continue y/n?"
    read install_to_default
    [[ -z $install_to_default || $install_to_default != [yYnN] ]]
do echo "The response is invalid. A valid response is y or n."; done
'

方法3:将循环逻辑写到独立脚本文件,通过sudo调用该脚本

把需要以piggy身份执行的逻辑单独存为脚本文件,比如/home/piggy/check_input.sh,赋予执行权限后直接用sudo运行,stdin不会被重定向:

# 赋予脚本执行权限
chmod +x /home/piggy/check_input.sh
# 切换piggy用户执行脚本
sudo -u piggy -i /home/piggy/check_input.sh

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 14:06:02