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 [![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. 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 ![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"