# 🚀 SSH for GitHub Actions [GitHub Action](https://github.com/features/actions) for executing remote ssh commands. ![ssh workflow](./images/ssh-workflow.png) [![Actions Status](https://github.com/appleboy/ssh-action/workflows/remote%20ssh%20command/badge.svg)](https://github.com/appleboy/ssh-action/actions) ## Usage Executing remote ssh commands. ```yaml name: remote ssh command on: [push] jobs: build: name: Build runs-on: ubuntu-latest steps: - name: executing remote ssh commands using password uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} script: whoami ``` output: ```sh ======CMD====== whoami ======END====== out: *** ============================================== ✅ Successfully executed commands to all host. ============================================== ``` ## Input variables See [action.yml](./action.yml) for more detailed information. * host - remote host * port - remote port, default is `22` * username - ssh username * password - ssh password * timeout - timeout for ssh to remote host, default is `30s` * command_timeout - timeout for ssh command, default is `10m` * key - content of ssh private key. ex raw content of ~/.ssh/id_rsa * key_path - path of ssh private key * script - execute commands * script_stop - stop script after first failure * envs - pass environment variable to shell script * debug - enable debug mode SSH Proxy Setting: * proxy_host - proxy host * proxy_port - proxy port, default is `22` * proxy_username - proxy username * proxy_password - proxy password * proxy_timeout - timeout for ssh to proxy host, default is `30s` * proxy_key - content of ssh proxy private key. * proxy_key_path - path of ssh proxy private key ### Example Executing remote ssh commands using password. ```yaml - name: executing remote ssh commands using password uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} password: ${{ secrets.PASSWORD }} port: ${{ secrets.PORT }} script: whoami ``` Using private key ```yaml - name: executing remote ssh commands using ssh key uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: whoami ``` Multiple Commands ```yaml - name: multiple command uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: | whoami ls -al ``` ![result](./images/output-result.png) Multiple Hosts ```diff - name: multiple host uses: appleboy/ssh-action@master with: - host: "foo.com" + host: "foo.com,bar.com" username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} script: | whoami ls -al ``` Pass environment variable to shell script ```diff - name: pass environment uses: appleboy/ssh-action@master + env: + FOO: "BAR" with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} + envs: FOO script: | echo "I am $FOO" echo "I am $BAR" ``` Stop script after first failure. ex: missing `abc` folder ```diff - name: stop script if command error uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} + script_stop: true script: | mkdir abc/def ls -al ``` output: ```sh ======CMD====== mkdir abc/def ls -al ======END====== 2019/11/21 01:16:21 Process exited with status 1 err: mkdir: cannot create directory ‘abc/def’: No such file or directory ##[error]Docker run failed with exit code 1 ``` How to connect remote server using `ProxyCommand`? ```bash +--------+ +----------+ +-----------+ | Laptop | <--> | Jumphost | <--> | FooServer | +--------+ +----------+ +-----------+ ``` in your `~/.ssh/config`, you will see the following. ```bash Host Jumphost HostName Jumphost User ubuntu Port 22 IdentityFile ~/.ssh/keys/jump_host.pem Host FooServer HostName FooServer User ubuntu Port 22 ProxyCommand ssh -q -W %h:%p Jumphost ``` How to convert to YAML format of GitHubActions. ```diff - name: ssh proxy command uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ${{ secrets.USERNAME }} key: ${{ secrets.KEY }} port: ${{ secrets.PORT }} + proxy_host: ${{ secrets.PROXY_HOST }} + proxy_username: ${{ secrets.PROXY_USERNAME }} + proxy_key: ${{ secrets.PROXY_KEY }} + proxy_port: ${{ secrets.PROXY_PORT }} script: | mkdir abc/def ls -al ```