From 6f08f9447a15067d8e8a42aad9fa65ed51bf3acd Mon Sep 17 00:00:00 2001 From: dushixiang Date: Sat, 17 Jan 2026 17:39:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=20agent=20=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/handler/agent_install_handler.go | 12 ++++++++- web/src/admin/pages/Agents/AgentInstall.tsx | 30 ++++++++++----------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/internal/handler/agent_install_handler.go b/internal/handler/agent_install_handler.go index d9ddab5..1a318e7 100644 --- a/internal/handler/agent_install_handler.go +++ b/internal/handler/agent_install_handler.go @@ -3,6 +3,7 @@ package handler import ( "fmt" "net/http" + "strings" "github.com/dushixiang/pika" "github.com/dushixiang/pika/pkg/version" @@ -73,6 +74,13 @@ func getServerURL(c echo.Context) string { return scheme + "://" + host } +func bashSingleQuote(value string) string { + if value == "" { + return "''" + } + return "'" + strings.ReplaceAll(value, "'", "'\"'\"'") + "'" +} + func (h *AgentHandler) GetServerUrl(c echo.Context) error { serverUrl := getServerURL(c) return orz.Ok(c, orz.Map{ @@ -89,6 +97,8 @@ func (h *AgentHandler) GetInstallScript(c echo.Context) error { // 使用统一的 getServerURL 函数获取服务器地址(支持反向代理) serverUrl := getServerURL(c) + customName := strings.TrimSpace(c.QueryParam("name")) + customNameLiteral := bashSingleQuote(customName) script := `#!/bin/bash set -e @@ -112,7 +122,7 @@ echo_warn() { } # 解析参数 -AGENT_NAME_CUSTOM="" +AGENT_NAME_CUSTOM=` + customNameLiteral + ` while [[ $# -gt 0 ]]; do case $1 in --name) diff --git a/web/src/admin/pages/Agents/AgentInstall.tsx b/web/src/admin/pages/Agents/AgentInstall.tsx index 4e436af..b6f1635 100644 --- a/web/src/admin/pages/Agents/AgentInstall.tsx +++ b/web/src/admin/pages/Agents/AgentInstall.tsx @@ -37,7 +37,7 @@ const AgentInstall = () => { const [selectedOS, setSelectedOS] = useState(DEFAULT_OS); const [apiKeys, setApiKeys] = useState([]); const [selectedApiKey, setSelectedApiKey] = useState(''); - const [customHostname, setCustomHostname] = useState(''); + const [customAgentName, setCustomAgentName] = useState(''); const [loading, setLoading] = useState(true); // 服务器地址相关状态 @@ -132,12 +132,10 @@ const AgentInstall = () => { if (!backendServerUrl || !selectedApiKey) { return ''; } - let cmd = `curl -fsSL ${backendServerUrl}/api/agent/install.sh?token=${selectedApiKey} | sudo bash`; - if (customHostname) { - cmd = `curl -fsSL ${backendServerUrl}/api/agent/install.sh?token=${selectedApiKey} | sudo bash -s -- --name "${customHostname}"`; - } - return cmd; - }, [backendServerUrl, selectedApiKey, customHostname]); + const trimmedName = customAgentName.trim(); + const nameParam = trimmedName ? `&name=${encodeURIComponent(trimmedName)}` : ''; + return `curl -fsSL ${backendServerUrl}/api/agent/install.sh?token=${selectedApiKey}${nameParam} | sudo bash`; + }, [backendServerUrl, selectedApiKey, customAgentName]); // API Key 选择器选项 const apiKeyOptions = useMemo( @@ -243,19 +241,19 @@ const AgentInstall = () => {
- 自定义主机名 (可选,留空则使用系统主机名) + 自定义名称 (可选,留空则使用主机名)
setCustomHostname(e.target.value)} + placeholder="请输入自定义名称,例如: my-server-01" + value={customAgentName} + onChange={e => setCustomAgentName(e.target.value)} className="w-full" allowClear />
- ), [apiKeys, selectedApiKey, apiKeyOptions, loading, customHostname]); + ), [apiKeys, selectedApiKey, apiKeyOptions, loading, customAgentName]); // 一键安装组件 const InstallByOneClick = useCallback(() => ( @@ -350,6 +348,8 @@ ${agentCmd} version`; const getManualInstallSteps = useCallback((os: OSType): InstallStep[] => { const config = osConfigs[os]; + const trimmedName = customAgentName.trim(); + if (os.startsWith('windows')) { return [ { @@ -362,7 +362,7 @@ Invoke-WebRequest -Uri "${backendServerUrl}${config.downloadUrl}?key=${selectedA }, { title: '2. 注册探针', - command: `.\\${AGENT_NAME_EXE} register --endpoint "${backendServerUrl}" --token "${selectedApiKey}"${customHostname ? ` --name "${customHostname}"` : ''}` + command: `.\\${AGENT_NAME_EXE} register --endpoint "${backendServerUrl}" --token "${selectedApiKey}"${trimmedName ? ` --name "${trimmedName}"` : ''}` }, { title: '3. 验证安装', @@ -390,14 +390,14 @@ curl -L "${backendServerUrl}${config.downloadUrl}?key=${selectedApiKey}" -o ${AG }, { title: '4. 注册探针', - command: `sudo ${AGENT_NAME} register --endpoint "${backendServerUrl}" --token "${selectedApiKey}"${customHostname ? ` --name "${customHostname}"` : ''}` + command: `sudo ${AGENT_NAME} register --endpoint "${backendServerUrl}" --token "${selectedApiKey}"${trimmedName ? ` --name "${trimmedName}"` : ''}` }, { title: '5. 验证安装', command: `sudo ${AGENT_NAME} status` } ]; - }, [osConfigs, backendServerUrl, selectedApiKey, customHostname]); + }, [osConfigs, backendServerUrl, selectedApiKey, customAgentName]); // 手动安装组件 const InstallByManual = useCallback(() => (