修复v2: 改进stdin重定向方式

- 移除全局 exec < /dev/tty,避免管道执行中断
- 在每个read命令中单独指定 < /dev/tty
- 兼容 curl|bash 和 bash <(...) 两种执行方式
- 版本号 v1.0.2
This commit is contained in:
WanWanYun
2025-11-10 23:05:01 +08:00
parent 9f2ae24772
commit 20d852027f

View File

@@ -8,9 +8,6 @@
set -e
# 重定向标准输入到终端,解决管道执行时无法读取用户输入的问题
exec < /dev/tty
# 颜色定义
RED='\033[0;31m'
@@ -167,7 +164,7 @@ choose_mirror() {
echo ""
while true; do
read -p "请输入选项 [1-2]: " mirror_choice
read -p "请输入选项 [1-2]: " mirror_choice < /dev/tty
case $mirror_choice in
1)
print_info "使用官方源"
@@ -325,7 +322,7 @@ choose_access_mode() {
echo ""
while true; do
read -p "请输入选项 [1-2]: " mode_choice
read -p "请输入选项 [1-2]: " mode_choice < /dev/tty
case $mode_choice in
1)
USE_DOMAIN=true
@@ -349,7 +346,7 @@ choose_access_mode() {
configure_domain() {
echo ""
while true; do
read -p "请输入您的域名 (例如: wwy.example.com): " DOMAIN
read -p "请输入您的域名 (例如: wwy.example.com): " DOMAIN < /dev/tty
if [[ -z "$DOMAIN" ]]; then
print_error "域名不能为空"
continue
@@ -373,7 +370,7 @@ configure_domain() {
print_warning "域名未解析到当前服务器IP"
print_info "域名解析IP: $DOMAIN_IP"
print_info "当前服务器IP: $PUBLIC_IP"
read -p "是否继续? (y/n): " continue_choice
read -p "是否继续? (y/n): " continue_choice < /dev/tty
if [[ "$continue_choice" == "y" || "$continue_choice" == "Y" ]]; then
break
fi
@@ -413,7 +410,7 @@ choose_ssl_method() {
echo ""
while true; do
read -p "请输入选项 [1-8]: " ssl_choice
read -p "请输入选项 [1-8]: " ssl_choice < /dev/tty
case $ssl_choice in
1|2|3|4|5|6|7|8)
SSL_METHOD=$ssl_choice
@@ -472,7 +469,7 @@ ssl_fallback() {
echo ""
while true; do
read -p "请选择备选方案 [2-4/8]: " retry_choice
read -p "请选择备选方案 [2-4/8]: " retry_choice < /dev/tty
case $retry_choice in
2)
deploy_acme_letsencrypt && return 0
@@ -589,8 +586,8 @@ deploy_aliyun_ssl() {
print_warning "此功能需要您提供阿里云AccessKey"
echo ""
read -p "阿里云AccessKey ID: " ALIYUN_ACCESS_KEY_ID
read -p "阿里云AccessKey Secret: " ALIYUN_ACCESS_KEY_SECRET
read -p "阿里云AccessKey ID: " ALIYUN_ACCESS_KEY_ID < /dev/tty
read -p "阿里云AccessKey Secret: " ALIYUN_ACCESS_KEY_SECRET < /dev/tty
# 这里需要调用阿里云API申请证书
# 暂时返回失败,提示用户使用其他方案
@@ -603,8 +600,8 @@ deploy_tencent_ssl() {
print_warning "此功能需要您提供腾讯云SecretKey"
echo ""
read -p "腾讯云SecretId: " TENCENT_SECRET_ID
read -p "腾讯云SecretKey: " TENCENT_SECRET_KEY
read -p "腾讯云SecretId: " TENCENT_SECRET_ID < /dev/tty
read -p "腾讯云SecretKey: " TENCENT_SECRET_KEY < /dev/tty
# 这里需要调用腾讯云API申请证书
# 暂时返回失败,提示用户使用其他方案
@@ -620,7 +617,7 @@ deploy_manual_ssl() {
print_info "- 证书文件: /tmp/ssl_cert.crt"
print_info "- 私钥文件: /tmp/ssl_key.key"
echo ""
read -p "上传完成后按回车继续..."
read -p "上传完成后按回车继续..." < /dev/tty
if [[ -f /tmp/ssl_cert.crt ]] && [[ -f /tmp/ssl_key.key ]]; then
mkdir -p /etc/nginx/ssl
@@ -644,7 +641,7 @@ create_project_directory() {
if [[ -d "$PROJECT_DIR" ]]; then
print_warning "项目目录已存在"
read -p "是否删除并重新创建? (y/n): " recreate
read -p "是否删除并重新创建? (y/n): " recreate < /dev/tty
if [[ "$recreate" == "y" || "$recreate" == "Y" ]]; then
rm -rf "$PROJECT_DIR"
else
@@ -683,7 +680,7 @@ configure_admin_account() {
echo ""
while true; do
read -p "管理员用户名 [默认: admin]: " ADMIN_USERNAME
read -p "管理员用户名 [默认: admin]: " ADMIN_USERNAME < /dev/tty
ADMIN_USERNAME=${ADMIN_USERNAME:-admin}
if [[ ${#ADMIN_USERNAME} -lt 3 ]]; then
@@ -694,14 +691,14 @@ configure_admin_account() {
done
while true; do
read -s -p "管理员密码至少6位: " ADMIN_PASSWORD
read -s -p "管理员密码至少6位: " ADMIN_PASSWORD < /dev/tty
echo ""
if [[ ${#ADMIN_PASSWORD} -lt 6 ]]; then
print_error "密码至少6个字符"
continue
fi
read -s -p "确认密码: " ADMIN_PASSWORD_CONFIRM
read -s -p "确认密码: " ADMIN_PASSWORD_CONFIRM < /dev/tty
echo ""
if [[ "$ADMIN_PASSWORD" != "$ADMIN_PASSWORD_CONFIRM" ]]; then
print_error "两次密码不一致"