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

