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 openssh client alternative
[![MIT License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://choosealicense.com/licenses/mit/)
[![GitHub Release](https://img.shields.io/github/v/release/trzsz/trzsz-ssh)](https://github.com/trzsz/trzsz-ssh/releases)
[![WebSite](https://img.shields.io/badge/WebSite-https%3A%2F%2Ftrzsz.github.io%2Fssh-blue?style=flat)](https://trzsz.github.io/ssh)
[![中文文档](https://img.shields.io/badge/%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3-https%3A%2F%2Ftrzsz.github.io%2Fcn%2Fssh-blue?style=flat)](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.
## 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` |
| Network | `-4` `-6` `AddressFamily` |
| SSH Proxy | `-J` `-W` `ProxyJump` `ProxyCommand` |
| Multiplexing | `ControlMaster` `ControlPath` `ControlPersist` |
| Command | `RemoteCommand`, `LocalCommand`, `PermitLocalCommand` |
| SSH Agent | `-a` `-A` `ForwardAgent` `IdentityAgent` `SSH_AUTH_SOCK` |
| X11 Forward | `-x` `-X` `-Y` `ForwardX11` `ForwardX11Trusted` `ForwardX11Timeout` |
| Known Hosts | `UserKnownHostsFile` `GlobalKnownHostsFile` `StrictHostKeyChecking` |
| Basic Login | `-l` `-p` `-i` `-F` `HostName` `Port` `User` `IdentityFile` `SendEnv` `SetEnv` |
| Authentication | `PubkeyAuthentication` `PasswordAuthentication` `KbdInteractiveAuthentication` |
| Port Forward | `-g` `-f` `-N` `-L` `-R` `-D` `LocalForward` `RemoteForward` `DynamicForward` `GatewayPorts` `ClearAllForwardings` |
## 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) | [trzsz ( trz / tsz )](README.cn.md#%E6%94%AF%E6%8C%81-trzsz) |
| [zmodem ( rz / sz )](README.en.md#support-zmodem) | [zmodem ( rz / sz )](README.cn.md#%E6%94%AF%E6%8C%81-zmodem) |
| [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) |
| [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) |
| [Other Features](README.en.md#other-features) | [其他功能](README.cn.md#%E5%85%B6%E4%BB%96%E5%8A%9F%E8%83%BD) |
| [UDP Mode](README.en.md#udp-mode) | [UDP 模式](README.cn.md#udp-%E6%A8%A1%E5%BC%8F) |
## Installation
- Install with [scoop](https://scoop.sh/) / [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/) / [choco](https://community.chocolatey.org/) 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](https://brew.sh/) on MacOS
<details><summary><code>brew install trzsz-ssh</code></summary>
```sh
brew update
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](https://github.com/Jguer/yay) on ArchLinux
<details><summary><code>yay -S tssh</code></summary>
```sh
yay -Syu
yay -S tssh
```
</details>
- Install with Go ( Requires go 1.21 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.21 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), unzip and add to `PATH` environment.
## 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
![tssh tiny](https://trzsz.github.io/images/tssh_tiny.gif)
![tssh simple](https://trzsz.github.io/images/tssh_simple.gif)
![tssh table](https://trzsz.github.io/images/tssh_table.gif)
![tssh trzsz](https://trzsz.github.io/images/tssh_trzsz.gif)
![tssh batch](https://trzsz.github.io/images/tssh_batch.gif)
## 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"