base on trzsz-ssh ( tssh ) is an ssh client designed as a drop-in replacement for the openssh client. It aims to provide complete compatibility with openssh, mirroring all its features, while also offering additional useful features. Such as login prompt, batch login, remember password, automated interaction, trzsz, zmodem(rz/sz), udp mode like mosh, etc. ## trzsz-ssh ( tssh ) - an ssh client alternative that meets your needs
[](https://choosealicense.com/licenses/mit/)
[](https://github.com/trzsz/trzsz-ssh/releases)
[](https://trzsz.github.io/ssh)
[](https://trzsz.github.io/cn/ssh)
trzsz-ssh ( tssh ) is an ssh client designed as a drop-in replacement for the openssh client. It aims to provide complete compatibility with openssh, mirroring all its features, while also offering additional useful features not found in the openssh client.
trzsz-ssh ( tssh ) with [tsshd](https://github.com/trzsz/tsshd) also supports intermittent connectivity, allows roaming, and can be used on high-latency links such as cellular data connections, unstable Wi-Fi, etc.
### Basic Features
trzsz-ssh ( tssh ) works exactly like the openssh client. The following common features have been implemented:
| Features | Support Options |
| :------------: | :----------------------------------------------------------------------------------------------------------------: |
| Cipher | `-c` `Ciphers` |
| Pseudo TTY | `-t` `-T` `RequestTTY` |
| SSH Proxy | `-J` `-W` `ProxyJump` `ProxyCommand` |
| Network | `-4` `-6` `AddressFamily` `ConnectTimeout` |
| Multiplexing | `ControlMaster` `ControlPath` `ControlPersist` |
| Command | `-s` `RemoteCommand` `LocalCommand` `PermitLocalCommand` |
| X11 Forward | `-x` `-X` `-Y` `ForwardX11` `ForwardX11Trusted` `ForwardX11Timeout` |
| Known Hosts | `UserKnownHostsFile` `GlobalKnownHostsFile` `StrictHostKeyChecking` |
| SSH Agent | `-a` `-A` `ForwardAgent` `IdentityAgent` `IdentitiesOnly` `SSH_AUTH_SOCK` |
| Basic Login | `-l` `-p` `-i` `-F` `HostName` `Port` `User` `IdentityFile` `SendEnv` `SetEnv` |
| Authentication | `PubkeyAuthentication` `PasswordAuthentication` `KbdInteractiveAuthentication` `GSSAPIAuthentication` |
| Port Forward | `-g` `-f` `-N` `-L` `-R` `-D` `LocalForward` `RemoteForward` `DynamicForward` `GatewayPorts` `ClearAllForwardings` |
| Others | `EscapeChar` |
### Extra Features
trzsz-ssh ( tssh ) offers additional useful features:
| English | 中文 |
| :---------------------------------------------------------: | :----------------------------------------------------------------------: |
| [Login Prompt](README.en.md#login-prompt) | [登录界面](README.cn.md#%E7%99%BB%E5%BD%95%E7%95%8C%E9%9D%A2) |
| [Custom Theme](README.en.md#custom-theme) | [主题风格](README.cn.md#%E4%B8%BB%E9%A2%98%E9%A3%8E%E6%A0%BC) |
| [Trzsz ( trz / tsz )](README.en.md#support-trzsz) | [支持 trz tsz](README.cn.md#%E6%94%AF%E6%8C%81-trzsz) |
| [Zmodem ( rz / sz )](README.en.md#support-zmodem) | [支持 rz sz](README.cn.md#%E6%94%AF%E6%8C%81-zmodem) |
| [Support scp sftp](README.en.md#support-scp-sftp) | [支持 scp sftp](README.cn.md#%E6%94%AF%E6%8C%81-scp-sftp) |
| [Batch Login](README.en.md#batch-login) | [批量登录](README.cn.md#%E6%89%B9%E9%87%8F%E7%99%BB%E5%BD%95) |
| [Group Labels](README.en.md#group-labels) | [分组标签](README.cn.md#%E5%88%86%E7%BB%84%E6%A0%87%E7%AD%BE) |
| [Automated Interaction](README.en.md#automated-interaction) | [自动交互](README.cn.md#%E8%87%AA%E5%8A%A8%E4%BA%A4%E4%BA%92) |
| [Remember Password](README.en.md#remember-password) | [记住密码](README.cn.md#%E8%AE%B0%E4%BD%8F%E5%AF%86%E7%A0%81) |
| [Custom Configuration](README.en.md#custom-configuration) | [个性配置](README.cn.md#%E4%B8%AA%E6%80%A7%E9%85%8D%E7%BD%AE) |
| [Comments of Config](README.en.md#comments-of-config) | [配置注释](README.cn.md#%E9%85%8D%E7%BD%AE%E6%B3%A8%E9%87%8A) |
| [Wayland Integration](README.en.md#wayland-integration) | [Wayland 集成](README.cn.md#wayland-%E9%9B%86%E6%88%90) |
| [Clipboard Integration](README.en.md#clipboard-integration) | [剪贴板集成](README.cn.md#%E5%89%AA%E8%B4%B4%E6%9D%BF%E9%9B%86%E6%88%90) |
| [SSH Console](README.en.md#ssh-console) | [SSH 控制台](README.cn.md#ssh-%E6%8E%A7%E5%88%B6%E5%8F%B0) |
| [Other Features](README.en.md#other-features) | [其他功能](README.cn.md#%E5%85%B6%E4%BB%96%E5%8A%9F%E8%83%BD) |
| [UDP Mode ( mosh )](README.en.md#udp-mode) | [UDP 模式 ( mosh )](README.cn.md#udp-%E6%A8%A1%E5%BC%8F) |
### Installation
- Install with scoop / winget / choco on Windows
<details><summary><code>scoop install tssh</code> / <code>winget install tssh</code> / <code>choco install tssh</code></summary>
```sh
scoop install tssh
```
```sh
winget install tssh
```
```sh
choco install tssh
```
</details>
- Install with Homebrew on MacOS
<details><summary><code>brew install trzsz-ssh</code></summary>
```sh
brew install trzsz-ssh
```
</details>
- Install with apt on Ubuntu
<details><summary><code>sudo apt install tssh</code></summary>
```sh
sudo apt update && sudo apt install software-properties-common
sudo add-apt-repository ppa:trzsz/ppa && sudo apt update
sudo apt install tssh
```
</details>
- Install with apt on Debian
<details><summary><code>sudo apt install tssh</code></summary>
```sh
sudo apt install curl gpg
curl -s 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x7074ce75da7cc691c1ae1a7c7e51d1ad956055ca' \
| gpg --dearmor -o /usr/share/keyrings/trzsz.gpg
echo 'deb [signed-by=/usr/share/keyrings/trzsz.gpg] https://ppa.launchpadcontent.net/trzsz/ppa/ubuntu jammy main' \
| sudo tee /etc/apt/sources.list.d/trzsz.list
sudo apt update
sudo apt install tssh
```
</details>
- Install with yum on Linux
<details><summary><code>sudo yum install tssh</code></summary>
- Install with [gemfury](https://gemfury.com/) repository.
```sh
echo '[trzsz]
name=Trzsz Repo
baseurl=https://yum.fury.io/trzsz/
enabled=1
gpgcheck=0' | sudo tee /etc/yum.repos.d/trzsz.repo
sudo yum install tssh
```
- Install with [wlnmp](https://www.wlnmp.com/install) repository. It's not necessary to configure the epel repository for tssh.
```sh
curl -fsSL "https://sh.wlnmp.com/wlnmp.sh" | bash
sudo yum install tssh
```
</details>
- Install with yay on ArchLinux
<details><summary><code>yay -S tssh</code></summary>
```sh
yay -Syu
yay -S tssh
```
</details>
- Install with Chromebrew on ChromeOS
<details><summary><code>crew install tssh</code></summary>
```sh
crew install tssh
```
</details>
- Install with Go ( Requires go 1.25 or later )
<details><summary><code>go install github.com/trzsz/trzsz-ssh/cmd/tssh@latest</code></summary>
```sh
go install github.com/trzsz/trzsz-ssh/cmd/tssh@latest
```
The binaries are usually located in ~/go/bin/ ( C:\Users\your_name\go\bin\ on Windows ).
</details>
- Build from source ( Requires go 1.25 or later )
<details><summary><code>sudo make install</code></summary>
```sh
git clone --depth 1 https://github.com/trzsz/trzsz-ssh.git
cd trzsz-ssh
make
sudo make install
```
</details>
- Download from the [GitHub Releases](https://github.com/trzsz/trzsz-ssh/releases) and install locally
<details><summary><code>download and install locally</code></summary>
```sh
sudo apt install /tmp/tssh_*.deb
sudo dpkg -i /tmp/tssh_*.deb
sudo dnf install /tmp/tssh_*.rpm
sudo yum install /tmp/tssh_*.rpm
sudo rpm -i /tmp/tssh_*.rpm
tar zxvf tssh_*.tar.gz && sudo cp tssh_*/tssh /usr/bin/
```
</details>
### Development
The `github.com/trzsz/trzsz-ssh/tssh` can be used as a library, for example:
```go
package main
import (
"log"
"os"
"github.com/trzsz/trzsz-ssh/tssh"
)
func main() {
// Example 1: execute command on remote server
client, err := tssh.SshLogin(&tssh.SshArgs{Destination: "
[email protected]"})
if err != nil {
log.Fatal(err)
}
defer client.Close()
session, err := client.NewSession()
if err != nil {
log.Fatal(err)
}
defer session.Close()
output, err := session.CombinedOutput("whoami")
if err != nil {
log.Fatal(err)
}
log.Printf("I'm %s", string(output))
// Example 2: run the tssh program
code := tssh.TsshMain([]string{"-t", "
[email protected]", "bash -l"})
os.Exit(code)
}
```
### Contributing
Welcome and thank you for considering contributing. We appreciate all forms of support, from coding and testing to documentation and CI/CD improvements.
- Fork and clone the repository `https://github.com/trzsz/trzsz-ssh.git`.
- Make your changes just ensure that the unit tests `go test ./tssh` pass.
- Build the binary `go build -o ./bin/ ./cmd/tssh` and test it `./bin/tssh`.
- Once you are happy with your changes, please submit a pull request.
### Screenshot





### Contact
Feel free to email the author <
[email protected]>, or create an [issue](https://github.com/trzsz/trzsz-ssh/issues). Welcome to join the QQ group: 318578930.
### Sponsor
[❤️ Sponsor trzsz ❤️](https://github.com/trzsz), buy the author a drink 🍺 ? Thank you for your support!
", Assign "at most 3 tags" to the expected json: {"id":"6624","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"