Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ sudo dnf install ./jumpserver-client_*.rpm

### Supported Connection Types

- **SSH/Telnet** - Terminal connections (PuTTY, XShell, SecureCRT, iTerm2)
- **SSH/Telnet** - Terminal connections (PuTTY, XShell, SecureCRT, iTerm2, Ghostty)
- **RDP** - Remote Desktop Protocol for Windows servers
- **VNC** - Virtual Network Computing for remote desktop access
- **Database Connections**:
Expand Down
2 changes: 1 addition & 1 deletion README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ sudo dnf install ./jumpserver-client_*.rpm

### 支持的连接类型

- **SSH/Telnet** - 终端连接(PuTTY、XShell、SecureCRT、iTerm2)
- **SSH/Telnet** - 终端连接(PuTTY、XShell、SecureCRT、iTerm2、Ghostty
- **RDP** - Windows 服务器的远程桌面协议
- **VNC** - 用于远程桌面访问的虚拟网络计算
- **数据库连接**:
Expand Down
2 changes: 1 addition & 1 deletion docs/plugins/DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ sequenceDiagram
| Windows | terminal | putty |
| Windows | remotedesktop | mstsc |
| Windows | filetransfer | winscp(可选) |
| macOS | terminal | terminal, iterm |
| macOS | terminal | terminal, iterm, ghostty |
| macOS | remotedesktop | 系统 RDP(open) |
| Linux | terminal | 系统 terminal |
| Linux | remotedesktop | xfreerdp, tigervnc |
Expand Down
24 changes: 24 additions & 0 deletions go-client/pkg/awaken/awaken_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,30 @@ func awakenSSHCommand(r *Rouse, cfg *config.AppConfig) (*exec.Cmd, error) {
scriptPath := filepath.Join(currentPath, "Scripts", "iterm2_loader.scpt")
//command = fmt.Sprintf(`%s "%s"`, scriptPath, command)
cmd = exec.Command("osascript", "-s", "h", scriptPath, itermCmd, "0")
} else if appItem.Name == "ghostty" {
// Ghostty has no "do script" AppleEvent; `open -na --args -e` only works
// cleanly on a cold start. Once Ghostty is already running, that path
// triggers a security confirmation and, if allowed, a broken extra tab.
// Its AppleScript dictionary avoids both, cold or warm. "wait after
// command" keeps the surface open once the client exits. "activate"
// runs last since calling it earlier opens Ghostty's own default tab;
// the window-count check picks new tab vs. new window so repeat
// connections land in the existing window instead of a new one.
ghosttyCmd := strings.NewReplacer(`\`, `\\`, `"`, `\"`).Replace(
fmt.Sprintf("%s %s", clientPath, commands),
)
script := fmt.Sprintf(`tell application "Ghostty"
set cfg to new surface configuration
set command of cfg to "%s"
set wait after command of cfg to true
if (count of windows) > 0 then
new tab in (front window) with configuration cfg
else
new window with configuration cfg
end if
activate
end tell`, ghosttyCmd)
cmd = exec.Command("osascript", "-e", script)
} else {
cmd = exec.Command(
"osascript", "-s", "h", "-e", fmt.Sprintf(`tell application "%s" to do script "%s %s" activate`,
Expand Down
5 changes: 5 additions & 0 deletions plugins/macos/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
"name": "dbeaver",
"category": "databases"
},
{
"id": "macos.ghostty",
"name": "ghostty",
"category": "terminal"
},
{
"id": "macos.iterm",
"name": "iterm",
Expand Down
16 changes: 16 additions & 0 deletions plugins/macos/macos.ghostty/connect.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
{
"platform": "macos",
"match_first": [],
"is_default": false,
"is_set": false,
"is_internal": true,
"executable": {
"type": "bundled",
"default": "Ghostty"
},
"launch": {
"type": "args",
"template": "{protocol} {username}@{host} -p {port} -P {value}"
},
"display_name": "Ghostty"
}
Binary file added plugins/macos/macos.ghostty/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
20 changes: 20 additions & 0 deletions plugins/macos/macos.ghostty/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"id": "macos.ghostty",
"name": "ghostty",
"display_name": "Ghostty",
"version": "1.0.0",
"min_client_version": "4.1.3",
"author": "JumpServer",
"homepage": "https://github.com/jumpserver/clients",
"download_url": "https://ghostty.org/download",
"category": "terminal",
"protocols": [
"ssh",
"telnet"
],
"builtin": true,
"comment": {
"zh": "Ghostty是一款快速、功能丰富、跨平台的终端模拟器。\n\n!!!手动下载安装,点击保存启用!!!",
"en": "Ghostty is a fast, feature-rich, cross-platform terminal emulator.\n\n!!!Manually download and install, click Save to activate!!!"
}
}
Binary file added ui/assets/images/ghostty.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions ui/components/SettingItems/settingItems.vue
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const { setAppConfig } = useSettingManager();

const imagesMap: Record<string, string | undefined> = {
iterm: getImageByName("item2"),
ghostty: getImageByName("ghostty"),
dbeaver: getImageByName("dbeaver"),
heidisql: getImageByName("heidisql"),
mstsc: getImageByName("mstsc"),
Expand Down